Ошибка IE - Object.keys(значение).length не поддерживается

Я пытаюсь отлаживать некоторые js в Internet Explorer, и я не могу понять это. Здесь строка, вызывающая ошибку:

var numberOfColumns = Object.keys(value).length;

И ошибка...

Message: Object doesn't support this property or method
Line: 640
Char: 5
Code: 0
URI: xxx

Сначала я думал, что это имеет какое-то отношение к свойству Object.keys(value).length;, но как ни странно (для меня все равно), ошибка находится в char 5, что является началом имени переменной.

В любом случае, я понятия не имею, что происходит или как это исправить. Кроме того, если я заменю:

var numberOfColumns = Object.keys(value).length;

С...

var numberOfColumns = 9; // troubleshooting

Ошибка сохраняется. Пожалуйста, помогите.

Обновление

Добавлен jsFiddle

http://jsfiddle.net/4Rab7/

Ответ 1

Свойство keys поддерживается в IE >= 9. Возможно, вы тестируете его в более ранней версии. Простой способ:

var length = 0;
for(var prop in data){
    if(data.hasOwnProperty(prop))
        length++;
}

Вот демонстрация: http://jsfiddle.net/vKr8a/

См. эту таблицу совместимости для получения дополнительной информации:

http://kangax.github.com/es5-compat-table/

Ответ 2

В качестве альтернативы, вы можете использовать рекомендованный polyfill для браузеров, которые изначально не поддерживают Object.keys

Object.keys=Object.keys||function(o,k,r){r=[];for(k in o)r.hasOwnProperty.call(o,k)&&r.push(k);return r}

Разбивка того, что делает этот скрипт:

Object.keys = Object.keys || function(o,k,r) { 
// If the script doesn't detect native Object.keys 
// support, it will put a function in its place (polyfill)

    r=[];
    // Initiate the return value, empty array

    for(k in o) r.hasOwnProperty.call(o,k) 
    // loop through all items in the object and verify each
    // key is a property of the object ('for in' will return non 
    // properties)

    && r.push(k);
    // if it is a property, save to return array

    return r
}

Ответ 3

Object.keys был введен в ECMAScript 5th Edition. Поэтому, если IE-версия меньше 9, она не будет поддерживаться.