代码之家  ›  专栏  ›  技术社区  ›  Richard Ev

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

  •  40
  • Richard Ev  · 技术社区  · 15 年前

    我们从一个看起来不对劲,但却奏效的机构收到了一些javascript。

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

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

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

    这个语法是有目的的,还是在技术上不正确,但被浏览器忽略了?

    7 回复  |  直到 7 年前
        1
  •  43
  •   Richard Ev    12 年前

    方括号表示新数组。

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

    在这种情况下,使用方括号与不使用方括号没有区别,因为如果它是一个数组,则会转换为字符串,但是如果删除方括号,则所需的时间更短,因为它不必构建新数组并转换它,但可以使用简单的字符串。

        2
  •  30
  •   kennebec    12 年前

    即使不改变阵列原型,也有区别:

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

    如果未定义其他_变量,则数组的返回值为“to=”,

    如果没有数组,则返回值为“to=undefined”。

        3
  •  18
  •   Jim Smart    7 年前

    以防万一其他人来到这里,同时试图找出一些奇怪的/新的语法(方括号)(在别人的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解构”。

        4
  •  14
  •   the Tin Man    12 年前
    b = "bar" + ["foo"]
    

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

    ["foo"]
    

    javascript接受字符串“foo”,并将其转换为具有一个元素“foo”的数组:

    "bar" + ["foo"]
    

    什么时候 + 在本例中,javascript将第二个操作数转换为字符串。由于操作数2是一个数组,因此 Array.toString 方法,默认情况下,该方法返回由逗号连接的所有元素。我们有一个元素,结果将等于这个元素,即在这个上下文中 "foo" 相当于 ["foo"] .

    如果你重新定义 数组.toString 你可以看到正在发生的事情:

    alert("bar" + ["foo"])
    Array.prototype.toString = function() { return "???"; }
    alert("bar" + ["foo"])
    
        5
  •  10
  •   Victor    15 年前

    我敢打赌有人告诉那个人:

    • “用数组连接字符串,速度更快!”

    含义:

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

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

    那个可怜的家伙做了另一件无关紧要的事…

    我爱人们。

        6
  •  9
  •   Tim Palak Chaudhary    15 年前

    有可能形成这样一种情况:

    var some_variable = 'to=' + other_variable;
    

    而这:

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

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

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

        7
  •  5
  •   TigerTiger    15 年前

    可能是这个..

    带方括号符号的全局变量访问

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

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

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

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

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

      窗口[“anyname”]

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

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

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

    一些javascript实现没有引用全局对象的全局对象的属性。与其尝试使用this关键字访问全局变量,还不如创建自己的引用全局对象的全局变量。

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

      myglobal[“任意名称”];

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