簡體   English   中英

Array.slice和Array()。slice之間的區別

[英]Difference between Array.slice and Array().slice

我正在閱讀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沒有按預期運行? (它返回除了參數列表的第一個元素之外的所有元素)。

不完全的。

觀察調用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

數組只是一個函數,雖然是一個特殊的函數(用於初始化數組)。 Array.slice是對Array原型中slice()函數的引用。 它只能在數組對象上調用,而不能在構造函數(即數組)本身上調用。 數組似乎表現得特別,因為Array()返回一個空數組。 這對於非內置構造函數似乎不起作用(你必須使用new)。 所以

Array().slice.call

是相同的

[].slice.call

由於沒有提供上下文參數,所以對提供的示例中的slice.call()的調用是如何工作的? slice是否實現了它自己的調用方法,從而覆蓋了JavaScript的調用方法? call和apply方法將對象的第一個參數作為指定要應用於調用的上下文(this)對象的參數。

我相信Array是類型而Array()是構造函數。

FireBug亂搞

>>> Array === Array()
false

>>> Array.constructor
Function()

>>> Array().constructor
Array()

好,

查看http://www.devguru.com/Technologies/ecmascript/quickref/slice.html

Array()。slice是數組類中的函數(構造函數),它不能用作數據成員。 如果你不想使用'()',你需要在數組上調用它。 ie - arguments.slice(1)

我的猜測是Array是一個原型,而Array()是一個實際的數組對象。 根據JavaScript解釋,直接調用內置對象類型的原型方法可能有效,也可能不成功。 我不相信規范說它必須工作,只是在實例化的對象上調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM