关于 -[1,] 的疑问

发现js中
-[1,] 的返回值为 -1
以此类推, -[2,]或者+[2,],返回值为 -22
但是如果是 +[1,2] 或者是 -[1,2],则返回值为 NaN
请各位大神解释下这其中的原理

阅读 2.6k
2 个回答

这里面涉及两个问题:一是 JavaScript 数组中 trailing comma 的处理,二是 JavaScript 中数组的类型转换。

关于 trailing comma:

ES5 忽略 trailing comma,认为 [1,] 与 [1] 一样,都表示一个有单一元素的数组(但只实现了 ES3 的JS引擎可能不这么认为)。

// 现代浏览器或 Node.js 环境
[1,].length  // => 1
[1].length  // => 1

ES5 Spec:

11.1.4: Edition 5 clarifies the fact that a trailing comma at the end of an ArrayInitialiser does not add to the length of the array. This is not a semantic change from Edition 3 but some implementations may have previously misinterpreted this.

所以,在实现了 ES5 的 JS 引擎里,[1,] 实际上就是 [1]。

关于数组的类型转换:

基本步骤:
调用内部 toPrimitive 方法 ----> 调用 [[DefaultValue]]方法(以 Number 作为 hint) ----> 调用数组的 valueOf() 方法,然而并未得到原始值 ----> 调用数组的 toString() 方法,得到 String 类型值 ----> 用一元取反运算符(-)或运算符(+)处理,得到 Number 类型值。

-[1] 的处理过程:

-[1]    ------>         -'1'       ---------> -1 

-[1, 2] 的处理过程:

-[1, 2]    ------>         -'1,2'       ---------> -NaN 

-[] 的处理过程:

-[]        -------->       -''          ---------> -0

这是一个看标准就能解决的问题,不过在生产环境中,不要在数组中使用 trailing comma。

我也是看了你的问题,才去查资料。

首先,为什么[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",是字符串。

其实,我也是一知半解,胡乱说的~

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏