Можно назначить несколько переменных из массива?

Является ли это стандартным способом назначения нескольких переменных из массива в JavaScript? В Firefox и Opera вы можете:

var [key, value] = "key:value".split(":");
alert(key + "=" + value); // will alert "key = value";

Но это не работает в IE8 или Google Chrome.

Кто-нибудь знает хороший способ сделать это в других браузерах без переменной tmp?

var tmp = "key:value".split(":");
var key=tmp[0], value=tmp[1];

Это что-то, что придет в будущей версии JavaScript, или просто пользовательской реализации в FF и Opera?

Ответ 1

Если вы хотите узнать, что произойдет, прочитайте раздел о назначении Destructuring.

https://developer.mozilla.org/en/New_in_javascript_1.7

Какие возможности языка вы можете использовать, всегда зависит от вашей среды.

Разработка для Mobile Safari (или веб-стек для других браузеров, таких как Palm Pre, Android и т.д.) или AIR, например, более предсказуема, чем разработка для Интернета в целом (где вам все равно придется принимать даже IE6).


Кросс-браузерное решение проблемы под рукой будет состоять в инициализации массива, в котором есть список переменных, которые вы хотите заполнить в формате window.variable, а затем просто прокрутите. Не могу себе представить, почему вы это сделаете. Похоже, что всегда будет лучшее решение.

Ответ 2

Назначение деструктуризации стандартизовано в ECMAScript 2015 (a.k.a. ES6). Но не все браузеры еще не реализовали деструктуризацию (по состоянию на март 2016 года), и даже когда они это сделают, потребуется некоторое время, прежде чем пользователи будут обновлены в браузере с поддержкой. См. examples в спецификации для всех удивительных вещей, которые вы можете сделать. Вот некоторые из них:

// Assign from array elements
var [key, value] = "key:value".split(":");
// key => 'key'
// value => 'value'

// Assign from object properties
var {name: a, age: b} = {name: 'Peter', age: 5};
// a => 'Peter'
// b => 5

// Swap
[a, b] = [b, a]
// a => 5
// b => 'Peter'

Поскольку эта функция нарушает обратную совместимость, вам нужно transpile код, чтобы он работал во всех браузерах. Многие из существующих транспилеров поддерживают деструктурирование. Babel - очень популярный транспилер. См. таблица браузера и транспилера ESG-поддержки Kangax.

Дополнительная информация:

Таблица совместимости для поддержки браузера ES6

Изучение главы ES6 - Разрушение

Ответ 3

У меня был точно такой же вопрос, и как упражнение для меня придумало следующее:

var key, value;

(function(arr){
  key=arr[0]; 
  value=arr[1];
})("key:value".split(":"));

alert(key + "=" + value);

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

Ответ 4

Я не думаю, что это возможно в браузере. Лучшее, что я знаю, что может помочь в нескольких обстоятельствах, заключается в следующем:

// we'll pretend you don't need the key.
var value = "key:value".split(":")[1];

Ответ 5

Я думаю, что это должно быть частью новой спецификации, а затем снова долго читать...: p

key = "key:value".split(":")[0];
value = "key:value".split(":")[1];

Только альтернатива, которую я могу придумать.

Ответ 6

Я не знаю, как вы это используете, но если бы я смог определить свой собственный формат для строки "ключ: значение", у меня возникло бы желание использовать json, чтобы просто преобразовать строку в необходимый объект

var obj = eval("{'key':'key_str', 'value':'val_str'}");
alert(obj.key + "=" + ojb.value);  //alerts "key_str=value_str