簡體   English   中英

JavaScript操作順序

[英]JavaScript operation order

在同一指令中實例化兩個變量時:

var foo = 1,
    bar = foo + 1;

在V8中,得出foo == 1bar == 2

var bar = foo + 1,
    foo = 1;

這將產生foo == 1bar == NaN

是否保證已執行操作的順序? 還是分別聲明foobar更安全?

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的評估如下:

  1. 評估VariableDeclarationList
  2. 評估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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM