Значение строковой переменной как ошибки ключа объекта в IE11

#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");
  

Этот синтаксис называется вычисляемыми именами свойств