Is setting multiple variables in 1 line valid in javascript? (var x=y='value';)
This is valid in php:
$x=$y='value';
This will in esscence set both $x and $y to 'value'.
Is this valid in javascript?
var x=y='value';
I have tested it in chro开发者_运维问答me console and it worked as expected, but just wanted to double check before starting to use it.
It only works if the var y
as been previously defined, otherwise y
will be global.
In such case, you better do:
var x, y;
x = y = 'value';
Assignments Chaining
Another antipattern that creates implied globals is to chain assignments as part of a
var declaration. In the following snippet, a
is local but b
becomes global, which is
probably not what you meant to do:
// antipattern, do not use
function foo() {
var a = b = 0;
// ...
}
If you’re wondering why that happens, it’s because of the right-to-left evaluation. First,
the expression b = 0
is evaluated and in this case b is not declared. The return value of
this expression is 0
, and it’s assigned to the new local variable declared with var a
. In
other words, it’s as if you’ve typed:
var a = (b = 0);
If you’ve already declared the variables, chaining assignments is fine and doesn’t create unexpected globals. Example:
function foo() {
var a, b;
// ...
a = b = 0; // both local
}
“JavaScript Patterns, by Stoyan Stefanov (O’Reilly). Copyright 2010 Yahoo!, Inc., 9780596806750.”
I'm pretty sure that the most readable form is the one that has not been brought up yet:
let x = 0, y = 0
To prevent the y from becoming a global variable, use the following:
var x, y = x = 'value';
Apparently the declarations are simply evaluated from left to right.
Yes, that is valid in Javascript.
However, after googling the problem, this Stack Overflow question explains some caveats, so use with caution.
When vars have different values you can easily write:
var x = 0,
y = 1,
...
z = 2;
In some cases involving objects and arrays, Assignments Chaining
is not safe.
This is an example:
const a = {}
// Use Assignments Chaining to save some typing.
a['foo'] = a['bar'] = []
// I just want to set a['foo'] when some condition meets.
for (let i = 0; i < 5; i++) {
a['foo'].push({ title: 'hello', number: i / 2 })
}
// But you maybe get this unexpected assignment.
console.log(a['bar'])
/*
[
{
"title": "hello",
"number": 0
},
{
"title": "hello",
"number": 0.5
},
{
"title": "hello",
"number": 1
},
{
"title": "hello",
"number": 1.5
},
{
"title": "hello",
"number": 2
}
]
*/
精彩评论