14.04.2014, 01:25
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Не долго я радовался простому способу создания 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
Последний раз редактировалось Octane, 14.04.2014 в 01:46.
|
|
14.04.2014, 11:05
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
var holder = {
i: 0,
toString: function() {
return this.i++;
}
};
var object = {};
object[holder] = holder + '';
object[holder] = holder + '';
object; // ?
|
|
14.04.2014, 11:56
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от Octane
|
Array generic methods, баг Array.splice в IE8:
|
Старый баг, я на него наткнулся еще когда селекторы писал, решается так:
(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}
|
|
14.04.2014, 14:06
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Сообщение от devote
|
Старый баг, я на него наткнулся еще когда селекторы писал, решается так:
|
Обычно push.call и slice.call хватало, до splice как то дело не доходило) Да и сейчас наткнулся, потому что от нечего делать метод array.remove писал.
Сообщение от monolithed
|
var holder = {
i: 0,
toString: function() {
return this.i++;
}
};
var object = {};
object[holder] = holder + '';
object[holder] = holder + '';
object; // ?
|
{"0":"1","2":"3"} //IE8
{"1":"0","3":"2"} //другие браузеры
Я так понял в IE8 сначала создается object[holder] = undefined , а потом выполняется присваивание вычисленного значения
Последний раз редактировалось Octane, 14.04.2014 в 14:12.
|
|
14.04.2014, 14:32
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,587
|
|
Вообще по общей логике 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));
__________________
29375, 35
|
|
14.04.2014, 14:54
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Не знаю к чему вы это, но я тоже внесу свою лепту
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));
|
|
14.04.2014, 15:16
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,587
|
|
devote, к тому что toString ведёт себя не как гетер, а как хз что.
Интересно спеки говорят что нибудь об этом?..
__________________
29375, 35
|
|
14.04.2014, 15:31
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от Aetae
|
к тому что toString ведёт себя не как гетер, а как хз что.
|
Ну вполне норм себя ведет, вызывается тогда когда нужно конвертнуть значение в строку... Все вполне разумно и правильно.
Понятно дело что в этом случае браузеру нужно гадать, конвертить или нет:
object[holder]
вот так он поймет конечно что нужно вызвать toString, так как явно указывает на это:
object[holder + '']
|
|
14.04.2014, 15:37
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,587
|
|
devote, не, понятно конечно что ситуация неопределённая, но holder то объект, так что конвертить полюбасу придётся. Я лично в данной ситуации на стороне ie.
__________________
29375, 35
|
|
14.04.2014, 15:38
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от devote
|
object[holder + '']
|
Ага, хоть кто-то на это обратил внимание
|
|
|
|