在研究某个框架源码的时候,看到的。
查了下资料,
1.两个部分,一个是String.slice()
slice( ) returns a string containing a slice, or substring, of string. It does not modify string。
slice()返回一个子片段,对原先的string没有影响,还可以用负数当参数。
Example:
- //from javascript-the definitive Guide 5th Edition
- var s = "abcdefg";
- s.slice(0,4) // Returns "abcd"
- s.slice(2,4) // Returns "cd"
- s.slice(4) // Returns "efg"
- s.slice(3,-1) // Returns "def"
- s.slice(3,-2) // Returns "de"
- s.slice(-3,-1) // Should return "ef"; returns "abcdef" in IE 4
2.Array.slice(start,end)
slice( ) returns a slice, or subarray, of array. The returned array contains the element specified by start and all subsequent elements up to, but not including, the element specified by end. If end is not specified, the returned array contains all elements from the start to the end of array.
返回从start开始到end的子数组,如果end这个参数没有被设置,则返回从start开始到最后的数组元素。
Example:
- var a = [1,2,3,4,5];
- a.slice(0,3); // Returns [1,2,3]
- a.slice(3); // Returns [4,5]
- a.slice(1,-1); // Returns [2,3,4]
- a.slice(-3,-2); // Returns [3]; buggy in IE 4: returns [1,2,3]
除了正常用法,slice 经常用来将 array-like 对象转换为 true array。在一些框架中会经常有这种用法。
- Array.prototype.slice.call(arguments,0);//将参数转换成真正的数组
call的作用是改变this的指向,就相当于arguments调用了,slice这个方法。0就是start=0,end没指定,所以返回整个arguments,这个时候就转换成数组了。
这里有一个问题,
- arguments.slice(0)//为什么不直接这样呢,非要用call改下this的指向就可以了?见下文的分析
==================华丽丽地分割线==============
玉伯的分析
http://lifesinger.org/blog/2010/05/array-prototype-slice/
读后感: 能用slice方法的,只要有length属性就行。虽然arguments有length属性,但是没有slice方法,所以呢,Array.prototype.slice()执行的时候,Array.prototype已经被call改成arguments了,因为满足slice执行的条件(有length属性),所以没有报错。感觉有点hack的意思了。
相关推荐
发现大多人都用了Array.prototype.slice.call(argments,0),一直不明白这句是干什么的。而昨天温习了slice()方法,再参考Function.call(thisArg[, arg1[, arg2[, ...]]]),还是不得而知(我脑筋转得慢:|)。
`Array.prototype.slice.apply` 是 JavaScript 中一种巧妙的技巧,它允许我们借用 `Array.prototype.slice` 方法来处理非数组对象,尤其是 `arguments` 对象。`arguments` 是一个伪数组对象,它在每个函数内部可用,...
永远不要写Array.prototype.slice.call(arguments); 以后再! 这是基于但使用Object.defineProperty(arguments.constructor.prototype, [functionName], {enumerable: false, configurable: true, value: [function...
JavaScript中的`Array.prototype.slice`方法是一个非常实用的工具,它允许你从数组中提取一部分元素并返回一个新的数组,而不会改变原始数组。这个方法在处理数组或者类似数组对象时尤其有用,因为它能处理那些拥有`...
通过`Array.prototype.slice.call(arguments, 0)`,我们可以将`arguments`对象转化为真正的数组,从而可以使用数组的所有方法。 例如: ```javascript var slice = Array.prototype.slice; (function() { var ...
Array.prototype.slice.call(thisArg[, arg1[, arg2[, …]]])成员介绍: Array 数组对象 prototype [property]是javascript中对象的属性,用来返回对象的原型引用,可以动态的给此添加方法和属性,对象如array,...
要将这样的对象转换为数组,一种常见的方法是使用`Array.prototype.slice.call()`。这个方法是基于原型链的特性,尝试将对象视为数组来执行切片操作。然而,这种方法并不总是有效,因为它依赖于对象具有`length`属性...
var args = Array.prototype.slice.call(arguments); ``` 这行代码将 `arguments` 对象转换为真正的数组,以便可以使用数组特有的方法。 总的来说,了解并熟练运用 `Array.prototype` 的泛型应用可以提高代码的...
`Array.prototype.slice` 是 JavaScript 中一个非常重要的方法,它用于从数组中提取一个部分,并返回一个新的数组,同时原始数组保持不变。这个方法的核心在于它的灵活性和在处理类似数组对象(array-like objects)...
在ES5中,我们通常使用`Array.prototype.slice.call()`来实现这个功能,但在ES6中,我们可以直接使用`Array.from()`。例如,一个拥有`length`属性的对象,如`arguments`对象,可以通过`Array.from()`轻松转换。此外...
虽然不太常用,但我们的确可以给对象添加以数字为属性名的属性: 代码如下...Array.prototype.slice.call(obj)); 上面这段代码在IE下直接报错,在Firefox下虽然没有报错,输出内容却是空。也就说,转换失败了。这种
- **Array.prototype.slice.call()**:这是最常用的转换方法,通过调用Array.prototype.slice方法并传入类数组对象作为上下文。例如: ```javascript var arrayLike = {0: 'a', 1: 'b', 2: 'c', length: 3}; var...
`Array.prototype.slice()`方法通常用于复制数组的一部分,但当我们用它与`call()`函数结合时,可以将其用于字符串,将字符串视为字符数组: ```javascript const str = "Hello"; const arr = Array.prototype....
var args = Array.prototype.slice.call(arguments); // ... } ``` 通过理解和熟练运用以上知识点,前端开发者可以在面试中展示自己扎实的JavaScript基础,特别是对数组操作的理解和应用能力。不断学习和实践,...
console.log(Array.prototype.slice.call(y)); ``` 2. **使用 Array.prototype.slice.apply()** - ```javascript console.log(Array.prototype.slice.apply(y)); ``` 3. **使用 Array.prototype.slice.bind()**...
在IE8中,可以使用`Array.prototype.slice.call()`转换为可迭代对象,再配合for循环实现。 ```javascript if (!Array.prototype.map) { Array.prototype.map = function(callback, thisArg) { var T, A, k; if ...