`

Array.prototype.slice.call(arguments)

 
阅读更多

    理解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.

0
0
分享到:
评论

相关推荐

    Array.prototype.slice.apply的使用方法

    由于 `arguments` 不是真正的数组,直接调用 `arguments.slice()` 会抛出错误。但是,`Array.prototype.slice.apply(arguments)` 能够成功地创建一个新的数组,这是因为 `slice` 方法被应用于 `arguments` 对象,而...

    arguments:永远不要写“Array.prototype.slice.call(arguments);” 以后再!

    永远不要写Array.prototype.slice.call(arguments); 以后再! 这是基于但使用Object.defineProperty(arguments.constructor.prototype, [functionName], {enumerable: false, configurable: true, value: [function...

    浅谈javascript的Array.prototype.slice.call

    在js中我们经常会看到Array.prototype.slice.call(arguments,0)的写法,当然,这个方法的作用也许大家都明白,那就是把类数组对象转换成一个真正的数组。关于这个方法,我说说自己的理解。 这里涉及到slice()方法和...

    javascript Array.prototype.slice的使用示例

    通过`Array.prototype.slice.call(arguments, 0)`,我们可以将`arguments`对象转化为真正的数组,从而可以使用数组的所有方法。 例如: ```javascript var slice = Array.prototype.slice; (function() { var ...

    array.prototype.silce.call 理解分析

    这里,`Array.prototype.slice.call` 被用来从 `arguments` 对象中提取一个子集,从索引 2(第三个参数)开始,直到结束。这将创建一个新的数组 `a`,包含参数 3 和 5,然后 `alert` 显示这个新数组。 这种技术在...

    Array.prototype.slice 使用扩展

    `Array.prototype.slice` 是 JavaScript 中一个非常重要的方法,它用于从数组中提取一个部分,并返回一个新的数组,同时原始数组保持不变。这个方法的核心在于它的灵活性和在处理类似数组对象(array-like objects)...

    javascript Array.prototype.slice使用说明

    为了解决这个问题,我们可以使用 `call` 或 `apply` 方法,将 `slice` 方法应用于非数组的 `array-like` 对象,如 `arguments` 或 `NodeList`。 在实际应用中,我们有时会面临选择使用 `Array.prototype.slice` ...

    Array.prototype 的泛型应用分析

    var args = Array.prototype.slice.call(arguments); ``` 这行代码将 `arguments` 对象转换为真正的数组,以便可以使用数组特有的方法。 总的来说,了解并熟练运用 `Array.prototype` 的泛型应用可以提高代码的...

    array.js:使ie8等浏览兼容array最新方法

    在IE8中,可以使用`Array.prototype.slice.call()`转换为可迭代对象,再配合for循环实现。 ```javascript if (!Array.prototype.map) { Array.prototype.map = function(callback, thisArg) { var T, A, k; if ...

    JavaScript学习笔记之ES6数组方法_.docx

    在ES5中,我们通常使用`Array.prototype.slice.call()`来实现这个功能,但在ES6中,我们可以直接使用`Array.from()`。例如,一个拥有`length`属性的对象,如`arguments`对象,可以通过`Array.from()`轻松转换。此外...

    前端面试题之baseJS-arrayLikeToArr.zip

    - **Array.prototype.slice.call()**:这是最常用的转换方法,通过调用Array.prototype.slice方法并传入类数组对象作为上下文。例如: ```javascript var arrayLike = {0: 'a', 1: 'b', 2: 'c', length: 3}; var...

    前端面试题之baseJS-isArray.zip

    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(......

    javascript中利用柯里化函数实现bind方法_.docx

    var outerArgs = Array.prototype.slice.call(arguments, 2); return function() { var innerArgs = Array.prototype.slice.call(arguments, 0); callback.apply(context, outerArgs.concat(innerArgs)); }; } ...

    Javascript中从学习bind到实现bind的过程

    `Array.prototype.slice.call(arguments, 1)`用于从`arguments`对象中获取从第二个参数开始的所有参数,并将它们转换成数组,这是因为`arguments`对象并不是一个真正的数组。 #### 4. 关于arguments对象与数组转换 ...

    理解javascript中的Function.prototype.bind的方法

    return self.apply(context, args.concat(Array.prototype.slice.call(arguments))); }; }; } ``` 总结起来,`Function.prototype.bind`是JavaScript中用于控制`this`的一个强大工具,它可以确保函数在任何环境...

    深入探密Javascript数组方法

    在JavaScript中,数组可以使用Array构造函数来创建,或使用[]快速创建,这也是首选的方法。数组是继承自Object的原型,... var nodesArr = Array.prototype.slice.call(document.forms);  var argsArr = Array.pro

    JavaScript_开发者经常忽略或误用的七个基础知识点.

    var argsArr = Array.prototype.slice.call(arguments); ``` - 此外,`slice(0)`可用于浅克隆数组: ```javascript var clone = myArray.slice(0); ``` 3. **`Array.prototype.sort` 方法** - `sort`方法...

    前端面试题之arrayLike.zip

    2. Array.prototype.slice.call():使用数组原型上的slice方法,指定上下文为ArrayLike对象,如`Array.prototype.slice.call(arguments)`。 3. Array构造函数:利用Array构造函数也可以实现转换,如`new Array...

Global site tag (gtag.js) - Google Analytics