Javascript-форум (https://javascript.ru/forum/)
-   Учебные материалы (https://javascript.ru/forum/study/)
-   -   JavaScript: The Good Parts (https://javascript.ru/forum/study/18455-javascript-good-parts.html)

mycoding 01.07.2011 12:29

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

И у Ильи это было и во Фленагане тоже есть.
С этим спора нет.

Вот наверное и всё, что запомнилось необычного и с чем в той или иной форме не согласен.

Теперь Ваше мнение.

Aetae 01.07.2011 13:14

1. +n - способ изначально предусмотренный языком.
2. Глупости.)
3. На счет === это вы зря, вещь весьма нужная.
Самый частый случай:
alert(0=='')
alert(0==='')

Gozar 01.07.2011 17:04

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

Kolyaj 01.07.2011 17:22

Цитата:

Сообщение от Gozar
1. c +n могут быть фокусы:

Унарный и бинарный плюс -- разные операторы.

Gozar 01.07.2011 17:53

Цитата:

Сообщение от Kolyaj (Сообщение 111387)
Унарный и бинарный плюс -- разные операторы.

а что?
alert((+'2')+(+'1'));        //3

но для меня такой код менее очевиден, чем *1. Или здесь что-то кроется?

B@rmaley.e><e 01.07.2011 18:06

2. Вообще говоря, ++i и i+=1 быстрее, чем i++, но современные JS движки умеют выполнять целую массу всевозможных оптимизаций, так что можно не париться.

Kolyaj 01.07.2011 18:36

Цитата:

Сообщение от Gozar
а что?

Что а что? mycoding пишет про унарный плюс, а вы приводите примеры по бинарный.

monolithed 01.07.2011 18:42

Цитата:

Сообщение от mycoding
for(var i=0;i<1000000000;i+=1){}

вариантов этого цикла множество.
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);

Цитата:

Сообщение от mycoding
+x.
Но такой способ напоминает хак метод, а все хак методы - это плохо.
Лучше их избегать.

т.е. корректней приводить значение с помощью Number(), parseInt() ...?.
Цитата:

Сообщение от mycoding
3 - Советуется не использовать ==, а использовать ===.

там где это важно - да.
alert([undefined == null, undefined === null]);

Цитата:

Сообщение от mycoding
0.1+0.2 === 0.3 false
0.1+0.2 == 0.3 false

ну так

Gozar 01.07.2011 19:21

Цитата:

Сообщение от Kolyaj (Сообщение 111402)
Что а что? mycoding пишет про унарный плюс, а вы приводите примеры по бинарный.

alert(+'2'++'1')

такой пример больше подойдет?

Kolyaj 01.07.2011 20:25

Цитата:

Сообщение от Gozar
такой пример больше подойдет?

Нет. Теперь тут инкремент :)

Gozar 01.07.2011 20:56

Цитата:

Сообщение от Kolyaj (Сообщение 111424)
Нет. Теперь тут инкремент :)

Нет, как раз подойдет. В этом весь смысл. :D ^^

monolithed 01.07.2011 22:26

Цитата:

Сообщение от Gozar
Нет, как раз подойдет.

SyntaxError
только если пробел поставить
alert(+'2'+ +'1') //3

Gozar 01.07.2011 23:49

я об этом и говорю, легко опечататься, да и много + сбивает с толку, я предпочитаю не ошибаться там где можно этого не делать. Для меня + тоже что и в php . А точкой в php я типы не привожу.

trikadin 01.07.2011 23:58

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.

Gozar 02.07.2011 00:13

trikadin,
Зачем расписывать то, что и так очевидно. Демагогию разводишь? Я говорю о том что использование унарного + для приведения строки к числу неоправдано и может приводить к ошибкам замедленного действия, а ты нафига пересказываешь то, что и так понятно?

trikadin 02.07.2011 00:24

Эм... Я, видимо, не совсем тебя понял) Извини... Ну, может кому полезно будет.

Не знаю... Мне кажется, это вопрос размера проекта. Если надо написать одну функцию - то я плюс поставлю (унарный :)). Если десять - то parseFloat, parseInt и т.д. Для большей лёгкости отслеживания ошибок и читаемости кода.

mycoding 09.07.2011 22:04

Если не ошибаюсь были еще такие примеры.
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);

B@rmaley.e><e 09.07.2011 22:32

Цитата:

Сообщение от mycoding
Проверил join, может я не так что-то делаю, но получается медленней

В данном примере у меня (Opera 11.50) join быстрее в 10 раз.

Kolyaj 09.07.2011 22:33

Цитата:

Сообщение от mycoding
Для проверки определенна ли переменная/метод делать так.

А на запустить в своих же примерах нажать?


Цитата:

Сообщение от mycoding
Проверил join, может я не так что-то делаю, но получается медленней

Нужно не три строки 10000 раз склеить, а 10000 строк склеить.

mycoding 10.07.2011 09:55

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 112609)
В данном примере у меня (Opera 11.50) join быстрее в 10 раз.

У меня в Chrome
первый пример - 86
второй - 13

Цитата:

Сообщение от Kolyaj (Сообщение 112610)
А на запустить в своих же примерах нажать?

Подправил.

Цитата:

Сообщение от Kolyaj (Сообщение 112610)
Нужно не три строки 10000 раз склеить, а 10000 строк склеить.

Понял

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);

melky 10.07.2011 10:07

0 ^_^


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