Можно назначить несколько переменных из массива?
Является ли это стандартным способом назначения нескольких переменных из массива в 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
Ответ 7
var [x, y] = [1, 2];
console.log(x, y); // 1 2