Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 表达式周围的方括号是什么意思,例如'var x=a+;[b] ”“是吗?_Javascript_Arrays_Syntax - Fatal编程技术网

Javascript 表达式周围的方括号是什么意思,例如'var x=a+;[b] ”“是吗?

Javascript 表达式周围的方括号是什么意思,例如'var x=a+;[b] ”“是吗?,javascript,arrays,syntax,Javascript,Arrays,Syntax,我们从一家机构收到了一些JavaScript,这些JavaScript看起来是错误的,但可以正常工作 出于某种原因,他们在变量周围添加方括号([,]),如下所示: var some_variable = 'to=' + [other_variable]; 这是可行的,但方括号似乎完全多余 使用此语法的目的是什么,还是技术上不正确,但被浏览器忽略?方括号表示新数组 var ar=new Array("a","b"); var ar=["a","b"]; //Equal to the syntax

我们从一家机构收到了一些JavaScript,这些JavaScript看起来是错误的,但可以正常工作

出于某种原因,他们在变量周围添加方括号(
[
]
),如下所示:

var some_variable = 'to=' + [other_variable];
这是可行的,但方括号似乎完全多余


使用此语法的目的是什么,还是技术上不正确,但被浏览器忽略?

方括号表示新数组

var ar=new Array("a","b");
var ar=["a","b"]; //Equal to the syntax above
在这种情况下,使用方括号与不使用方括号没有区别,因为如果它是数组,它将被转换为字符串;但是如果删除方括号,它所花费的时间会更少,因为它不必构建新数组并将其转换,但它可以使用简单的字符串。

可能是这样

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

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

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

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

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

    窗口[“任意名称”]

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

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

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

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

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

    myGlobal[“anyName”]

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

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

["foo"]
JavaScript获取字符串“foo”并将其转换为包含一个元素“foo”的数组:

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

如果重新定义
Array.toString
,您可以更好地看到发生了什么:

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

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

  • “使用数组进行字符串连接,速度更快!”
意思是:

var some_variable = ['to=', other_variable].join("");
这对于许多串联来说显然更快,但完全不相关,因为该代码可能只运行一次<代码>过早优化=sqrt(万恶)

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


我爱人。

有可能构建这样一种情况:

var some_variable = 'to=' + other_variable;
这是:

var some_variable = 'to=' + [other_variable];
产生不同的结果。具体来说,如果
Array.prototype.toString()
方法(或者,我想,
Array.prototype.join()
方法)已从其默认值更改,则任何情况都可能发生。例如,可以将额外的功能添加到
Array.prototype.toString()
方法中,以生成日志信息、执行一些查找或其他任何真正的操作


我想,这样做的可能性微乎其微,但为了完整性需要提及。

即使不改变
阵列
原型,也存在差异:

var other_variable;
var some_variable = 'to=' + [other_variable];
如果
其他_变量
未定义
,则该数组的返回值为
“to=“


如果没有该数组,返回值是
“to=undefined”

,以防其他人在试图找出涉及[方括号]的某些奇怪/新语法时到达此处(见一些示例)
var some_variable = 'to=' + [other_variable];
var other_variable;
var some_variable = 'to=' + [other_variable];
const names = ['Luke', 'Eva', 'Phil']; 
const [first] = names;  
console.log(first); // 'Luke' 
const [first, second] = names;  
console.log(first, second); // 'Luke' 'Eva'