2017-04-10 134 views
0

考慮followng代碼的Javascript變量強制轉換爲字符串,爲什麼?

<!DOCTYPE html> 
<html> 
<head> 
<script> 
    var name = 0; 
     while (name < 6) { 
      console.log('Masha'); 
      name = name + 1; 
      console.log(name); 
     } 

</script> 
</head> 
<body> 

</body> 
</html> 

我希望在Chrome開發者工具的輸出是:

Masha 
name.html:9 1 
name.html:7 Masha 
name.html:9 2 
name.html:7 Masha 
name.html:9 3 
name.html:7 Masha 
name.html:9 4 
name.html:7 Masha 
name.html:9 5 
name.html:7 Masha 
name.html:9 6 

相反,我得到

Masha 
name.html:9 01 
name.html:7 Masha 
name.html:9 011 

爲什麼會出現這種情況?如果我直接複製/粘貼代碼,也會發生這種情況。如果我砍namen的,然後它的工作。如果我改變的變量myName它的工作。爲什麼它被強制爲一個字符串?我正在使用Chrome的Version 57.0.2987.133 (64-bit)。它也發生在Firefox 52.0.2 (64-bits)

這時候我在節點或在Internet Explorer中運行的代碼不會發生。

example output

+0

檢查答案在這裏[鏈接](http://stackoverflow.com/questions/10523701/using-the-variable-name-doesnt-work-with-a-js-object) –

+0

道歉的雙重職位。 –

回答

5

因爲你使用name在瀏覽器全球範圍內。的browers已經有一個內置的name全球(特別是財產window,這是窗口的名稱name),這始終是一個字符串。或者:

  1. 使用不同的名稱,或者更好的

  2. 不要使用全局

這就是爲什麼不使用全局變量的一個很好的例子是一個好主意。 :-)

這裏是#2的例子:

(function() { 
 
    var name = 0; 
 
    while (name < 6) { 
 
     console.log('Masha'); 
 
     name = name + 1; 
 
     console.log(name); 
 
    } 
 
})();

現在name沒有一個全球性的了(你陰影它稱爲name局部變量), 一切都很好。

在這種適當支持ES2015的let *,你也可以使用let,因爲let(和constclass)創建的變量是全局的,但不是全局對象的屬性瀏覽器。你let name陰影,即使在全球範圍內來自屬性的全局:

let name = 0; 
 
while (name < 6) { 
 
    console.log('Masha'); 
 
    name = name + 1; 
 
    console.log(name); 
 
}

但同樣,只是沒有使用全球最好。


*注:某些瀏覽器有let但不正確的ES2015語義,如IE11(它缺少周圍let一些重要的功能在for循環頭聲明,它不給每次循環迭代其自己a,對於在for正文中創建的閉包產生影響),但大多數現代瀏覽器  —當然Chrome,Firefox和Edge   —支持它正確。和IE11的let作品在上面(只是不for循環的情況)的情況也是如此。

相關問題