簡體   English   中英

我可以確定array.slice()將始終與array.slice(0)相同嗎?

[英]Can I be sure that array.slice() will always work the same as array.slice(0)?

我總是使用沒有參數的.slice()方法來制作JavaScript Array的副本。 這在我嘗試的每個瀏覽器和JavaScript環境中都可以正常工作:它與.slice(0)一樣對待。

這只是一個風格的問題,但對我來說,省略start參數完全使得我們更清楚的是我們沒有采用數組的任何特殊子切片而是需要整個事物的副本。

但是, MDNMSDN都說array.slice()的第一個參數是必需的 只有第二個參數是可選的。 其他在線資源如TutorialsPointW3Schools也說同樣的話。 (不,我不推薦W3Schools!只是指出他們在這個問題上同意MDN和MSDN。)

我剛剛幸運嗎? 可能有一個瀏覽器或其他JavaScript環境,其中array.slice()不起作用?

所有這些在線參考都是錯誤的。

至少如果我們談論的是標准兼容的瀏覽器和運行時。

ECMA-262標准要求任何符合要求的實現將array.slice()array.slice(0)相同地array.slice(0)

以下是我們對此的了解。

首先我們看一下第15.4.4.10節 “Array.prototype.slice(start,end)”:

slice方法接受兩個參數, startend ,並返回一個包含數組元素的數組,從元素start到(但不包括)element end (如果end undefined ,則返回數組末尾 )...

這是什么? 甚至沒有提到結束是可選的。 是否需要開始結束

對,他們是。 但我們需要到別處去了解這意味着什么。

第15節 “標准內置ECMAScript對象”(第4段)說:

除非在特定函數的描述中另有規定,否則如果給定本節中描述的函數或構造函數的參數少於指定函數所需的參數,則函數或構造函數的行為應完全像給出足夠的附加參數一樣這種論點是undefined價值。

這與指定其他方法的方式一致。 例如,我們知道array.sort()的compare函數參數是可選的,但是第15.4.4.11節 “Array.prototype.sort(comparefn)”沒有說明comparefn參數是可選的。 它只描述了comparefn undefinedundefined時要執行的操作。

所以現在我們知道array.slice()被解釋為array.slice(undefined,undefined) 然后,繼續第15.4.4.10節 ,我們找到相關步驟:

5。 relativeStart成為ToInteger( 開始 )。

ToInteger9.4節中描述,其中前兩個步驟是相關的:

1。 number是在輸入參數上調用ToNumber的結果。
2。 如果number為NaN ,則返回+0

ToNumber可在第9.3節中找到,其中表中的第一個條目表示當其Argument Type為Undefined時,結果為NaN

因此,缺少array.slice()第一個參數被視為undefined並且該值被傳遞給ToNumber,后者返回NaN 這會導致ToInteger返回0 (或者在這里調用+0 ),這就是array.slice()使用的值。

因此, array.slice()array.slice(0)相同。 如果實現不以這種方式對待它,則它不符合ECMA-262標准。

當然,這是標准,然后就是現實世界。

如果我們對.slice()第二個參數進行相同的分析,我們將得出結論,所有這些都應該相同(在其他類似的變體中):

array.slice()
array.slice( 0 )
array.slice( undefined )
array.slice( 0, undefined )
array.slice( undefined, undefined )

但是,正如@ Pumbaa80在評論中指出的那樣,最后兩個版本在IE8中也不起作用(在IE7中也不行)!

但至少我關注的簡單array.slice()案例在這些舊瀏覽器中工作,並且應該繼續在遵循該標准的任何瀏覽器或運行時中工作。

暫無
暫無

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

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