最近在使用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é)果如下圖;
這個(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。
所以第一步是把start
進(jìn)行ToInteger
處理:
然后發(fā)現(xiàn)又進(jìn)了一個(gè)ToNumber
處理....
以入?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
處理的。
剩下的你自己分析吧...
傳送門(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
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專(zhuān)業(yè)的國(guó)家
北大青鳥(niǎo)中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過(guò)二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。