Не долго я радовался простому способу создания Array generic methods, баг Array.splice в IE8:
var obj = { "0": "a", "1": "b", "2": "c", length: 3 }; [].splice.call(obj, 1, 1); alert(JSON.stringify(obj)); //→ {"0":"a","1":"c","2":"c","length":2} //остальные браузеры {"0":"a","1":"c","length":2} Большинство результатов в Google с жалобой на то, что 2-й аргумент в IE обязательный, но этот баг тоже нагуглился http://stackoverflow.com/questions/1...ss-browser-ie8 |
var holder = { i: 0, toString: function() { return this.i++; } }; var object = {}; object[holder] = holder + ''; object[holder] = holder + ''; object; // ? |
Цитата:
(function(o){ Array.prototype.splice.call(o, 1, 1); return o[1] !== 1; }({"0": 0, "1": 1, "length": 2})) || new function() { var splice = Array.prototype.splice; Array.prototype.splice = function(offset, count) { var result = splice.apply(this, arguments); if (!(this instanceof Array)) { while(count--) { delete this[this.length + count]; } } return result; } }; [].splice.call(obj, 1, 1); alert(JSON.stringify(obj)); // {"0":"a","1":"c","length":2} |
Цитата:
Цитата:
{"0":"1","2":"3"} //IE8 {"1":"0","3":"2"} //другие браузеры Я так понял в IE8 сначала создается object[holder] = undefined , а потом выполняется присваивание вычисленного значения |
Вообще по общей логике javascript(исполнение слева-направо) IE тут прав, ибо по сути то:
var holder = { i: 0, toString: function() { return this.i++; } } var object = {}; object[holder.toString()] = holder.toString() + ''; object[holder.toString()] = holder.toString() + ''; alert(JSON.stringify(object)); |
Не знаю к чему вы это, но я тоже внесу свою лепту ;)
new function() { var i = 0; Object.defineProperty(window, 'holder', { configurable: true, get: function() { return i++; } }); } var object = {}; object[holder] = holder; object[holder] = holder; alert(JSON.stringify(object)); |
devote, к тому что toString ведёт себя не как гетер, а как хз что.
Интересно спеки говорят что нибудь об этом?.. |
Цитата:
Понятно дело что в этом случае браузеру нужно гадать, конвертить или нет: object[holder]вот так он поймет конечно что нужно вызвать toString, так как явно указывает на это: object[holder + ''] |
devote, не, понятно конечно что ситуация неопределённая, но holder то объект, так что конвертить полюбасу придётся. Я лично в данной ситуации на стороне ie.
|
Цитата:
|
Часовой пояс GMT +3, время: 23:32. |