6

“JavaScript:权威指南,第 6 版”一书在第 4.13.5 节中指出 -

"i=0, j=1, k=2; evaluates to 2"

但是当我显示这样的值时 -

var x = i=0, j=1, k=2; alert(x); 

或者

alert(i=0, j=1, k=2);

显示值0。我进行了实验,无论i设置的值如何,都会显示出来。

书好像错了。谁能解释这本书所说的陈述是什么意思evaluates to 2?这是错的吗?

谢谢!

4

3 回答 3

6

alert( i = 0, j = 1, k = 2 );逗号分隔函数参数。

概括地说,它的工作原理就像书中所说:

alert( ( i = 0, j = 1, k = 2 ) );

请注意,这本书的全部内容是表达式"i = 0, j = 1, k = 2" "evaluates to 2"在许多情况下,您需要将该表达式放在括号内,使其成为一个独立的表达式,就像本书想要的那样。

在变量声明中,逗号再次具有特殊行为。它允许您编写更短的声明,因为您不必重复var

var a; var b; var c;并且var a, b, c;是平等的。var a = 5; var b = 6; var c = 7;和_var a = 5, b = 6, c = 7;

逗号在数组和对象字面量中也有特殊行为:

   var a = [1,2,3] //Creates an array with elements 1, 2 and 3
   var a = [(1,2,3)] //Creates array with one element: 3

   var b = {
       key: value, //Comma is separating the key-value pairs.
       key2: value2
   }
于 2013-03-07T09:14:40.433 回答
4

这是关于 javascript 语句的优先级,它=在评估另一个语句之前完成所有操作,该语句用您放置的逗号表示。

尝试var x = (i=0, j=1, k=2);,你会得到你想要的。

编辑

使用您的代码行var x = i=0, j=1, k=2;,它实际上解释为三个语句:

  1. var x=i=0
  2. var j=1
  3. var k=2

预期会alert(x);产生 a 0

请注意,逗号运算符在语句中的执行优先级相对较低,因此在大多数情况下它确实共享前面的关键字,只有少数例外(例如var(最低优先级关键字之一))将变量保持在当前范围内。

于 2013-03-07T09:15:32.187 回答
1

这里的逗号仅仅意味着你传递了 3 个参数而不是一个,所以 alert 优雅地忽略了其他两个,它不会评估任何东西。采用

alert((i=0, j=1, k=2));

var x = (i=0, j=1, k=2); alert(x);
于 2013-03-07T09:17:12.633 回答