#javascript #internet-explorer-11
#javascript #internet-explorer-11
Вопрос:
Я столкнулся с проблемой на странице в IE11, которая приводит к сбою страницы там. Проблемный код, по сути, динамически принимает строку с сервера, инициализирует с ней переменную и позже использует ее в качестве ключа объекта. Чтобы сделать вопрос удобоваримым, я написал небольшой скрипт:
var bar = "b";
var foo = {[bar]: "Orson oson a borsos borsós fosos koros boros korsón"};
Это работает одинаково в Chrome, FireFox и Microsoft Edge, но в IE11 я получаю следующую ошибку:
Ожидаемый идентификатор, строка или число
Почему IE11 не разрешает это и как я должен это решить?
Комментарии:
1. Возможно, код
ES6
илиES7
связан. Попробуйтеvar bar = "b", foo = {}; foo[bar] = "Orson oson a borsos borsós fosos koros boros korsón";
2. @Mr_Green, это работает, но я задаюсь вопросом о причине, по которой мой код выдает ошибку.
3. IE11 поддерживает,
ES5
но не новые версии, такие какES6
илиES7
. ВES5
вы не можете поместить переменную в ключ объекта. Следовательно, ошибка.4. Может быть, я не понимаю, что вы пытаетесь сделать, но почему бы просто не сделать
key = String([bar])
, а затем использовать ключ?5. К сожалению, у этого не будет синтаксической ошибки, но если вы console.log(foo); вы увидите, что у него есть элемент с именем key, которого там не должно быть, и нет элемента с именем b, который должен быть там.
Ответ №1:
IE11 устарел и не поддерживает этот синтаксис … синтаксические изменения в ES2015 не всегда легко реализовать в старых устаревших браузерах — хотя с этим вы могли бы сделать
var bar = "b";
var foo = {};
foo[bar] = "Orson oson a borsos borsós fosos koros boros korsón";
однако при использовании babel код преобразуется в (ES2015-свободная настройка)
var _foo;
var bar = "b";
var foo = (_foo = {}, _foo[bar] = "Orson oson a borsos borsós fosos koros boros korsón", _foo);
или (предустановка ES2015)
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
var bar = "b";
var foo = _defineProperty({}, bar, "Orson oson a borsos borsós fosos koros boros korsón");
Этот синтаксис называется вычисляемыми именами свойств