Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Функция toInt() разъясните, пожалуйста, несколько моментов (https://javascript.ru/forum/misc/22100-funkciya-toint-razyasnite-pozhalujjsta-neskolko-momentov.html)

GuardCat 06.10.2011 13:57

Функция toInt() разъясните, пожалуйста, несколько моментов
 
В комментариях к статье тут. Обнаружил функцию toInt. Мне она показалась странной и я решил разобраться. Учитывая, что я её, по итогам разбора, сократил, похоже где-то я ошибся. Приведу свои рассуждения, поправьте меня, корифеи!
Функция:
function toInt(number) {
return number && + number | 0 || 0;
}

Оператор && — обычное логическое "и". Вроде бы, если первый операнд ноль, то просто не выполняется побайтовая операция и возвращается первый операнд, что экономит процессорное время. Но! Операция | выполняется раньше, так что смысла в этом операторе не вижу.
Давайте взглянем на очерёдность выполнения операторов:
1. |
2. &&
3. ||
4. +
Плюс здесь для того, чтобы преобразовать операнд в число. Но использование оператора | и без того приводит операнды к числовому представлению. На мой взгляд, от плюса можно избавиться.
Оператор || возвращает то, что с левой стороны, если оно может быть преобразовано в true. Если же нет, возвращает то, что справа. В нашем же случае, если операнд не преобразуется в true, то операция "text"|0 и без того вернёт ноль.
Итак, функция, на мой взгляд, может быть записана так:
function toInt(number) {
   return number | 0;
}

Работает идентично, в том числе с Infinity и текстовыми значениями. которые я ей скормил.
Я прав или где-то ошибся?

Sweet 06.10.2011 14:07

Первый выриант - глупый, а во-втором - убрана вся глупость. Я в некоторых случаях пользуюсь | 0 для получения числа в любом случае, но делать для этого отдельную функцию как-то избыточно.

GuardCat 06.10.2011 14:30

Цитата:

Сообщение от Sweet (Сообщение 129873)
... но делать для этого отдельную функцию как-то избыточно.

Вот-вот. Что может быть короче |0 ?

nikita.mmf 07.10.2011 15:22

Хорошая функция, может еще также использовать ~~number, но эти неявные приведения типов не всегда хороши. Например
alert(~~'100px' + "\n" + parseInt('100px', 10));

Mips 25.10.2013 20:56

при | 0 дробные отбрасываются.
alert( '-2.7' | 0 );  //-2


рулит parseFloat(x)
http://jsfiddle.net/hC9Z9/1/

Vampir3 26.10.2013 16:01

function toInt(x) {
     return Number(x) || 0;
}
alert(typeof(toInt(1)));
alert(toInt('2.5'));
alert(toInt('test'))

danik.js 26.10.2013 16:24

Mips, Vampir3, вобще-то interger по определению - целое число )

Vampir3 26.10.2013 17:37

а, да, точняк)
запутали)

Vampir3 26.10.2013 20:39

function toInt(x) {
     return parseInt(x) | 0;
}


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