splice 参数问题
splice 在 ie 与 firefox,chrome之间表现不太一致,希望大家以后也小心一点,今天遇到记录一下:
?
[1,2,3].splice(1)
?
ie下运行后变为 [1,2,3] ,相当于
?
[1,2,3].splice(1,0)
?
firefox ,chrome运行后变为 [1],相当于
?
[1,2,3].splice(1,[1,2,3].length-1)
?
这就涉及到了 splice第二个参数的默认值问题,看看 ECMA-262-5th 规范
Array.prototype.splice (start, deleteCount [ , item1 [ , item2 [ , … ] ] ] )
The length property of the splice method is 2.
证明 splice 函数申明有两个形参 start 与 deleteCount ,当调用者忽略deleteCount则deleteCount为undefined,那么看一下具体对于deleteCount的处理:
Let actualDeleteCount be min(max(ToInteger(deleteCount),0), len – actualStart).
而 ToInteger又依赖调用了 ToNumber
1.Let number be the result of calling ToNumber on the input argument.
2.If number is NaN, return +0.
3.If number is +0, ?0, +∞, or ?∞, return number.
4.Return the result of computing sign(number) * floor(abs(number)).
最后 ToNumber则规定 当遇到Undefined时返回NaN,那么ToInteger返回0,那么最后 actualDeleteCount为 0
则 IE表现为符合标准的正确行为,不知道为何 firefox,chrome没有遵从标准.
ps:在 OReilly.JavaScript.The.Definitive.Guide.5th.Edition 中支持firefox,chrome的做法:
array.splice(start, deleteCount, value, ...)
deleteCount
The number of elements, starting with and including start, to be deleted from array. This argument is optional; if not specified, splice( ) deletes all elements from start to the end of the array.
不解
?
?
?
?
?
?
?
?
?
1 楼 feipigzi 2012-08-06 w3c 标准 :如果删除数量不指定,则默认删除开始位置后面的所有元素