Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #71 (permalink)  
Старый 14.04.2014, 01:25
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 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.
Ответить с цитированием
  #72 (permalink)  
Старый 14.04.2014, 11:05
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

var holder = { 
    i: 0, 
    toString: function() {
        return this.i++;
    } 
}; 

var object = {}; 
object[holder] = holder + ''; 
object[holder] = holder + ''; 

object; // ?
Ответить с цитированием
  #73 (permalink)  
Старый 14.04.2014, 11:56
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 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}
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #74 (permalink)  
Старый 14.04.2014, 14:06
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 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.
Ответить с цитированием
  #75 (permalink)  
Старый 14.04.2014, 14:32
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 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
Ответить с цитированием
  #76 (permalink)  
Старый 14.04.2014, 14:54
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 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));
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #77 (permalink)  
Старый 14.04.2014, 15:16
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

devote, к тому что toString ведёт себя не как гетер, а как хз что.
Интересно спеки говорят что нибудь об этом?..
__________________
29375, 35
Ответить с цитированием
  #78 (permalink)  
Старый 14.04.2014, 15:31
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Aetae
к тому что toString ведёт себя не как гетер, а как хз что.
Ну вполне норм себя ведет, вызывается тогда когда нужно конвертнуть значение в строку... Все вполне разумно и правильно.

Понятно дело что в этом случае браузеру нужно гадать, конвертить или нет:
object[holder]
вот так он поймет конечно что нужно вызвать toString, так как явно указывает на это:
object[holder + '']
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #79 (permalink)  
Старый 14.04.2014, 15:37
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

devote, не, понятно конечно что ситуация неопределённая, но holder то объект, так что конвертить полюбасу придётся. Я лично в данной ситуации на стороне ie.
__________________
29375, 35
Ответить с цитированием
  #80 (permalink)  
Старый 14.04.2014, 15:38
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от devote
object[holder + '']
Ага, хоть кто-то на это обратил внимание
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скрипт определения мобильных браузеров remkas Элементы интерфейса 0 25.10.2012 15:47
history браузеров d-kaktus Javascript под браузер 1 12.01.2012 00:31
Баги в форме добавления nemo Серверные языки и технологии 0 18.07.2010 13:35
Баги в сниппетах ответов Илья Кантор Сайт Javascript.ru 31 11.06.2009 17:58
feature request: FAQ hogart Сайт Javascript.ru 4 30.01.2009 11:53