在JavaScript变量周围使用[方括号]

时间:2009-10-27 09:05:13

标签: javascript syntax

我们收到了一些看起来不对的代理商的JavaScript,但有效。

出于某种原因,他们在变量周围添加[方括号],因此:

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

这样可行,但方括号似乎完全是多余的。

这种语法是否有目的,或者技术上是否正确,但是被浏览器忽略了?

7 个答案:

答案 0 :(得分:44)

方括号表示新数组。

var ar=new Array("a","b");
var ar=["a","b"]; //Equal to the syntax above

在这种情况下,如果你使用方括号是没有区别的,因为如果它是一个数组,它将转换为字符串,但如果你删除括号,它需要更少的时间,因为它不必构建一个新的数组和转换但它适用于简单的字符串。

答案 1 :(得分:31)

即使不更改Array原型,也存在差异:

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

如果未定义other_variable,则数组的返回值为'to =',

如果没有数组,返回值为'to = undefined'。

答案 2 :(得分:25)

以防其他人到达这里,同时试图找出一些涉及[方括号]的奇怪/新语法(在别人的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/或google'es6 destructuring'。

答案 3 :(得分:14)

b = "bar" + ["foo"]

这在语法上是正确的,但确实非常非常多余。这是它的工作原理:

["foo"]

JavaScript接受字符串“foo”并将其转换为包含一个元素“foo”的数组:

"bar" + ["foo"]

当使用+时,其中一个操作数是字符串,在这种情况下为“bar”,JavaScript将第二个转换为字符串。由于操作数2是一个数组,因此调用Array.toString方法,默认情况下,该方法返回由逗号连接的所有元素。我们有一个元素,结果将等于这个元素,即在这种情况下"foo"相当于["foo"]

如果您重新定义Array.toString,您可以更好地了解正在发生的事情:

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

答案 4 :(得分:10)

我打赌有人告诉那个人:

  • “用数组进行字符串连接,它更快!”

含义:

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

对于大量连接而言,这显然更快,但完全不相关,因为该代码可能只运行一次。 Premature_optimization = sqrt(all_evil)

这个可怜的家伙做了其他无关紧要的事情......

我爱人。

答案 5 :(得分:9)

有可能构建一个这样的情况:

var some_variable = 'to=' + other_variable;

和此:

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

产生不同的结果。具体来说,如果Array.prototype.toString()方法(或者,我认为,Array.prototype.join()方法)已从其默认值更改,则可能发生任何事情。例如,可以在Array.prototype.toString()方法中添加额外的功能,以生成日志信息,执行一些查找或其他任何操作。

我想,这样做的可能性很小,但需要提及完整性。

答案 6 :(得分:6)

可能是这个..

使用方括号表示法进行全局变量访问

方括号表示法要求在括号左侧有某种对象引用。

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

- 如果尝试为其赋值,将会产生错误,因为它将被视为数组文字,如果尝试从中读取,则包含括号内的字符串的一个元素数组是回。全局变量通常仅由一个标识符引用。这似乎将全局变量排除在使用保存其标识符名称的字符串或构建或返回其名称的表达式引用的可能性之外。但是,javascript全局变量(以及相关的全局函数名称)是全局对象的属性。任何包含对全局对象的引用的标识符都可以用在方括号的左侧,以形成一个引用全局变量的属性访问器。

在Web浏览器中,全局对象是运行脚本的窗口(或框架)。每个窗口(或框架)对象包含许多属性,其中至少有两个属性是对窗口(全局对象)本身的引用。这些属性是“窗口”和“自我”。在引用全局变量时,这些属性名称可以用作方括号左侧的标识符。所以给定一个全局变量定义为: -

var anyName = 0;
  • 全局变量可以引用为: -

    窗口[ “anyName”]

与方括号表示法的任何其他用法一样,括号内的字符串可以保存在变量中,也可以由表达式构造/返回。

在全局上下文中执行的代码,全局函数中的代码(使用new关键字调用的Object构造函数除外)和任何函数之外的内联代码,也可以使用this关键字来引用全局对象。 this关键字根据执行上下文引用对象。对于在全局上下文中执行的代码,这是全局对象(在Web浏览器上,窗口对象)。因此,上述变量可以称为this [“anyName”],但仅限于在全局上下文中执行的代码。

但是,使用this关键字很可能会造成混淆,尤其是在包含自定义javascript对象的脚本中,这些对象的方法(和构造函数)将使用它来引用自己的对象实例。

某些javascript实现没有引用全局对象的全局对象的属性。不是尝试使用this关键字来访问全局变量,而是可以创建自己的全局变量来引用全局对象。

var myGlobal = this;
  • 作为脚本开头的内联代码执行,将分配对全局对象的引用(在此上下文中)。从那时起,所有全局变量都可以用方括号表示法引用为: -

    myGlobal [ “anyName”];

  • 并期望myGlobal从任何执行上下文引用全局对象。