理解Array.prototype.slice.call(arguments)是如何工作的?
我直接上例子,我就不翻译了,真是怕翻译错了。
var a={length:2,0:'first',1:'second'};//类数组,有length属性,长度为2,第0个是first,第1个是second console.log(Array.prototype.slice.call(a,0));// ["first", "second"],调用数组的slice(0); var a={length:2,0:'first',1:'second'}; console.log(Array.prototype.slice.call(a,1));//["second"],调用数组的slice(1); var a={0:'first',1:'second'};//去掉length属性,返回一个空数组 console.log(Array.prototype.slice.call(a,0));//[] function test(){ console.log(Array.prototype.slice.call(arguments,0));//["a", "b", "c"],slice(0) console.log(Array.prototype.slice.call(arguments,1));//["b", "c"],slice(1) } test("a","b","c");
arguments本身不是一个数组,可以说是有length属性的一个对象(类数组对象),所以需要将其变通,改造成一个数组。
JS数组用法,参考此链接
stackoverflow:原帖
What happens under the hood is that when .slice()
is called normally, this
is an Array, and then it just iterates the Array, and does its work.
How is this
in the .slice()
function an Array? Because when you do:
object.method();
...the object
automatically becomes the value of this
in the method()
. So with:
[1,2,3].slice()
...the [1,2,3]
Array is set as the value of this
in .slice()
.
But what if you could substitute something else as the this
value? As long as whatever you substitute has a numeric .length
property, and a bunch of properties that are numeric indices, it should work. This type of object is often called an array-like object.
The .call()
and .apply()
methods let you manually set the value of this
in a function. So if we set the value of this
in .slice()
to an array-like object, .slice()
will just assume it's working with an Array, and will do its thing.
Take this plain object as an example.
var my_object ={'0':'zero','1':'one','2':'two','3':'three','4':'four',
length:5};
This is obviously not an Array, but if you can set it as the this
value of .slice()
, then it will just work, because it looks enough like an Array for .slice()
to work properly.
var sliced =Array.prototype.slice.call( my_object,3);
Example: http://jsfiddle.net/wSvkv/
As you can see in the console, the result is what we expect:
['three','four'];
So this is what happens when you set an arguments
object is the this
value of .slice()
. Because arguments
has a .length
property and a bunch of numeric indices, .slice()
just goes about its work as though it was working with an Array.
相关推荐
由于 `arguments` 不是真正的数组,直接调用 `arguments.slice()` 会抛出错误。但是,`Array.prototype.slice.apply(arguments)` 能够成功地创建一个新的数组,这是因为 `slice` 方法被应用于 `arguments` 对象,而...
永远不要写Array.prototype.slice.call(arguments); 以后再! 这是基于但使用Object.defineProperty(arguments.constructor.prototype, [functionName], {enumerable: false, configurable: true, value: [function...
在js中我们经常会看到Array.prototype.slice.call(arguments,0)的写法,当然,这个方法的作用也许大家都明白,那就是把类数组对象转换成一个真正的数组。关于这个方法,我说说自己的理解。 这里涉及到slice()方法和...
通过`Array.prototype.slice.call(arguments, 0)`,我们可以将`arguments`对象转化为真正的数组,从而可以使用数组的所有方法。 例如: ```javascript var slice = Array.prototype.slice; (function() { var ...
这里,`Array.prototype.slice.call` 被用来从 `arguments` 对象中提取一个子集,从索引 2(第三个参数)开始,直到结束。这将创建一个新的数组 `a`,包含参数 3 和 5,然后 `alert` 显示这个新数组。 这种技术在...
`Array.prototype.slice` 是 JavaScript 中一个非常重要的方法,它用于从数组中提取一个部分,并返回一个新的数组,同时原始数组保持不变。这个方法的核心在于它的灵活性和在处理类似数组对象(array-like objects)...
为了解决这个问题,我们可以使用 `call` 或 `apply` 方法,将 `slice` 方法应用于非数组的 `array-like` 对象,如 `arguments` 或 `NodeList`。 在实际应用中,我们有时会面临选择使用 `Array.prototype.slice` ...
var args = Array.prototype.slice.call(arguments); ``` 这行代码将 `arguments` 对象转换为真正的数组,以便可以使用数组特有的方法。 总的来说,了解并熟练运用 `Array.prototype` 的泛型应用可以提高代码的...
在IE8中,可以使用`Array.prototype.slice.call()`转换为可迭代对象,再配合for循环实现。 ```javascript if (!Array.prototype.map) { Array.prototype.map = function(callback, thisArg) { var T, A, k; if ...
在ES5中,我们通常使用`Array.prototype.slice.call()`来实现这个功能,但在ES6中,我们可以直接使用`Array.from()`。例如,一个拥有`length`属性的对象,如`arguments`对象,可以通过`Array.from()`轻松转换。此外...
- **Array.prototype.slice.call()**:这是最常用的转换方法,通过调用Array.prototype.slice方法并传入类数组对象作为上下文。例如: ```javascript var arrayLike = {0: 'a', 1: 'b', 2: 'c', length: 3}; var...
var args = Array.prototype.slice.call(arguments); // ... } ``` 通过理解和熟练运用以上知识点,前端开发者可以在面试中展示自己扎实的JavaScript基础,特别是对数组操作的理解和应用能力。不断学习和实践,...
var args = Array.prototype.slice.call(arguments, 1); return function F() { if (this instanceof F) { return new _this(...args, ...arguments); } return _this.apply(context, args.concat(......
var outerArgs = Array.prototype.slice.call(arguments, 2); return function() { var innerArgs = Array.prototype.slice.call(arguments, 0); callback.apply(context, outerArgs.concat(innerArgs)); }; } ...
`Array.prototype.slice.call(arguments, 1)`用于从`arguments`对象中获取从第二个参数开始的所有参数,并将它们转换成数组,这是因为`arguments`对象并不是一个真正的数组。 #### 4. 关于arguments对象与数组转换 ...
return self.apply(context, args.concat(Array.prototype.slice.call(arguments))); }; }; } ``` 总结起来,`Function.prototype.bind`是JavaScript中用于控制`this`的一个强大工具,它可以确保函数在任何环境...
在JavaScript中,数组可以使用Array构造函数来创建,或使用[]快速创建,这也是首选的方法。数组是继承自Object的原型,... var nodesArr = Array.prototype.slice.call(document.forms); var argsArr = Array.pro
var argsArr = Array.prototype.slice.call(arguments); ``` - 此外,`slice(0)`可用于浅克隆数组: ```javascript var clone = myArray.slice(0); ``` 3. **`Array.prototype.sort` 方法** - `sort`方法...
2. Array.prototype.slice.call():使用数组原型上的slice方法,指定上下文为ArrayLike对象,如`Array.prototype.slice.call(arguments)`。 3. Array构造函数:利用Array构造函数也可以实现转换,如`new Array...