最近在使用splice方法的时候,遇到了一个百思不得其解的一个问题?话不多说上代码:
<script>
var arr=[1,2,3,7,8,9,2,6,9,9,8,5,2,3,1];
console.log('原始数据',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('传入空对象',arr);
arr.splice([],1)
console.log('传入空数组',arr);
arr.splice(2.3,1)
console.log('传入小数',arr);
arr.splice(-2.3,1)
console.log('传入负小数',arr);
arr.splice(-2,1)
console.log('传入负整数',arr);
arr.splice(-2,1)
console.log('传入负整数',arr);
</script>
打印出的结果如下图;
这个时候我有点晕了,splice方法第一个参数是指定替换或删除的起始位置,按理是一个索引值,对于非数字型的参数,如果它调用的是number对象的话,undefined转换成数字应该是NaN啊,应该会报错啊,但是打印台还是正常打印出结果
上面的情况都有一个共同点,好像都转换成了数字0了,才有打印台的结果表现
有没有大佬解释一下,我看MDN上面也没有这种情况的说明
显然并不都是把
start
当成0处理的....1.先说MDN上写了的,也就是负整数的情况。
对于
start
,MDN描述为:也就是对于题目中
arr.splice(-2, 1)
的例子,提取之前arr = [9, 8, 2, 1]
,此时start为-2 + 4 = 3,因此行为等价于arr.splice(3, 1),结果2被抽走了,符合描述。2.剩下的都是MDN未描述清楚的,这里要去看ECMA-262规范,这里以最新的规范做说明。
首先找到22.1.3.25 Array.prototype.splice的描述:
关于start的处理在这两步完成,最后起作用的值是actualStart。
所以第一步是把
start
进行ToInteger
处理:然后发现又进了一个
ToNumber
处理....以入参
undefined
为例,首先经过ToNumber
,返回NaN
;然后根据
ToInteger
的第二点,返回+0
;最后根据
Splice
的第四点,返回min(+0, length)
,也就是+0
;因此
undefined
作为start
传入,最后是被当做+0
处理的。剩下的你自己分析吧...