我正在阅读John Resig出色的Advanced javascript tutorial,但我不能完全理解以下调用之间的区别:(请注意,'arguments‘是一个内置的javascript单词,并不完全是一个数组,因此使用Array.slice而不是简单地调用arguments.slice)
>>> arguments
[3, 1, 2, 3]
>>> Array.slice.call( arguments )
3,1,2,3 0=3 1=1 2=2 3=3
>>> Array.slice.call( arguments, 1 )
[]
>>> Array().slice.call( arguments )
3,1,2,3 0=3 1=1 2=2 3=3
>>> Array().slice.call( arguments, 1 )
1,2,3 0=1 1=2 2=3 基本上,我的误解归结为Array.slice和数组().slice之间的区别。这两者之间的区别到底是什么?为什么Array.slice.call的行为不像预期的那样?(它返回参数列表中除第一个元素之外的所有元素)。
发布于 2008-09-23 14:22:51
不完全是。
注意当你调用String.substring.call("foo",1)和String().substring.call("foo",2)时会发生什么:
>>> String.substring.call("foo", 1)
"1"
>>> String().substring.call("foo", 1)
"oo"Array.slice既没有正确引用附加到数组原型的切片函数,也没有正确引用附加到任何实例化的数组实例(如Array()或[])的切片函数。
Array.slice甚至是非空的事实是对象(/function/constructor)本身的不正确实现。尝试在IE中运行等价的代码,你会得到一个错误,Array.slice is 。
这就是为什么Array.slice不能正确运行(String.substring也不能)的原因。
证明(根据上面...just()这样的切片()的定义,人们永远不会想到下面的内容):
>>> Array.slice.call([1,2], [3,4])
3,4现在,如果您在实例化的对象或Array原型上正确地调用slice(),您将获得预期的结果:
>>> Array.prototype.slice.call([4,5], 1)
[5]
>>> Array().slice.call([4,5], 1)
[5]更多证据..。
>>> Array.prototype.slice == Array().slice
true
>>> Array.slice == Array().slice
false发布于 2008-09-23 13:39:18
Array只是一个函数,尽管它是一个特殊的函数(用于初始化数组)。Array.slice是对数组原型中slice()函数的引用。它只能在数组对象上调用,而不能在构造函数(即数组)本身上调用。array似乎有特殊的行为,因为Array()返回一个空数组。这似乎对非内置构造函数不起作用(在那里你必须使用new)。所以
Array().slice.call等同于
[].slice.call发布于 2009-11-29 04:22:08
既然没有提供上下文参数,那么在所提供的示例中对slice.call()的任何调用是如何工作的?slice是否实现了自己的call方法,从而覆盖了JavaScript的call方法?call和apply方法将一个对象作为第一个参数,以指定要应用于调用的上下文(this)对象。
https://stackoverflow.com/questions/120804
复制相似问题