[英]JavaScript operation order
在同一指令中實例化兩個變量時:
var foo = 1,
bar = foo + 1;
在V8中,得出foo == 1
和bar == 2
,
var bar = foo + 1,
foo = 1;
這將產生foo == 1
和bar == NaN
。
是否保證已執行操作的順序? 還是分別聲明foo
和bar
更安全?
var foo = 1;
var bar = foo + 1;
甚至
var foo, bar;
foo = 1;
bar = foo + 1;
正如您已經正確指出的那樣,變量聲明表達式將從左到右求值。 首先將評估賦值的左側,然后將評估賦值表達式的右側,然后賦值。
在第二種情況下,由於起重可變 ,您得到了NaN
。 當JavaScript看到
bar = foo + 1,
它會知道foo
是在當前上下文中定義的,但尚未分配值。 因此,默認情況下,它對foo
使用undefined
。
console.log(undefined + 1);
# NaN
這就是為什么將NaN
分配給bar
。
根據ECMA 5.1標准文檔的“ Variable Statement
部分 ,將像這樣評估變量聲明
VariableStatement:
var VariableDeclarationList ;
VariableDeclarationList :
VariableDeclaration
VariableDeclarationList , VariableDeclaration*
在這里,將像這樣評估生產
生產的VariableDeclarationList:VariableDeclarationList,VariableDeclaration的評估如下:
- 評估VariableDeclarationList 。
- 評估VariableDeclaration 。
因此,應該首先評估最左邊的賦值表達式,最后只評估最右邊的賦值表達式。 因此,您看到的行為是預期的行為。
在同一指令中聲明和初始化變量時,javascript會按照您期望的順序執行操作。
例如,
var foo = 1,
bar = foo + 1;
是完全有效的,絕不會產生錯誤。 另一方面
var bar = foo + 1,
foo = 1;
就像您所說的那樣,將產生bar === NaN
,因為發生的第一件事是bar將被初始化為foo + 1
,其中foo
在技術上是undefined
。
tl; dr是。
和...之間的不同
// Case 1 var foo = 1, bar = foo + 1;
和
Case 2 var bar = foo + 1, foo = 1;
是在第一種情況下,foo已被定義為1,因此您的操作是1 + 1。在第二種情況下,當您定義bar時,foo仍未定義。 雖然已經聲明了。
在JS中,所有聲明都將在程序運行之前進行。 因此,即使您所有的var語句都位於代碼的底部,它也可以工作。 參見此處: https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/var#var_hoisting
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.