在JavaScript中,链接分配好吗?

对JS或其语法并不陌生,但有时,语言的语义让我有时难以忍受。 在今天的工作中,一位同事提到了这一点:

var a = b = [];

是不一样的

var a = [], b = [];

要么

var a = []; var b = [];

因为第一个版本实际上将引用赋给了a和b的空数组。 我无法完全接受这一点,但我不确定。 你们都在想什么?


是的,他们不一样。 var a = b = []等价于

var a;
b = [];
a = b;

不仅ab被分配了相同的值(对同一个空数组的引用), b完全没有被声明。 在ECMAScript 5及更高版本的严格模式下,这会引发ReferenceError ; 否则,除非在作用域中已经有一个变量b ,否则b会默默地创建为全局对象的一个​​属性,并且与全局变量类似,无论代码在哪里,即使在函数内部也是如此。 哪个不好。

你可以很容易地看到这一点:

(function() {
    var a = b = [];
})();

window.console.log(b); // Shows []

你的同事是对的:

var a = b = [];
a.push('something');
console.log(b);          // outputs ["something"]

但:

var a = [], b = [];
a.push('something');
console.log(b);          // outputs []

你的同事是对的。 第一条语句创建一个新的空数组。 然后,对这个数组的引用被分配给b。 然后,将相同的引用(这是赋值表达式的结果)分配给a。 所以a和b指的是相同的数组。

在所有其他情况下,您创建两个单独的数组。

顺便说一句:这种行为是相当普遍的,并且在所有基于C的编程语言中都是一样的。 所以这不是JavaScript特定的。

链接地址: http://www.djcxy.com/p/69981.html

上一篇: In JavaScript, is chained assignment okay?

下一篇: Javascript a=b=c statements