发现js中-[1,] 的返回值为 -1 以此类推, -[2,]或者+[2,],返回值为 -2和2; 但是如果是 +[1,2] 或者是 -[1,2],则返回值为 NaN 请各位大神解释下这其中的原理
-[1,]
-1
-[2,]
+[2,]
-2
2
+[1,2]
-[1,2]
NaN
认证高级PHP讲师
这里面涉及两个问题:一是 JavaScript 数组中 trailing comma 的处理,二是 JavaScript 中数组的类型转换。
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 类型值。
valueOf()
toString()
String
-[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",是字符串。
其实,我也是一知半解,胡乱说的~
这里面涉及两个问题:一是 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。
我也是看了你的问题,才去查资料。
首先,为什么[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",是字符串。
其实,我也是一知半解,胡乱说的~