为什么常规赋值语句(例如x = 5 )返回赋值(在这种情况下为5 ),而赋值与变量声明( var x = 5 )组合返回undefined

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

> var x = 5;
undefined
> y = 5;
5

===============>>#1 票数:34 已采纳

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

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

当您想一次将多个变量设置为相同的值时,将赋值作为expression而不是statement很有用:

x = y = z = 2;

也可以这样使用:

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

但是,这不是最易读的代码,它最好写成:

y = z;
x = 2*z;

===============>>#2 票数:7

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

ECMAScript语言参考的12.2节描述了此语句的行为。

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

这基本上是一个void返回值。

===============>>#3 票数: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需要表达式的地方。

===============>>#4 票数:2

当您写var x = 5; 它声明x并将其值初始化为5。

这是一个VariableStatement ,它什么也不返回,

但是x=5是将5赋给x的expression 由于没有x ,因此JavaScript在普通代码中隐式创建了一个全局x

===============>>#5 票数:0

由于评论和其他一些答案,我修改了答案。

赋值运算符不返回任何内容...在下面的示例中,JS解析器所做的第一件事是将5赋给y。 第二件事是将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() {} )。

  ask by user10165 translate from so

未解决问题?本站智能推荐: