当前位置:  开发笔记 > 编程语言 > 正文

Array.slice和Array().slice之间的区别

如何解决《Array.slice和Array().slice之间的区别》经验,为你挑选了2个好方法。

我正在阅读John Resig的优秀高级JavaScript教程,我不完全理解以下调用之间的区别:(请注意'参数'是内置的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和Array().slice之间的区别.这两者之间究竟有什么区别以及为什么Array.slice.call没有按预期运行?(它返回除了参数列表的第一个元素之外的所有元素).



1> kamens..:

不完全的.

观察调用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原型的slice函数,也没有附加到任何实例化Array实例(例如Array()或[])的slice函数.

Array.slice甚至根本不是null的事实是对象(/ function/constructor)本身的不正确实现. 尝试在IE中运行等效代码,您将收到Array.slice为null的错误.

这就是Array.slice行为不正确的原因(String.substring也没有).

证明(以下是基于slice()的定义永远不会期望的......就像上面的substring()一样):

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



2> ujh..:

数组只是一个函数,虽然是一个特殊的函数(用于初始化数组).Array.slice是对Array原型中slice()函数的引用.它只能在数组对象上调用,而不能在构造函数(即数组)本身上调用.数组似乎表现得特别,因为Array()返回一个空数组.这对于非内置构造函数似乎不起作用(你必须使用new).所以

Array().slice.call

是相同的

[].slice.call

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有