Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   FAQ Баги браузеров. (https://javascript.ru/forum/offtopic/33616-faq-bagi-brauzerov.html)

danik.js 07.02.2013 06:45

Дзен-трансгуманист, да ты мастер обфускации ))
Скрипты наверно эффективнее через тебя пропускать, нежели через какой-нибудь компрессор-минификатор :)

Gozar 07.02.2013 11:16

Цитата:

Сообщение от Дзен-трансгуманист
Считай это естественным тестом на профпригодность, который было бы обидно не пройти.

Считай, что ты только что унизил всех людей, которые не понимают зачем нужно писать код непонятно, когда можно писать его понятно и в ответ все эти люди назвали тебя козлом.

Насколько мне известно применение побитовых операций в js не приводит к увеличению скорости, а скорее наоборот. Поэтому ты добавил тормоза в программу и оправдываешь их инженерным образованием.

devote 07.02.2013 11:49

Цитата:

Сообщение от Gozar
Насколько мне известно применение побитовых операций в js не приводит к увеличению скорости, а скорее наоборот.

Тут можно еще поспорить:
function test1(defs) {
    return {1:0, 2:2, 4:1}[defs];
}

function test2(defs) {
    return (defs & ~1) % 3;
}

function test3(defs) {
    return [0,0,2,,1][defs];
}

var lastTime=(new Date()).getTime();
for(var i = 0; i < 100000; i++) {
    test1(i & 1);
}
alert("Время заняло с использованием объекта (ms): " + ((new Date()).getTime()-lastTime));

var lastTime=(new Date()).getTime();
for(var i = 0; i < 100000; i++) {
    test2(i & 1);
}
alert("Время заняло с использованием битов (ms): " + ((new Date()).getTime()-lastTime));

var lastTime=(new Date()).getTime();
for(var i = 0; i < 100000; i++) {
    test3(i & 1);
}
alert("Время заняло с использованием массива (ms): " + ((new Date()).getTime()-lastTime));


Opera 12.13:
Время заняло с использованием объекта (ms): 61
Время заняло с использованием битов (ms): 17
Время заняло с использованием массива (ms): 20

devote 07.02.2013 11:56

пример с массивом и битами работают почти с одинаковой скоростью... Хотя если позапускать несколько раз, то видно что идентичны.. Но вот с объектами все намного хуже.

Можно провести тест со свитчем:
function test1(defs) {
    switch(defs) {
        case 1:
            return 0;
        case 2:
            return 2;
        case 4:
            return 1;
        deafult:
            return 0;
    }
}
 
var lastTime=(new Date()).getTime();
for(var i = 0; i < 100000; i++) {
    test1(i & 1);
}
alert("Время заняло с использованием switch (ms): " + ((new Date()).getTime()-lastTime));


Opera 12.13
Время заняло с использованием switch (ms): 15

Gozar 07.02.2013 12:34

Цитата:

Сообщение от devote
Тут можно еще поспорить

Каюсь. Наверное стереотипы. :(

nerv_ 07.02.2013 12:36

Цитата:

Сообщение от Gozar
Считай, что ты только что унизил всех людей, которые не понимают зачем нужно писать код непонятно, когда можно писать его понятно

+. "Не заставляйте меня думать" ... там, где этого делать не надо. Тут следовало бы сделать ремарку насчет предложенного мной варианта и в коммнтульках написать, что делает код. Кстати. это можно изобразить способом, предложенным danik.js.

function test7(x) {
    return x !== 2 ? x >> 2 : 2;
}
 
var lastTime=(new Date()).getTime();
for(var i = 0; i < 100000; i++) {
    test7(i & 1);
}
      
alert("Время с использованием x !== 2 ? x >> 2 : 2 (ms): " + ((new Date()).getTime()-lastTime));


return (e.button & ~1) % 3;

// 1. ~1
// 2. e.button & x
// 3.  x % 3;


Цитата:

Сообщение от Gozar
Насколько мне известно применение побитовых операций в js не приводит к увеличению скорости, а скорее наоборот.

слышал информацию на этот счет. Мое мнение - все меняется настолько быстро, ничему верить нельзя (в плане производительности). Тесты, тесты, тесты. При этом не факт, что если сегодня быстро, то завтра (код не трогаем, меняется только браузер ... внутри) не будет медленно и наоборот.

Цитата:

Сообщение от danik.js
предложили какие то непонятные решения для определения e.button.

в моем все просто и очевидно (как мне кажется), но не настолько наглядно, как в "твоем"

Если принимать во внимание, что события мыши могу обрабатываться довольно часто, то решение с объектом, пускай и наглядным, приведет к лишним задр*чкам и в без того медленном IE. Впрочем, надо тестировать...

Gozar 08.02.2013 00:02

Цитата:

Сообщение от Дзен-трансгуманист
твои эмоции на мой личный счет

У меня нет эмоций на твой счет.

Цитата:

Сообщение от Дзен-трансгуманист
больше не буду

Цитата:

Сообщение от Дзен-трансгуманист
детский сад

;)

nerv_ 08.02.2013 03:30

Цитата:

Сообщение от Дзен-трансгуманист
Извини за оффтоп

не переживай на этот счет :no:

Ну, а Gozar он добрый и пушистый (особенно когда не бреется). Только тщательно это скрывает :)

nerv_ 10.04.2014 18:29

Object.create() IE9,10 bug
 
Bug
var obj = Object.create({}.constructor.prototype);
//var obj = Object.create(Object.getPrototypeOf({}));
//var obj = {};

obj['0'] = null;
obj['1'] = null;

alert(obj.hasOwnProperty('0')); // IE9,10 - false
alert(obj.hasOwnProperty('1')); // IE9,10 - false


Fix
var obj = Object.create({}.constructor.prototype);
//var obj = Object.create(Object.getPrototypeOf({}));
//var obj = {};

obj['0'] = null;
obj['1'] = null;
obj['x'] = null; // fix

alert(obj.hasOwnProperty('0')); // true
alert(obj.hasOwnProperty('1')); // true

Octane 10.04.2014 18:55

Жесть… я только начинал верить в IE :( в 11 версии не исправили

------------
причем, если сразу же удалить fix, то баг останется, поэтому вот такой декоратор для Object.create не прокатил:
//IE9-11 Object.create bug fix
(function () {
	var object = Object.create({});
	object[0] = null;
	return object.hasOwnProperty(0); //→ false in IE9-11
}()) || (Object.create = new function () {
	var create = Object.create;
	return function (prototype, properties) {
		var object = create(prototype, properties);
		object[0] = null;
		object.fix = null;
		delete object[0];
		//delete object.fix; //нельзя удалять!
		return object;
	};
});


придется фиксить так:
//IE9-11 Object.create bug fix
(function () {
	var object = Object.create({});
	object[0] = null;
	return object.hasOwnProperty(0); //→ false in IE9-11
}()) || new function () {
	var create = Object.create;
	Object.create = function (prototype, properties) {
		function NOP() {}
		NOP.prototype = prototype;
		//Object.defineProperties fixes a bug
		return properties ? create(prototype, properties) : new NOP;
	};
};


Часовой пояс GMT +3, время: 19:23.