作业返回的值

时间:2013-04-16 01:21:26

标签: javascript assignment-operator

为什么常规赋值语句(比如x = 5)返回赋值的值(在这种情况下为5),而赋值与变量声明(var x = 5)一起返回{ {1}}?

我通过在Chrome浏览器的Javascript控制台中执行这些语句获得了返回值:

undefined

5 个答案:

答案 0 :(得分:31)

这就是语言的设计方式。它与大多数语言一致。

让变量声明返回undefined以外的任何内容都是没有意义的,因为你不能在表达式上下文中使用var关键字。

如果您希望一次将多个变量设置为相同的值,则将分配设为expression而不是statement非常有用:

x = y = z = 2;

它也可以像这样使用:

x = 2*(y = z); // Set y = z, and x = 2*z

然而,这不是最易读的代码,它可能更好地写为:

y = z;
x = 2*z;

答案 1 :(得分:6)

那是因为var x = 5;是变量语句,而不是表达式。

Section 12.2 of the ECMAScript Language Reference中描述了此语句的行为。

  
      
  1. 评估VariableDeclarationList。
  2.   
  3. 返回(正常,空,空)。
  4.   

这基本上是void返回值。

答案 2 :(得分:3)

赋值运算符(即等号)(1)将右侧操作数(即,变量,属性或函数的值或值)赋给左侧操作数(即,然后(2)赋值表达式(例如,y = 10)在评估表达式的其余部分之前变为具有与其右侧操作数(例如,10)相同的值的简单操作数。这类似于在计算表达式时将被调用的函数替换为其返回值的情况(尽管函数调用首先按操作顺序排列,赋值操作是第14行):

var x, y, z = 1;
x = z + (y = 2); // x === 3     

function returnTwo () {
    return 2;
}

x = z + returnTwo(); // x === 3

请注意,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.

var关键字与表达式一起使用称为声明。声明是不评估值的操作,甚至未定义(即使您的控制台打印未定义)。此外,声明不能出现在JavaScript期望表达式的位置,正如此帖的其他答案所示。

答案 3 :(得分:1)

当你写var x = 5;时,它会声明x并将其值初始化为5.

这是VariableStatement,它什么都不返回,

但是x=5是一个expression,它将x分配给5。 因为没有x,JavaScript会在正常代码中隐式创建全局x

答案 4 :(得分:0)

由于评论和其他一些答案,我编辑了我的答案。

赋值运算符不会返回任何内容...在下面的示例中,JS解析器的第一件事就是将y分配给5。第二件事是将y分配给x,依此类推。分配不是return(它不是函数,而在JS中它没有C ++语法来重载运算符的行为)。 return比分配更复杂。 return构造不仅返回一个值,而且关闭当前上下文,导致它被销毁。如果没有其他孩子使用它,它也会关闭任何父上下文(闭包模式)。所以,请不要告诉我(在评论中)赋值运算符返回任何值。 JS中的赋值运算符只是一种语言结构。

这种语言结构在链中很有用(这就是每个人都在讨论返回的原因):

a = x = y = 5;

任何未声明的变量都由全局范围内的解析器自动声明。如果明确声明变量,那么你不能同时在链中使用它,如下所示:

a = var x = y = 5;

正确使用上述代码将是:

var x = y = 5;
a = x;

当然你可以使用括号来使你的代码更清晰,但这并不意味着代码的行为就像一个函数。

此外,您的示例仅适用于JS控制台,它不会返回,而是打印语句或表达式的结果。这意味着JS控制台将变量声明的结果视为undefined(创建函数时相同:function a() {})。