Var x, y = 'foo'; Можно ли это сделать?
Так как можно сделать:
var x = 'foo', y = 'foo';
Можно ли это сделать?
var x, y = 'foo';
Я попробовал, но x становится undefined.
Я знаю, это может показаться глупым или излишним вопросом, но если мне что-то интересно, почему бы не спросить? Также вы, вероятно, будете удивляться, почему мне нужны две переменные, равные одной и той же области действия. Это не вопрос. Мне просто интересно.
Ответы
Ответ 1
Для получения точной семантики вам нужны два отдельных оператора.
var x, y; x = y = 'foo';
// or
var x = 'foo'; var y = x;
// or
var y; var x = y = 'foo';
Решение, предлагаемое другими пользователями, не эквивалентно, поскольку оно не применяется с var
до y
. Если существует глобальная переменная y
, она будет перезаписана.
// Overwrites global y
var x = y = 'foo';
Хорошей практикой является правильное применение var
к локальным переменным и не опускать его для краткости.
Ответ 2
Не уверен, что это то, о чем вы просите, но если вы имеете в виду "Могу ли я назначить две переменные одному и тому же литералу в одной строке, не печатая буква буквально два раза?" то ответ "да":
var x = 10, y = x;
Ответ 3
Вы можете сделать
var x = y = 'test'; // Edit: No, don't do this
ИЗМЕНИТЬ
Я только понял, что это создает/перезаписывает y
как глобальную переменную, так как y
не сразу предшествует ключевому слову var
. Таким образом, в основном, если это функция, вы бы сказали: "Локальная переменная x
равна глобальной переменной y равна...". Таким образом, вы либо загрязняете глобальную область, либо присваиваете новое значение существующей глобальной переменной y
. Нехорошо.
К сожалению, вы не можете сделать
var x = var y = 'test'; // Syntax error
Итак, если вы не хотите загрязнять глобальную область (а вы этого не делаете!), вы можете сделать
var x, y;
x = y = 'test';
Ответ 4
Для того, чтобы это сработало, вам либо нужно будет инициализировать их отдельно (например, ваш первый пример), либо вам нужно будет установить их в отдельном заявлении.
// This causes bugs:
var x = y = 'test';
Часы:
var y = 3;
function doSomething(){ var x = y = 'test'; }
doSomething();
console.log( y ); // test !?
С другой стороны:
// this does not
var x,y; x = y = 'test';
Часы:
var y = 3;
function doSomething(){ var x,y; x = y = 'test'; }
doSomething();
console.log( y ); // 3 -- all is right with the world.
Ответ 5
Ниже приведена моя тестовая функция. Текущая строка без комментариев в функции pollute делает то, что вы искали. Вы можете попробовать и другие варианты в jsfiddle здесь.
var originalXValue = 'ekis';
var originalYValue = 'igriega';
var x = 'ekis';
var y = 'igriega';
function pollute()
{
// Uncomment one of the following lines to see any pollution.
// x = 'ex'; y = 'why'; // both polluted
// var x = 'ex'; y = 'why'; // y was polluted
// var x = y = 'shared-ex'; // y was polluted
var x = 'oneline', y = x; // No pollution
// var x = 'ex', y = 'ex'; // No pollution
document.write('Pollution function running with variables<br/>' +
'x: ' + x + '<br/>y: ' + y + '<br/><br/>');
}
pollute();
if (x !== originalXValue && y !== originalYValue)
{
document.write('both polluted');
}
else if (x !== originalXValue)
{
document.write('x was polluted');
}
else if (y !== originalYValue)
{
document.write('y was polluted');
}
else
{
document.write('No pollution');
}
Ответ 6
Обратите внимание, что хотя
var x = y = 'test';
является законным javascript
В строгом контексте (например, этот пример):
function asdf() {
'use strict';
var x = y = 5;
return x * y;
}
asdf();
Вы получите:
ReferenceError: assignment to undeclared variable y
чтобы он работал без ошибок, вам понадобится
var x, y;
x = y = 5;
Ответ 7
Вы должны использовать var x, y = 'foo', если хотите явно инициализировать x до undefined и хотите ограничить область x.
function foo() {
var x, y = 'value';
// ...
x = 5;
// ...
}
// Neither x nor y is visible here.
С другой стороны, если вы сказали:
function foo() {
var y = 'value';
// ...
x = 5;
// ...
}
// y is not visible here, but x is.
Надеюсь, что это поможет.
Источник: http://www.mredkj.com/tutorials/reference_js_intro_ex.html
Ответ 8
Я бы не стал сложным. Поскольку я использую только одну переменную за var
(и один оператор в строке), очень просто сделать ее простой:
var x = "hello"
var y = x
Хорошие, простые и без глупых проблем - как обсуждалось в других ответах и комментариях.
Счастливое кодирование.
Ответ 9
Мне интересно, почему никто не опубликовал это еще, но вы можете сделать это
var x, y = (x = 'foo');
Ответ 10
Вы не можете сделать
var a = b = "abc";
потому что в этом случае b станет глобальной переменной.
Вы должны знать, что объявление переменной без var делает ее глобальной. Таким образом, это хорошо, если вы будете следовать по одному
var a = "abc";
var b = a;