在JavaScript中,链接分配好吗?

Jam*_*Jag 34 javascript object variable-assignment

对JS或它的语法来说并不陌生,但有时候,语言的语义有时会让我感到难过.在今天的工作中,一位同事提到了这一点:

var a = b = [];
Run Code Online (Sandbox Code Playgroud)

是不一样的

var a = [], b = [];
Run Code Online (Sandbox Code Playgroud)

要么

var a = []; var b = [];
Run Code Online (Sandbox Code Playgroud)

因为第一个版本实际上将对空数组的引用分配给a和b.我不能完全接受这一点,但我不确定.你们都觉得怎么样?

Tim*_*own 41

是的,他们不一样.var a = b = []相当于

var a;
b = [];
a = b;
Run Code Online (Sandbox Code Playgroud)

不仅要声明两者ab获得相同的值(对同一个空数组的引用),b也不要声明它们.在ECMAScript 5及更高版本的严格模式下,这将抛出一个ReferenceError; 否则,除非b范围中已存在变量,否则b将静默创建为全局对象的属性,并且无论代码在何处,甚至在函数内部,都与全局变量的行为类似.哪个不好.

你很容易看到这个:

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

console.log(b); // Shows []
Run Code Online (Sandbox Code Playgroud)

  • +1避免赋予无法解析的引用的另一个原因是在ES5上,在严格模式下,将抛出`ReferenceError`. (4认同)
  • 我没有立即看到b是全局变量,谢谢! (2认同)

Dan*_*llo 10

你的同事是对的:

var a = b = [];
a.push('something');
console.log(b);          // outputs ["something"]
Run Code Online (Sandbox Code Playgroud)

但:

var a = [], b = [];
a.push('something');
console.log(b);          // outputs []
Run Code Online (Sandbox Code Playgroud)