use*_*165 40 javascript assignment-operator
为什么常规赋值语句(比方说 x = 5)返回赋值的值(5在本例中),而赋值与变量declaration(var x = 5)一起返回undefined?
我通过在Chrome浏览器的Javascript控制台中执行这些语句获得了返回值:
> var x = 5;
undefined
> y = 5;
5
Run Code Online (Sandbox Code Playgroud)
Pau*_*aul 34
这就是语言的设计方式.它与大多数语言一致.
让变量声明返回除了undefined没有意义之外的任何东西,因为你不能var在表达式上下文中使用关键字.
如果要将多个变量一次设置为相同的值,则赋值expression不是a statement非常有用:
x = y = z = 2;
Run Code Online (Sandbox Code Playgroud)
它也可以像这样使用:
x = 2*(y = z); // Set y = z, and x = 2*z
Run Code Online (Sandbox Code Playgroud)
然而,这不是最可读的代码,它可能会更好地编写为:
y = z;
x = 2*z;
Run Code Online (Sandbox Code Playgroud)
那是因为var x = 5;是一个变量语句,而不是表达式.
ECMAScript语言参考的第12.2节描述了该语句的行为.
- 评估VariableDeclarationList.
- 返回(正常,空,空).
这基本上是一个void返回值.
赋值运算符(即等号)(1) 将右侧操作数(即变量、属性或函数的值或值)分配给左侧操作数(即变量或属性) ),然后 (2) 在计算表达式的其余部分之前,赋值表达式(例如,y = 10)将成为一个简单操作数,其值与其右侧操作数(例如,10)相同。这类似于在计算表达式时将被调用函数替换为其返回值(尽管函数调用按操作顺序排在第一位,赋值操作排在第十四位):
var x, y, z = 1;
x = z + (y = 2); // x === 3
function returnTwo () {
return 2;
}
x = z + returnTwo(); // x === 3
Run Code Online (Sandbox Code Playgroud)
请注意,x 现在不仅等于 3,而且整个表达式的计算结果均为 3。
关键字的目的var是将变量绑定到当前作用域。使用关键字声明的变量var绑定到声明它们的范围。该var关键字将最左边的变量(或属性)分配为对计算表达式的值的引用:
var fun = function () {
var x = 1;
var y = x + 1;
return y;
}
// The x and y variables are bound to the scope of the fun function.
Run Code Online (Sandbox Code Playgroud)
将var关键字与表达式一起使用称为声明。声明是不评估值的操作,甚至不是未定义的(即使您的控制台打印未定义)。此外,声明不能出现在 JavaScript 需要表达式的地方,正如本文的其他答案所示。