JavaScript中令人困惑的逗号运算符.为什么它会以这种方式工作



有人能解释为什么代码的输出

var a = [1,2];
console.log("Array item: " + a[a=a.toString(), 1]);
console.log("String char: " + a[1]);

看起来像这样?

Array item: 2                                                                   
String char: , 

问题是为什么数组在第一个console.log中没有转换为字符串。在这种情况下,内存和指针是如何工作的?

a[a = a.toString(), 1]首先对指向数组的a求值,然后用不会影响已求值部分的字符串化a替换a,然后访问数组的索引1。与相同

var b = a;
a.toString();
b[1]

现在a[1]计算为,,因为a现在指向字符串,因此它获得第二个字符。

以下是解析器如何看待它:

a[a = a.toString(), 1]
// Evaluation of a
[1, 2][a = a.toString(), 1]
// Evaluation of the comma operator, a is turned into a string
[1, 2][1]
// Prop access
2

您面临的是评估顺序、访问顺序以及内存如何存储值。

Javascript和其他语言一样,从右到左计算。尽管逗号运算符计算内存中的第一个a=a.toString(),但a等于[1,2],因为在修改变量a之前,最右边的值将首先计算,因此a[1] = 2

访问之后,变量a等于"1,2"a[1] = ,,在内存中,String就像一个字符数组,可以使用索引进行访问。

访问就是这样发生的:

+------------+-------------+
| Var a      | Access      |
+------------+-------------+
+--|    [1,2]   | a[1] -> 2   |-+---> This is the first access.
Memory |  +--------+-----------------+ |<--- Here the first value no longer exists and now a = String.
+--|    "1,2"   | a[1] -> "," |-+---> This is the second access.
+--------+-----------------+

相关内容

  • 没有找到相关文章

最新更新