发现js中-[1,]
的返回值为 -1
以此类推, -[2,]
或者+[2,]
,返回值为 -2
和2
;
但是如果是 +[1,2]
或者是 -[1,2]
,则返回值为 NaN
请各位大神解释下这其中的原理
发现js中-[1,]
的返回值为 -1
以此类推, -[2,]
或者+[2,]
,返回值为 -2
和2
;
但是如果是 +[1,2]
或者是 -[1,2]
,则返回值为 NaN
请各位大神解释下这其中的原理
我也是看了你的问题,才去查资料。
首先,为什么[1,]返回1呢?其实不然的,这个要区分IE(IE10是否修复未知)和非IE浏览器,IE浏览器返回的是"1,",而非IE返回"1"。[]本来是数组标记,但是当我们把它用在+-操作中,实际上[1,]首先会被执行.toString(),非IE浏览器中,"1,"末尾的","会被省略,省略后又可以作为数值进行运算。所以,在你的题目中,-[1,]返回-1,仅在非IE浏览器中是正确的,而IE浏览器中执行的则是-"1,",即字符串进行运算,返回的是NaN。同样的道理[2,]的结果仍然也区分IE与非IE。
其次,+[1,2]为什么在两种浏览器中都是NaN呢?因为在IE中不管是[1,]还是[1,2],其结果都是带","的字符串,但是在非IE浏览器中,[1,]结果是1,可以作为数值进行运算,而[1,2]结果是"1,2",是字符串。
其实,我也是一知半解,胡乱说的~
9 回答9.4k 阅读
6 回答5.1k 阅读✓ 已解决
5 回答3.7k 阅读✓ 已解决
3 回答10.5k 阅读✓ 已解决
4 回答8k 阅读✓ 已解决
7 回答10.1k 阅读
4 回答7.4k 阅读
这里面涉及两个问题:一是 JavaScript 数组中 trailing comma 的处理,二是 JavaScript 中数组的类型转换。
关于 trailing comma:
ES5 忽略 trailing comma,认为 [1,] 与 [1] 一样,都表示一个有单一元素的数组(但只实现了 ES3 的JS引擎可能不这么认为)。
ES5 Spec:
所以,在实现了 ES5 的 JS 引擎里,[1,] 实际上就是 [1]。
关于数组的类型转换:
基本步骤:
调用内部 toPrimitive 方法 ----> 调用 [[DefaultValue]]方法(以 Number 作为 hint) ----> 调用数组的
valueOf()
方法,然而并未得到原始值 ----> 调用数组的toString()
方法,得到String
类型值 ----> 用一元取反运算符(-)或运算符(+)处理,得到 Number 类型值。-[1] 的处理过程:
-[1, 2] 的处理过程:
-[] 的处理过程:
这是一个看标准就能解决的问题,不过在生产环境中,不要在数组中使用 trailing comma。