转自:http://blog.sebarmeli.com/2010/11/12/understanding-array-prototype-slice-applyarguments/
If you are a JavaScript developer soon or later you’ll bump into this guy: Array.prototype.slice.apply(arguments)
and you’ll ask yourself..what the hell is that??
Well, it’s not that hard to understand actually, it’s just ugly. Anyway, “Array
” is the JS class Array, with “Array.prototype
” you get its prototype. I assume you know about the prototype, the key concept in JavaScript.
“slice
” is a method in JavaScript that “selects a part of an array, and returns the new array.”
(W3CSchool
). It can have two arguments : start_index(required), end_index.
So given:
var a = ["a", "b", "c"];
a.slice(1,2);
It return ["b"], so an array containing the element between index ’1′ and index ’2′ in the Array “a”.
var a = ["a", "b", "c"];
a.slice(1);
It return ["b", "c"], so an array containing the elements between index ’1′ and last index in the a, which is an Array.
So “a” is an Array of course, what about “arguments
” variable?
Ok, arguments, you know, it’s the implicit JS variable created when
you invoke a function, containing the arguments of a function. You’re
expecting this variable to be an Array, right?
Well, it’s not, it’s similar, but it’s still an object, so:
function f () {
return arguments;
}
given this function f, launching
f("1", "2") instanceof Array
you’ll get FALSE! That means we can’t apply a bunch of stuff we normally do with an Array, such as push, pop, slice
..but I need those methods, so what can I do?
There you go Array.prototype.slice.apply(arguments)
converts arguments into an ARRAY.
Here we use one of the methods to call a function in JavaScript, the APPLY
method, you can learn more about how to call a function in JS here
.
So we apply the slice function to the first argument of the apply
function(in this case “arguments”) and we know that the slice() method returns always an Array. We got our Array!
So now
Array.prototype.slice.apply(f("1", "2")) instanceof Array
it’ll return TRUE!
PS: In ECMAScript5
, we won’t need to use “Array.prototype.slice.apply(arguments)” anymore, but we can easily use arguments.slice()
!
分享到:
相关推荐
`Array.prototype.slice.apply` 是 JavaScript 中的一个巧妙技巧,用于将 `arguments` 对象转换为一个真正的数组。在JavaScript中,`arguments` 是一个类数组对象,它包含了函数被调用时传入的所有参数,但并不是...
发现大多人都用了Array.prototype.slice.call(argments,0),一直不明白这句是干什么的。而昨天温习了slice()方法,再参考Function.call(thisArg[, arg1[, arg2[, ...]]]),还是不得而知(我脑筋转得慢:|)。
永远不要写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` 是 JavaScript 中的一个非常重要的技巧,它涉及到原型、函数调用和数组操作等多个核心概念。首先,我们需要分别理解 `Array.prototype.slice` 和 `call` 这两个部分。 `Array....
除了正常用法,slice 经常用来将 array-like 对象转换为 true array. 名词解释:array-like object – 拥有 length 属性的对象,比如 { 0: ‘foo’, length: 1 }, 甚至 { length: ‘bar’ }. 最常见的 array-like ...
js代码-1. 给定一个数组 nums,编写一个函数将所有 3 移动到数组的末尾,同时保持其他...- 不能使用 Array.prototype.splice() 和 Array.prototype.slice() 和 delete - 尽量减少操作次数,争取时间复杂度为 O(n)。
要将这样的对象转换为数组,一种常见的方法是使用`Array.prototype.slice.call()`。这个方法是基于原型链的特性,尝试将对象视为数组来执行切片操作。然而,这种方法并不总是有效,因为它依赖于对象具有`length`属性...
var args = Array.prototype.slice.call(arguments); ``` 这行代码将 `arguments` 对象转换为真正的数组,以便可以使用数组特有的方法。 总的来说,了解并熟练运用 `Array.prototype` 的泛型应用可以提高代码的...
var inArgs = Array.prototype.slice.call(arguments, 0); inArgs.length === 0 ? inArgs[inArgs.length] = window.event : null; var arg = outArgs.concat(inArgs); _this.apply(context, arg); }; } ``` 这...
在ES5中,我们通常使用`Array.prototype.slice.call()`来实现这个功能,但在ES6中,我们可以直接使用`Array.from()`。例如,一个拥有`length`属性的对象,如`arguments`对象,可以通过`Array.from()`轻松转换。此外...
console.log(Array.prototype.slice.apply(y)); ``` 3. **使用 Array.prototype.slice.bind()** - ```javascript console.log(Array.prototype.slice.bind(y)()); ``` 这些方法可以方便地将 DOM 查询结果转换...