2009-10-27 90 views
32

我們收到了一家代理機構的JavaScript,但看起來不正確,但有效。圍繞JavaScript變量使用[方括號]

出於某種原因,他們增加[方括號]周圍的變量,即:

var some_variable = 'to=' + [other_variable]; 

這工作,但在方括號似乎完全是多餘的。

這個語法有一個目的,還是技術上不正確,但被瀏覽器忽略?

回答

41

方括號表示新陣列。

var ar=new Array("a","b"); 
var ar=["a","b"]; //Equal to the syntax above 
在這種情況下

沒有區別,如果你用方括號或沒有,因爲如果它是一個數組被轉換成字符串,但如果你刪除括號它需要較少的時間,因爲它沒有建立一個新數組並將其轉換,但它使用簡單的字符串。

+1

因此,在我的檢查中,包含一個元素的新數組正在創建? – 2009-10-27 09:13:26

+1

是的。這意味着有一個數組元素被創建。 – Murvinlai 2009-10-27 09:15:00

+4

是的,然後它被轉換爲字符串 – mck89 2009-10-27 09:15:26

5

可能是這樣..

全球用方括號

的方括號變量的訪問要求有某種對象引用托架左側的。如果試圖將一個值分配給它

["document"] //Array literal, not a Property Accessor! 

- 將會產生一個錯誤,因爲它會被視爲一個陣列文字,如果從中讀取試圖包含字符串的一個元件陣列在括號內返回。全局變量通常僅由其一個標識符引用。這似乎將全局變量排除在使用保存其標識符名稱的字符串或構建或返回其名稱的表達式被引用的可能性之外。但是,javascript全局變量(和全局函數名稱)是全局對象的屬性。任何擁有對全局對象的引用的標識符都可以用於方括號的左側,以形成引用全局變量的屬性訪問器。

在Web瀏覽器中,全局對象是腳本運行的窗口(或框架)。每個窗口(或框架)對象都包含許多屬性,其中至少有兩個是對窗口(全局對象)本身的引用。這些屬性是'窗口'和'自我'。當引用全局變量時,這些屬性名稱可以用作方括號左側的標識符。所以給出的全局變量定義爲: -

var anyName = 0; 
  • 該全局變量可以如參考: -

    窗口[ 「anyName」]

與任何其他使用的方括號表示法中,括號內的字符串可以保存在變量中或由表達式構造/返回。

在全局上下文中執行的代碼,全局函數中的代碼(除了使用new關鍵字調用的Object構造函數除外)以及任何函數外部的內聯代碼也可以使用this關鍵字來引用全局對象。這個關鍵字根據執行上下文引用一個對象。對於在全局上下文中執行的代碼,這是全局對象(在Web瀏覽器上,窗口對象)。因此,上述變量可以被稱爲this [「anyName」],但只能在全局上下文中執行的代碼中使用。

但是,使用this關鍵字很可能會造成混淆,特別是在包含自定義javascript對象的腳本中,這些對象的方法(和構造函數)將使用此對象來引用它們自己的對象實例。

某些javascript實現沒有引用全局對象的全局對象的屬性。與其試圖使用this關鍵字來訪問全局變量,可以創建自己的全局變量來引用全局對象。

var myGlobal = this; 
  • 作爲內聯代碼在腳本開始執行將分配給全局對象的引用(這在該上下文)。從那時起,所有的全局變量都可以用方括號表示來引用: -

    myGlobal [「anyName」];

  • 並且期望myGlobal從任何執行上下文中引用全局對象。

14
b = "bar" + ["foo"] 

這在語法上是正確的,但確實非常,非常,多餘的。這是如何工作的:

["foo"] 

JavaScript邁出的字符串「foo」,並將其與一個元素轉換成一個數組,「富」:

"bar" + ["foo"] 

+被使用,並且的一個在這種情況下,操作數是一個字符串「bar」,JavaScript將第二個字符串轉換爲字符串。由於操作數2是一個數組,因此調用Array.toString方法,默認情況下,該方法返回由逗號連接的所有元素。我們有一個元素,結果將等於此元素,即在此上下文中"foo"等於["foo"]

如果重新定義Array.toString你可以看到更好的是怎麼回事:

alert("bar" + ["foo"]) 
Array.prototype.toString = function() { return "???"; } 
alert("bar" + ["foo"]) 
9

我敢打賭,有人告訴那人:「做字符串連接使用數組,它的速度更快」

含義:

var some_variable = ['to=', other_variable].join(""); 

這顯然是更快許多串連的,但完全不相關的,因爲這些代碼可能會只運行一次呢。 Premature_optimization = sqrt(all_evil)

而這個可憐的傢伙做了那個其他不相干的事情...

我愛人。

9

這是可能的構造物,其中這樣的情況:

var some_variable = 'to=' + other_variable; 

這:

var some_variable = 'to=' + [other_variable]; 

產生不同的結果。具體來說,如果Array.prototype.toString()方法(或者,我想是Array.prototype.join()方法)已從其默認值更改,則可能發生任何情況。例如,額外的功能可以被添加到Array.prototype.toString()方法來生成日誌信息,做一些查找,或者真的。

這樣做的可能性很渺茫,我會想象,但它需要提到的完整性。

28

即使不改變數組原型存在差異:

var other_variable; 
var some_variable = 'to=' + [other_variable]; 

如果other_variable未定義,與陣列的返回值是「爲=」,

沒有陣列的返回值是「 to = undefined'。

4

萬一其他人來到這裏,而試圖找出涉及[方括號]一些奇怪的/新的語法(在別人的JavaScript看到的)有可能會是,就像我是...

如今,在ES6中,我們還在左側使用[]來解構數組,例如

const names = ['Luke', 'Eva', 'Phil']; 
const [first] = names; 
console.log(first); // 'Luke' 
const [first, second] = names; 
console.log(first, second); // 'Luke' 'Eva' 

欲瞭解更多信息,請參閱http://www.deadcoderising.com/2017-03-28-es6-destructuring-an-elegant-way-of-extracting-data-from-arrays-and-objects-in-javascript/或谷歌'es6解構'。