2009-05-25 3 views
31

Является ли это стандартным способом назначения нескольких переменных из массива в 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?

+0

раскалывается на толстой кишке безопасно? Что, если в одном из значений есть двоеточие? – Nosredna

+2

Привет, не беспокойтесь о толстой кишке. Это был случайный пример. Мне просто интересно, можно ли назначить несколько переменных из массива. Или, если это возможно, в ближайшем будущем. – gregers

ответ

8

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

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

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

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


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

+1

https://developer.mozilla.org/en/New_in_javascript_1.7#Destructuring_assignment был именно тем, что я искал! Я пробовал читать спецификацию EcmaScript, но это было немного тяжело. Документация mozilla была очень хорошей! Благодаря :) – gregers

0

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

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

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

+1

Это не альтернатива, жалобщики отметили, что это возможное решение в его вопросе. –

+0

с использованием временной переменной - намного лучший вариант! – nickf

+0

Он отметил, что возможность сделать это с временной переменной, однако в этом методе нет необходимости в ней. –

1

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

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

Я не знаю, как вы используете это, но если бы я был в состоянии определить свой собственный формат для «ключ: значение» строка, я был бы соблазном использовать JSON только Eval строки в нужный объект:

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

Извините за запутанный вопрос, но я специально хочу назначить несколько переменных из массива. Функция split возвращает массив. Btw eval is evil;) – gregers

+0

А, я вижу. Разделитель() был только для вопроса, чтобы получить массив для вашего примера. И почему зол зла? Это не безопасно, но тогда ничто не работает в javascript. – jrb

3

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

var key, value; 

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

alert(key + "=" + value); 

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

15

Назначение разрушения стандартизовано в 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 - очень популярный транспилер. См. Kangax´s table of browser and transpiler ES6-support.

Подробнее:

Compatibility table for ES6 browser support

Exploring ES6 - Destructuring chapter

Смежные вопросы