鍍金池/ 問(wèn)答/數(shù)據(jù)分析&挖掘  HTML/ JavaScript數(shù)組的splice()方法的參數(shù)問(wèn)題

JavaScript數(shù)組的splice()方法的參數(shù)問(wèn)題

最近在使用splice方法的時(shí)候,遇到了一個(gè)百思不得其解的一個(gè)問(wèn)題?話(huà)不多說(shuō)上代碼:
<script>

    var arr=[1,2,3,7,8,9,2,6,9,9,8,5,2,3,1];
    console.log('原始數(shù)據(jù)',arr);

    arr.splice(undefined,1)
    console.log('傳入undefined',arr);

    arr.splice(null,1)
    console.log('傳入null',arr);

    arr.splice(NaN,1)
    console.log('傳入NaN',arr);

    arr.splice(true,1)
    console.log('傳入true',arr);

    arr.splice(false,1)
    console.log('傳入false',arr);

    arr.splice(" ",1)
    console.log('傳入空格字符串',arr);

    arr.splice('',1)
    console.log('傳入空字符串',arr);

    arr.splice(new Object(),1)
    console.log('傳入空對(duì)象',arr);

    arr.splice([],1)
    console.log('傳入空數(shù)組',arr);

    arr.splice(2.3,1)
    console.log('傳入小數(shù)',arr);        

    arr.splice(-2.3,1)
    console.log('傳入負(fù)小數(shù)',arr);

    arr.splice(-2,1)
    console.log('傳入負(fù)整數(shù)',arr);        

    arr.splice(-2,1)
    console.log('傳入負(fù)整數(shù)',arr);
</script>

打印出的結(jié)果如下圖;

clipboard.png
這個(gè)時(shí)候我有點(diǎn)暈了,splice方法第一個(gè)參數(shù)是指定替換或刪除的起始位置,按理是一個(gè)索引值,對(duì)于非數(shù)字型的參數(shù),如果它調(diào)用的是number對(duì)象的話(huà),undefined轉(zhuǎn)換成數(shù)字應(yīng)該是NaN啊,應(yīng)該會(huì)報(bào)錯(cuò)啊,但是打印臺(tái)還是正常打印出結(jié)果

上面的情況都有一個(gè)共同點(diǎn),好像都轉(zhuǎn)換成了數(shù)字0了,才有打印臺(tái)的結(jié)果表現(xiàn)
有沒(méi)有大佬解釋一下,我看MDN上面也沒(méi)有這種情況的說(shuō)明

回答
編輯回答
陌離殤
上面的情況都有一個(gè)共同點(diǎn),好像都轉(zhuǎn)換成了數(shù)字0了,才有打印臺(tái)的結(jié)果表現(xiàn)

顯然并不都是把start當(dāng)成0處理的....

1.先說(shuō)MDN上寫(xiě)了的,也就是負(fù)整數(shù)的情況。

對(duì)于start,MDN描述為:

...如果該參數(shù)為負(fù)數(shù),則表示從原數(shù)組中的倒數(shù)第幾個(gè)元素開(kāi)始提取,slice(-2)表示提取原數(shù)組中的倒數(shù)第二個(gè)元素到最后一個(gè)元素(包含最后一個(gè)元素)。

也就是對(duì)于題目中arr.splice(-2, 1)的例子,提取之前arr = [9, 8, 2, 1],此時(shí)start為-2 + 4 = 3,因此行為等價(jià)于arr.splice(3, 1),結(jié)果2被抽走了,符合描述。

2.剩下的都是MDN未描述清楚的,這里要去看ECMA-262規(guī)范,這里以最新的規(guī)范做說(shuō)明。

首先找到22.1.3.25 Array.prototype.splice的描述:

關(guān)于start的處理在這兩步完成,最后起作用的值是actualStart。

clipboard.png

所以第一步是把start進(jìn)行ToInteger處理:

clipboard.png

然后發(fā)現(xiàn)又進(jìn)了一個(gè)ToNumber處理....

clipboard.png

以入?yún)?code>undefined為例,首先經(jīng)過(guò)ToNumber,返回NaN;

然后根據(jù)ToInteger的第二點(diǎn),返回+0;

最后根據(jù)Splice的第四點(diǎn),返回min(+0, length),也就是+0;

因此undefined作為start傳入,最后是被當(dāng)做+0處理的。

剩下的你自己分析吧...

2018年2月4日 15:38
編輯回答
無(wú)標(biāo)題

數(shù)值為NaN就相當(dāng)于是0

clipboard.png

負(fù)數(shù)從后面開(kāi)始計(jì)數(shù)

clipboard.png

小數(shù)是直接舍棄小數(shù)部分

你這個(gè)之所以迷惑,主要是樣本數(shù)據(jù)前后有點(diǎn)協(xié)同,不好區(qū)分

2018年6月27日 01:15
編輯回答
情已空

傳送門(mén):Array.prototype.splice

你的問(wèn)題標(biāo)準(zhǔn)的這兩步都說(shuō)明好啦:
為了方便對(duì)應(yīng)加了前綴ABCDEFG,可以對(duì)應(yīng)起來(lái)。

A、Let relativeStart be ? ToInteger(start).
B、If relativeStart < 0, let actualStart be max((len + relativeStart), 0); else let actualStart be min(relativeStart, len).

深入看看ToInteger內(nèi)部方法。

C、Let number be ? ToNumber(argument).
D、If number is NaN, return +0.
E、If number is +0, -0, +∞, or -∞, return number.
F、Return the number value that is the same sign as number and whose magnitude is floor(abs(number)).

再進(jìn)一步看看ToNumber內(nèi)部方法,大致寫(xiě)寫(xiě)了。

FLAG 類(lèi)型 結(jié)果
G Undefined NaN
H Null +0
I Boolean true---1 false---0
J String 有效數(shù)字轉(zhuǎn)化為相應(yīng)數(shù)字類(lèi)型??兆址D(zhuǎn)化為0。有效數(shù)字轉(zhuǎn)化為NaN
K Object 先 ToPrimitive(argument, hint Number) ,所得結(jié)果再toNumber

回到你的問(wèn)題。
undefined:對(duì)應(yīng) C(G)、D。轉(zhuǎn)化為 0
null:對(duì)應(yīng) C(H)、E。轉(zhuǎn)化為 0
NaN:對(duì)應(yīng) D。轉(zhuǎn)化為 0
true:對(duì)應(yīng) C(I)。轉(zhuǎn)化為 1
false:對(duì)應(yīng) C(I)。轉(zhuǎn)化為 0
" ":對(duì)應(yīng) C(J)、D。轉(zhuǎn)化為 0
''::對(duì)應(yīng) C(J)、D。轉(zhuǎn)化為 0
new Object():對(duì)應(yīng) C(K)、D。轉(zhuǎn)化為 0
[]:對(duì)應(yīng) C(K)、D。轉(zhuǎn)化為 0
2.3:對(duì)應(yīng) F。轉(zhuǎn)化為 2
-2.3:對(duì)應(yīng) F、B。轉(zhuǎn)化為 5-2=3
-2:對(duì)應(yīng) B。轉(zhuǎn)化為 4-2=2

2017年11月20日 04:09
編輯回答
萢萢糖

第一個(gè)參數(shù)進(jìn)來(lái)后會(huì)做

  1. 如果是布爾型,true當(dāng)做1,false當(dāng)做0
  2. 其余情況使用parseInt處理,如果得到NaN一律當(dāng)成0處理。否則就用轉(zhuǎn)換后的數(shù)值。
2017年4月11日 05:38
編輯回答
孤客
echo 1212
2018年7月6日 13:15