任何人都可以解释为什么代码输出
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中没有转换为字符串。在这种情况下,内存和指针如何工作?
答案 0 :(得分:3)
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
答案 1 :(得分:0)
您面临的是评估顺序,访问顺序以及内存如何存储值。
与其他语言一样,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.
+--------+-----------------+