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;