JavaScript: The Good Parts
Хочу поговорить о
видео курсе Douglas Crockford JavaScript Master Class http://oreilly.com/catalog/9780596809614 и книге javascript: The Good Parts http://oreilly.com/catalog/9780596517748 В принципе это одно и тоже. У меня возникли вопросы по ходу просмотра видео. Сомнения в том, а стоит ли применять то, что там советуется. Мне хочется узнать Ваше мнение. Те советы, которые вызвали сомнение: 1 - Чтобы сделать из строки число делать так +x. Когда я был на Мастер Классах Ильи Кантора, он тоже про это говорил. Также этот метод есть во Флэнагане. Я уже и сам не помню когда делал из строки число. Просто мне это не надо. Но такой способ напоминает хак метод, а все хак методы - это плохо. Лучше их избегать. 2 - Советуется вместо вот этого for(var i=0;i<1000000000;i++){} Делать вот так for(var i=0;i<1000000000;i+=1){} Или даже вот так(не помню было это или нет, но вроде было) var i; for(i=0;i<1000000000;i++){} Вроде бы утверждалось, что так быстрее. Проверил на производительность в браузерах.
var t1 = new Date().getTime();
var a=0;
for(var i=0;i<1000000;i+=1){
a+=i;
}
var t2 = new Date().getTime();
console.log(t2-t1);
Производительность также. Даже проверил на NodeJS в 10 миллиардов итераций производительность одинаковая
var t1 = new Date().getTime();
var a=0;
for(var i=0;i<10000000000;i+=1){
a+=i;
}
var t2 = new Date().getTime();
console.log(t2-t1);
3 - Советуется не использовать ==, а использовать ===. Илья Кантор тоже про это говорил. И в книге Фленагана это тоже есть. Меня лично == никогда не подводил. Я понимаю в чем разница между == и === и меня == вполне устраивает. Также приводился пример Что 0.1+0.2 === 0.3 false 0.1+0.2 == 0.3 false И у Ильи это было и во Фленагане тоже есть. С этим спора нет. Вот наверное и всё, что запомнилось необычного и с чем в той или иной форме не согласен. Теперь Ваше мнение. |
1. +n - способ изначально предусмотренный языком.
2. Глупости.) 3. На счет === это вы зря, вещь весьма нужная. Самый частый случай: alert(0=='') alert(0==='') |
1. c +n могут быть фокусы:
-n или даже n*1.
alert('2'+'1'); //21 опа
alert('2'+'1'*1); //21 опа
alert('2'*1+'1'*1); //3
alert('2'-'1'); //1
|
Цитата:
|
Цитата:
alert((+'2')+(+'1')); //3 но для меня такой код менее очевиден, чем *1. Или здесь что-то кроется? |
2. Вообще говоря, ++i и i+=1 быстрее, чем i++, но современные JS движки умеют выполнять целую массу всевозможных оптимизаций, так что можно не париться.
|
Цитата:
|
Цитата:
for(var i = 0, j = 10; i < j; ++i); for(var i = 10; i--;); var i = 10; while(i--); var i = 10; while(i-- > 0); //этот кстати самый быстрый var i = -1; while(++i < 10); Цитата:
Цитата:
alert([undefined == null, undefined === null]); Цитата:
|
Цитата:
alert(+'2'++'1') такой пример больше подойдет? |
Цитата:
|
Цитата:
|
Цитата:
только если пробел поставить alert(+'2'+ +'1') //3 |
я об этом и говорю, легко опечататься, да и много + сбивает с толку, я предпочитаю не ошибаться там где можно этого не делать. Для меня + тоже что и в php . А точкой в php я типы не привожу.
|
Gozar, унарный плюс перед строкой, равно как и унарный минус, приводит её к числу. Аналогично все бинарные операции приводят свои операнды к числам. И строки не являются исключением. Исключением в этом плане является бинарный плюс, который конкатенирует операнды, если хотя бы один из них - строка. Операторы инкремента/декремента, как префиксные, так и постфиксные, также приводят оператор к числу.
Все ваши примеры прекрасно подходят под то, что я сейчас сказал:
alert('2'+'1'); // конкатенация, оба оператора - строки, т.е. результат - 21, строка
alert('2'+'1'*1); // конкатенация. Левый оператор - строка, правый приводится к числу, умножается на единицу, потом приводится к строке и конкатенирует со строкой "2". Результат - 21, строка.
alert('2'*1+'1'*1); // оба оператора приводятся к числам, умножаются на единицу, и складываются. Результат - 3, число.
alert('2'-'1'); // оба оператора приводятся к числам, и из левого вычитается правый. Результат - 1, число.
alert((+'2')+(+'1')); // оба оператора приводятся к числам с помощью унарного плюса и складываются. Результат - 3, число.
alert(+'2'++'1') // строка "2", приводится к числу. Строка "1" приводится к числу и инкрементирует. Фактически, данный пример аналогичен такому:
alert(2++1) // я думаю, никого не удивляет, почему тут ошибка.
P. S. Естественно, что всё это действует только в JS. |
trikadin,
Зачем расписывать то, что и так очевидно. Демагогию разводишь? Я говорю о том что использование унарного + для приведения строки к числу неоправдано и может приводить к ошибкам замедленного действия, а ты нафига пересказываешь то, что и так понятно? |
Эм... Я, видимо, не совсем тебя понял) Извини... Ну, может кому полезно будет.
Не знаю... Мне кажется, это вопрос размера проекта. Если надо написать одну функцию - то я плюс поставлю (унарный :)). Если десять - то parseFloat, parseInt и т.д. Для большей лёгкости отслеживания ошибок и читаемости кода. |
Если не ошибаюсь были еще такие примеры.
1 - Для проверки определенна ли переменная/метод делать так.
var a;
if(a !== undefined){
}
Я делаю так
var a;
if(!a){
}
2 - Упоминалось, что склейка строк с помощью join быстрее. На мастер классах Ильи Кантора, тоже что-то про это слышал, но уже забыл. Проверил join, может я не так что-то делаю, но получается медленней
var str = '',
t1 = +new Date();
for(var i=0;i<10000;i++){
str = ['a',str,'a'].join('');
}
var t2 = +new Date();
alert(t2-t1);
var str = '',
t1 = +new Date();
for(var i=0;i<10000;i++){
str = 'a'+str+'a';
}
var t2 = +new Date();
alert(t2-t1);
|
Цитата:
|
Цитата:
Цитата:
|
Цитата:
первый пример - 86 второй - 13 Цитата:
Цитата:
var str = '',
arr = [];
for(var i=0;i<10000;i++){
arr.push('abcdefg');
}
t1 = +new Date();
str = arr.join('');
var t2 = +new Date();
alert(t2-t1);
|
0 ^_^
|
| Часовой пояс GMT +3, время: 06:19. |