Javascript如何在一行上定义多个变量?


103

在线阅读文档,我很困惑如何在一行上正确定义多个JavaScript变量。

如果我想压缩以下代码,在一行上定义多个javascript变量的正确JavaScript“严格”方法是什么?

var a = 0;
var b = 0;

是吗:

var a = b = 0;

要么

var a = var b = 0; 

等等...


1
有关多重分配的更多信息:变量分配在JavaScript中如何工作?。我发现在关闭内部以暴露构造函数的过程中,此模式很有用:var $cls = my.namespace.Foo = function(args){ ... }
blong

我想知道为什么首先要压缩它。恕我直言,每个人声明和分配一个变量都更清楚,也更容易理解。
Henning

Answers:


76

您希望使用逗号,因为如果您使用多重分配结构,则可能会在某一点或另一点处陷入困境。

一个例子是:

>>> var a = b = c = [];
>>> c.push(1)
[1]
>>> a
[1]

它们都引用内存中的同一对象,它们不是“唯一的”,因为任何时候对对象(数组,对象文字,函数)的引用都是通过引用而不是值传递的。因此,如果仅更改这些变量之一,并希望它们单独起作用,那么您将无法获得所需的结果,因为它们不是单独的对象。

多重分配也有一个缺点,即次要变量变为全局变量,并且您不想泄漏到全局命名空间中。

(function() {  var a = global = 5 })();
alert(window.global) // 5

最好只使用逗号,最好使用大量空格,以便于阅读:

var a = 5
  , b = 2
  , c = 3
  , d = {}
  , e = [];

2
通常,分配数组引用确实是一个问题,而不仅仅是分配语句作为值。
马修·弗莱申

“因此,尽管您
可以避免

1
@meder,这是所有作业的问题。右手没什么特别的。
马修·弗拉申

我的意思是一般的作业。编辑措辞。
meder omuraliev

2
这种多重分配模式要记住的一点是,在ES5严格模式下,任何未声明的分配都会导致ReferenceError异常... IMO,应避免使用它们
CMS

64

使用Javascript的es6或节点,您可以执行以下操作:

var [a,b,c,d] = [0,1,2,3]

而且,如果您想轻松地在一行中打印多个变量,请执行以下操作:

console.log(a, b, c, d)

0 1 2 3

这类似于@alex gray的答案,但此示例使用Javascript而不是CoffeeScript。

请注意,这使用Javascript的数组解构分配


2
为什么不在console.log(a,b,c,d)这种情况下使用呢?它更短并提供相同的输出
乔什·布罗德赫斯特

44

无法将一行赋值作为值来完成。

var a = b = 0;

使b为全局。正确的方法(不泄漏变量)是稍长的时间:

var a = 0, b = a;

在以下情况下很有用:

var a = <someLargeExpressionHere>, b = a, c = a, d = a;

1
“没有重复0就无法将赋值用作值。” - 你什么意思?
palswim

28

为什么不分两行呢?

var a, b, c, d;    // All in the same scope
a = b = c = d = 1; // Set value to all.

之所以这样,是为了保留变量声明的局部范围,如下所示:

var a = b = c = d = 1;

会导致隐含的声明bcd在窗口范围。


这对我很有用,因为我在程序中预先声明了许多变量。现在,我可以花几行而不用牺牲30多行,而不会影响可读性。
卡利夫·沃恩

11

这是在一行中声明多个变量的新ES6方法:

const person = { name: 'Prince', age: 22, id: 1 };

let {name, age, id} = person;

console.log(name);
console.log(age);
console.log(id);

* 您的变量名称和对象索引必须相同


2
这比OP的问题要长,因为它等效于let { a, b } = { a: 0, b: 0 }
Dan Dascalescu


0

请注意,您只能使用数字和字符串来执行此操作

你可以做...

var a, b, c; a = b = c = 0; //but why?

c++;
// c = 1, b = 0, a = 0;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.