Не долго я радовался простому способу создания 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, время: 17:23. |