Javascript 表达式周围的方括号是什么意思,例如'var x=a+;[b] ”“是吗?
我们从一家机构收到了一些JavaScript,这些JavaScript看起来是错误的,但可以正常工作 出于某种原因,他们在变量周围添加方括号(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
[
,]
),如下所示:
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;
- 该全局变量可以引用为:- 窗口[“任意名称”]
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'