var x, y = 'foo';Можно ли это сделать? - PullRequest
13 голосов
/ 20 августа 2011

Так как это можно сделать:

var x = 'foo', y = 'foo';

Возможно ли это?

var x, y = 'foo';

Я пробовал, однако х становится неопределенным.

Я знаю, что это может показаться глупым или излишним вопросом, но если мне что-то интересно, почему бы не спросить? Также вы, вероятно, удивитесь, почему мне нужны две переменные, равные одной и той же в области действия . Это не суть вопроса. Мне просто любопытно.

Ответы [ 10 ]

24 голосов
/ 20 августа 2011

Не уверен, что это то, о чем вы спрашиваете, но если вы имеете в виду «Могу ли я назначить две переменные одному и тому же литералу в одной строке, не вводя литерал дважды?» тогда ответ да:

var x = 10, y = x;
22 голосов
/ 20 августа 2011

Вам нужны два отдельных оператора, чтобы получить одинаковую семантику.

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 к локальным переменным и не опускание его для краткости.

7 голосов
/ 20 августа 2011

Вы можете сделать

var x = y = 'test'; // Edit: No, don't do this

EDIT

Я только что понял, что это создает / перезаписывает y как глобальную переменную, поскольку y непосредственно не предшествует ключевое слово var. Таким образом, в основном, если это функция, вы бы сказали «локальная переменная x равна глобальная переменная y равна…». Таким образом, вы либо загрязняете глобальную область, либо присваиваете новое значение существующей глобальной переменной y. Не хорошо.

К сожалению, вы не можете сделать

var x = var y = 'test'; // Syntax error

Таким образом, вместо этого, если вы не хотите загрязнять глобальный охват (а вам нет!), Вы можете сделать

var x, y;
x = y = 'test';
5 голосов
/ 20 августа 2011

Ниже моя тестовая функция.В настоящее время незакомментированная строка в функции pollte делает то, что вы искали.Вы можете попробовать это и другие опции в 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');
}
5 голосов
/ 20 августа 2011

Чтобы это сработало, вам нужно либо инициализировать их отдельно (как в первом примере), либо вам нужно установить их в отдельном выражении.

// 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.
4 голосов
/ 20 августа 2011

Обратите внимание, что хотя

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;
2 голосов
/ 20 августа 2011

Вы бы использовали var x, y = 'foo', когда хотите явно инициализировать x как неопределенное и хотите ограничить область действия 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

1 голос
/ 27 августа 2011

Мне интересно, почему никто еще не опубликовал это, но вы можете сделать это

var x, y = (x = 'foo');
1 голос
/ 20 августа 2011

Я бы не стал хитрым. Так как я использую только одну переменную на var (и одну инструкцию на строку) , все очень просто:

var x = "hello"
var y = x

Хорошие, простые и не глупые вопросы - как обсуждалось в других ответах и ​​комментариях.

Удачного кодирования.

0 голосов
/ 20 августа 2011

Вы не можете сделать

var a = b = "abc";

потому что в этом случае b станет глобальной переменной.

Вы должны знать, что объявление переменной без var делает ее глобальной. Так что хорошо, если вы будете следовать один за другим

 var a = "abc";
 var b = a;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...