赋值返回的值

IT技术 javascript assignment-operator
2021-03-11 14:42:32

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

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

> var x = 5;
undefined
> y = 5;
5
5个回答

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

让变量声明返回任何undefined没有意义的东西,因为你永远不能var在表达式上下文中使用关键字。

当您想一次将多个变量设置为相同的值时,将赋值设置为expressionnot astatement很有用:

x = y = z = 2;

它也可以这样使用:

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

然而,这不是最易读的代码,最好写成:

y = z;
x = 2*z;
@ user10165 他们本来应该定义更多规则,例如,表达式中的哪个点是可用的变量。它的用例也不多,因为没有它你可以做任何事情。
2021-05-07 14:42:32
如果 Javascript 将变量声明视为表达式(可在其他表达式中使用,等等),会出现什么问题?
2021-05-11 14:42:32

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

该语句的行为在 ECMAScript 语言参考的 12.2 节中描述

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

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

@user10165 这基本上是语言的设计方式,看看如何在一个语句中包含多个声明,我可以想象他们为什么这样做void:)
2021-04-25 14:42:32

赋值运算符(即等号) (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

请注意,现在不仅 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 需要表达式的地方,正如这篇文章的其他答案所显示的那样。

谢谢您的帮助。有时,当我处理 JavaScript 时,关于 Java 工作方式的随机想法会在我的脑海中浮现,我最终不得不将自己的脑袋打倒几次。
2021-04-17 14:42:32
是的,如果我们只有一种语言会简单得多!
2021-04-23 14:42:32
好点子。好吧,我得跑了——我玩~飞dart~我迟到了!!:-)
2021-05-01 14:42:32
是的,我最好调整一下。
2021-05-02 14:42:32
“var 关键字是一个特殊的运算符,可以将语句的返回值写入内存” 那么,如果您没有,var那么语句的返回值不会写入内存?
2021-05-10 14:42:32

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

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

但是x=5expression将 5 分配给 x 的一个。因为没有x,JavaScript 会x在普通代码中隐式地创建一个全局变量

问为什么变量声明加上(可选的)赋值被 Javascript 归类为 astatement而不是a 有意义expression吗?
2021-04-16 14:42:32
另一个 x = 5 是什么?
2021-04-26 14:42:32
这是一个赋值操作。
2021-05-02 14:42:32
我相信x = 5没有其他资格相当于window.x = 5,或者无论全局对象是什么。
2021-05-07 14:42:32

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

赋值运算符不返回任何东西......在下面的例子中,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() {}

谢谢。如果 javascript 控制台不将语句的结果视为undefined(因为该语言中没有任何地方这样说),那么对于新手来说,这可能不会那么令人困惑相反,它应该在一条语句之后不打印任何内容,并在一个表达式之后打印一个表达式的值。
2021-05-01 14:42:32
您必须使用括号,因为赋值运算符按操作顺序排在第 14 位(倒数第二)。arguments.callee.info/2008/11/03/... 然而,说一个表达式返回一个值是完全错误的。表达式求值为一个值。你绝对是 100% 正确的。
2021-05-03 14:42:32
卡洛斯,你可能会喜欢我修改后的答案。我认为这个术语现在是正确的。
2021-05-14 14:42:32