在JavaScript中,链接分配好吗?
对JS或其语法并不陌生,但有时,语言的语义让我有时难以忍受。 在今天的工作中,一位同事提到了这一点:
var a = b = [];
是不一样的
var a = [], b = [];
要么
var a = []; var b = [];
因为第一个版本实际上将引用赋给了a和b的空数组。 我无法完全接受这一点,但我不确定。 你们都在想什么?
是的,他们不一样。 var a = b = []
等价于
var a;
b = [];
a = b;
不仅a
和b
被分配了相同的值(对同一个空数组的引用), 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