Ошибка 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, она не будет поддерживаться.