JavaScript如何在一行中定义多个变量?

171

阅读在线文档时,我对如何在一行中正确定义多个JavaScript变量感到困惑。

如果我想压缩以下代码,那么在JavaScript“严格”方式下,如何在单行上定义多个javascript变量?

var a = 0;
var b = 0;

它是:

var a = b = 0;
或者。
var a = var b = 0; 

etc...


1
更多关于多重赋值:JavaScript中变量赋值是如何工作的?。我发现在闭包内使用这种模式来公开构造函数非常有用:var $cls = my.namespace.Foo = function(args){ ... } - blong
10个回答

166

使用Javascript的es6或node,您可以做到以下事情:

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

如果你想要在一行中轻松打印多个变量,只需这样做:

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

0 1 2 3

这类似于 @alex gray 在这里的回答,但这个例子是用Javascript而不是CoffeeScript编写的。

请注意,这里使用了Javascript的数组解构赋值


3
为什么不在这种情况下使用 console.log(a,b,c,d) 呢?它更短,并且输出相同。 - Josh Broadhurst
这里还有另一种选择,就像@Prince Ahmed的答案所展示的那样: let {a,b,c,d} = {"a":0,"b":1, "c":2, "d":3} - devaaron

101
你希望使用逗号,因为如果你依赖于多重赋值语句,在某个时候你会自己给自己制造麻烦。
一个例子是:
>>> 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 = [];

5
这实际上是关于分配数组引用的问题,不仅限于赋值语句作为值的情况。 - Matthew Flaschen
因此,虽然您可以在诸如数字文字之类的情况下使用多个右手赋值,但这样做并不可取。 - meder omuraliev
2
@meder,这是任何分配的问题。右手没有什么特别之处。 - Matthew Flaschen
我指的是一般的作业任务。修改了措辞。 - meder omuraliev
4
需要记住的是,在使用多重赋值模式时,任何未声明的赋值在 ES5 严格模式下都会导致 ReferenceError 异常... 在我看来,应该避免使用它们... - Christian C. Salvadó

58

无法使用赋值作为值在一行中完成。

var a = b = 0;

将 b 声明为全局变量。一种正确的方法(不会造成变量泄露)是稍微冗长一些:

var a = 0, b = a;

这在以下情况下很有用:

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

1
“没有办法在不重复0的情况下使用赋值作为值” - 这是什么意思? - palswim

57

为什么不分两行写呢?

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 在全局作用域中隐式声明。


1
这对我很有用,因为我在程序中提前声明了许多变量。现在,我可以只用几行代码而不会牺牲可读性,而不是使用30多行代码。 - Kalif Vaughn
1
这个简明扼要地澄清了(并改进了)被接受的答案,它既简单又可靠,不需要不必要的ES6解构或数组方法。 - lys

24

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

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

let {name, age, id} = person;

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

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


7
这比原帖的问题要长,因为它相当于“let { a, b } = {a: 0, b: 0}”。 - Dan Dascalescu
@PrinceAhmend 是否可以像新声明一样分配变量,而不是新声明? - Nick Div

15

针对提问者所询问的问题,如果您想要使用相同的值(例如0)初始化N个变量,您可以使用数组解构Array.fill来将一个由N个0 组成的数组分配给这些变量:

let [a, b, c, d] = Array(4).fill(0);

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


2
如果它们具有相同的值,则执行此操作。
let x = y = z = 0

否则
let [x, y, z] = [10, 30, 50]
console.log(x, y, z) // 10 30 50

2

压缩后的类型在这里:

var a, b = a = "Hi";

& 对于3个变量:

var x, y, z = x = y = "Hello";

希望能够有所帮助!


0

请注意,您只能对数字和字符串执行此操作。

你可以做...

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

c++;
// c = 1, b = 0, a = 0;

并且也有布尔值,没有问号? - Lahcen
@Lah Ezcen 是的,我相信所有不可变数据类型都是如此。 - LMCuber

-2

这是完全正确的:

var str1 = str2 = str3 = "value";

如果更改其中一个变量的值,其他变量的值不会更改:

var str1 = str2 = str3 = "value";

/* Changing value of str2 */
str2 = "Hi Web!";

document.write("str1 = " + str1 + " - str2 = " + str2 + " - str3 = " + str3);


4
你不在意其他警告,这可能导致str2和str3成为全局变量,对吧? - logicOnAbstractions

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接