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

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


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