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

Ric*_*ett 49 javascript syntax

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

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

var some_variable = 'to=' + [other_variable];
Run Code Online (Sandbox Code Playgroud)

这是有效的,但方括号似乎完全是多余的.

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

小智 51

以防万一其他人到达这里,同时试图找出一些涉及[方括号]的奇怪/新语法(在别人的Javascript中看到)可能是,就像我...

如今,使用ES6,我们还在左侧使用[]用于解构数组,例如

const names = ['Luke', 'Eva', 'Phil']; 
const [first] = names;  
console.log(first); // 'Luke' 
const [first, second] = names;  
console.log(first, second); // 'Luke' 'Eva'
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅http://www.deadcoderising.com/2017-03-28-es6-destructuring-an-elegant-way-of-extracting-data-from-arrays-and-objects-in-javascript/或google 'es6 destructuring'.

  • 这可能不是OP问的问题,但它确实回答了我到达这里时的问题。谢谢吉姆·斯马特。 (8认同)
  • 谢谢,出于同样的原因来到这里。 (5认同)
  • 我通过谷歌搜索来到这里,它满足了我的查询,尽管它不是上述问题的答案。谢谢。 (2认同)

mck*_*k89 44

方括号表示新阵列.

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

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

  • 是,然后它被转换为字符串 (4认同)

ken*_*bec 33

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

var other_variable;
var some_variable = 'to=' + [other_variable];
Run Code Online (Sandbox Code Playgroud)

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

没有数组,返回值为'to = undefined'.


use*_*291 15

b = "bar" + ["foo"]
Run Code Online (Sandbox Code Playgroud)

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

["foo"]
Run Code Online (Sandbox Code Playgroud)

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

"bar" + ["foo"]
Run Code Online (Sandbox Code Playgroud)

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

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

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


Vic*_*tor 9

我打赌有人告诉那个人:

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

含义:

var some_variable = ['to=', other_variable].join("");
Run Code Online (Sandbox Code Playgroud)

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

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

我爱人民.


Tim*_*Tim 9

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

var some_variable = 'to=' + other_variable;
Run Code Online (Sandbox Code Playgroud)

还有这个:

var some_variable = 'to=' + [other_variable];
Run Code Online (Sandbox Code Playgroud)

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

我想,实现这一目标的可能性很小,但需要提及它的完整性.


Tig*_*ger 6

可能是这个......

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

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

["document"] //Array literal, not a Property Accessor!
Run Code Online (Sandbox Code Playgroud)

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

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

var anyName = 0;
Run Code Online (Sandbox Code Playgroud)
  • 该全局变量可以引用为: -

    窗口[ "anyName"]

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

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

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

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

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

    myGlobal [ "anyName"];

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