2009-10-27 81 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解构'。