【问题标题】:Confusing comma operator in JavaScript. Why does it work in such manner?JavaScript 中令人困惑的逗号运算符。为什么它以这种方式工作?
【发布时间】:2018-12-28 23:44:46
【问题描述】:

谁能解释为什么输出代码

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 中转换为字符串。在这种情况下,内存和指针如何工作?

【问题讨论】:

  • 当人们不知道逗号运算符时,我通常会看到这个问题。在这种情况下,我不明白什么让你感到困惑,你能详细说明你期望发生的事情吗?
  • 差不多是"1,2"[1,2],然后是"1,2"[1]
  • @archer 不,而是[1, 2]["1,2", 1] 然后"1,2"[1]
  • 问题是为什么数组没有在第一个console.log中转换为字符串。在这种情况下,内存和指针如何工作?

标签: javascript arrays string operator-keyword comma


【解决方案1】:

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

【讨论】:

  • 能不能画个简单的图,里面有内存和指针来解释一下?
  • @tetyana 当然可以,但我认为图表并没有那么容易。
  • 我注意到你编辑了评论,所以我现在知道它是如何工作的。不需要图表。非常感谢!
  • @tetyana 很高兴为您提供帮助 :)
【解决方案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.
          +--------+-----------------+

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 2018-09-02
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多