Javascript 赋值返回的值
为什么常规赋值语句(例如,Javascript 赋值返回的值,javascript,assignment-operator,Javascript,Assignment Operator,为什么常规赋值语句(例如,x=5)返回赋值(5,在本例中),而赋值与变量声明(var x=5)组合返回未定义的 我通过在Chrome浏览器的Javascript控制台中执行以下语句获得返回值: > var x = 5; undefined > y = 5; 5 当您写入var x=5时它声明x并将其值初始化为5 这是一个可变语句,它不返回任何内容 但是x=5是一个表达式,它将5赋值给x。 由于没有x,JavaScript隐式地在普通代码中创建一个全局x,这就是语言的设计方式。它与大
x=5
)返回赋值(5
,在本例中),而赋值与变量声明(var x=5
)组合返回未定义的
我通过在Chrome浏览器的Javascript控制台中执行以下语句获得返回值:
> var x = 5;
undefined
> y = 5;
5
当您写入var x=5时
它声明x
并将其值初始化为5
这是一个可变语句
,它不返回任何内容
但是x=5
是一个表达式,它将5赋值给x。
由于没有x
,JavaScript隐式地在普通代码中创建一个全局x
,这就是语言的设计方式。它与大多数语言一致
让变量声明返回除undefined
之外的任何内容都是毫无意义的,因为您永远不能在表达式上下文中使用var
关键字
当您希望同时将多个变量设置为相同的值时,将赋值设置为表达式
而不是语句
非常有用:
x = y = z = 2;
它也可以这样使用:
x = 2*(y = z); // Set y = z, and x = 2*z
a = var x = y = 5;
但是,这不是最可读的代码,最好编写为:
y = z;
x = 2*z;
我编辑了我的答案,因为有评论和其他一些答案
赋值运算符不返回任何内容。。。在下面的示例中,JS解析器做的第一件事是将5赋值给y。第二件事是将y赋值给x,依此类推。赋值不是<代码>返回<代码>(它不是函数,在JS中它没有C++语法来重载运算符的行为)。代码>返回
比赋值更复杂return
construct不仅返回一个值,而且关闭当前上下文导致它被销毁。此外,如果没有其他子级使用它,它将关闭任何父上下文(闭包模式)。所以,请不要(在注释中)告诉我赋值运算符返回任何值。JS中的赋值运算符只是一种语言构造
这种语言结构在链中很有用(这就是为什么每个人都在谈论返回):
任何未声明的变量都由全局范围内的解析器自动声明。如果显式声明变量,则不能同时在链中使用它,如下所示:
x = 2*(y = z); // Set y = z, and x = 2*z
a = var x = y = 5;
正确使用上述代码应为:
var x = y = 5;
a = x;
当然,为了使代码更清晰,可以使用括号,但这并不意味着代码的行为类似于函数
另外,您的示例仅在JS控制台中工作,它不返回而是打印语句或表达式的结果。这意味着JS控制台将变量声明的结果视为未定义的
(创建函数时相同:函数a(){}
)。这是因为变量x=5代码>是一个变量语句,而不是表达式
中描述了此语句的行为
计算VariableDeclarationList
返回(正常、空、空)
这基本上是一个返回值。赋值运算符(即等号)(1)将右侧操作数(即变量、属性或函数的值)赋值给左侧操作数(即变量或属性),然后(2)赋值表达式(例如y=10)在对表达式的其余部分求值之前,变为一个简单操作数,其值与其右侧操作数(例如10)相同。这类似于在计算表达式时用其返回值替换被调用函数(尽管函数调用按操作顺序排在第一位,赋值操作排在第十四位):
请注意,现在不仅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需要表达式的地方,正如本文的其他答案所示。可能的重复。看看kangax的答案。“var x=1
在当前范围内声明变量x
(也称为执行上下文)另一方面,…x=1
,只是一个属性赋值。它首先尝试根据作用域链解析x
。如果它在该作用域链中的任何位置找到它,则执行赋值;如果它没有找到x
,则只在全局对象上创建x
属性。这很有趣。。我从来没有注意到这一点!我认为x=5
是一个能够返回值的表达式,而var x=5
是一个不能返回值的语句。这一点最明显的是,您不能内联声明变量,即console.log(var x=5)
。你从哪里得到undefined
的返回值?是什么样的例子让你认为x=5实际上“返回”?@AbbyChauYuHoi我也不同意return
关键字,但我的答案出于某种原因被否决了。我不明白这些人…另一个x=5是什么?这是一个赋值操作。我相信没有其他限定条件的x=5
等同于window.x=5
,或者不管全局对象是什么。问为什么变量声明加上一个(可选)有意义吗Javascript将赋值分类为语句
,而不是表达式
?如果Javascript将变量声明视为表达式(可在其他表达式中使用等),会有什么中断?@user10165