我正在阅读“学习节点”一书,我陷入了一个非常简单的问题,一个我没有考虑太多的问题:javascript 中的赋值。
作者指出,我们应该意识到,通过使用 Node 的 REPL,以下内容将返回 undefined:
var a = 2
(undefined)
而下面的代码将在 REPL 中返回“2”:
a = 2
2
这是为什么?上面的代码不是属性吗?怎么来的?如果 var 'a' 直到代码中的那个点才存在,为什么它不存在和归属?
我正在阅读“学习节点”一书,我陷入了一个非常简单的问题,一个我没有考虑太多的问题:javascript 中的赋值。
作者指出,我们应该意识到,通过使用 Node 的 REPL,以下内容将返回 undefined:
var a = 2
(undefined)
而下面的代码将在 REPL 中返回“2”:
a = 2
2
这是为什么?上面的代码不是属性吗?怎么来的?如果 var 'a' 直到代码中的那个点才存在,为什么它不存在和归属?
根据ECMA-262 § 12.2,VariableStatement(即var identifier=value
)显式地不返回任何内容。此外,VariableStatement是一个语句;语句不返回值,并且将语句放在表达式所在的位置是无效的。
例如,以下所有内容都没有任何意义,因为它们将 Statement 放在您需要产生价值的表达式的地方:
var a = var b;
function fn() { return var x; }
根据§ 11.13.1,对变量 ( ) 的赋值identifier=value
返回分配的值。
当您编写var a = 1;
时,它会声明a
并将其值初始化为1
. 因为这是一个VariableStatement,所以它什么都不返回,并且 REPL 打印undefined
。
a=1
是一个赋值1
给的表达式a
。由于没有a
,JavaScript 会在普通代码中隐式创建一个全局 a
变量(但会在严格模式下抛出 a ReferenceError
,因为您不允许在严格模式下隐式创建新的全局变量)。
不管之前是否a
存在,表达式仍然返回分配的值,,1
所以 REPL 打印出来。
Just guessing here - this could probably be verified by referring to the ECMAScript 5th Edition spec (but man that thing is a pain) - it probably has to do with the specification of the "var" statement vs assigning attributes to the "global" object.
When you declare a variable and assign a value to it (var a=2
) the returned value is likely "undefined" because that's what the spec says the "var" statement should return.
When you assign a variable to a symbol without using the "var" statement you are actually assigning a value to an attribute of the global object of that name. That is, a=2
is the same as saying window.a=2
and we know that assinging a value to an attribute returns the value assigned.
var a = 2
is a statement. Thus it has no value.
您正在评估一份声明清单。在评估语句列表时,返回最后一个产生值的语句的值。http://ecma-international.org/ecma-262/5.1/#sec-12.1 - 请注意本节末尾的示例。如果列表中没有任何语句返回值,则不会返回任何内容(这是undefined
在 JavaScript 中)。
变量语句,不返回值。http://ecma-international.org/ecma-262/5.1/#sec-12.2
赋值运算符确实返回一个值(以及执行赋值)。http://ecma-international.org/ecma-262/5.1/#sec-11.13.1