- PVSM.RU - https://www.pvsm.ru -
Заголовок, выраженный словами, понадобился только для поисковой находимости. Но речь пойдёт о роли символьной конструкции «|0» в JavaScript.
Впервые на неё я обратил внимание, когда переводил FAQ про asm.js [1] и читал спецификации [2] этого подмножества языка JavaScript. Там «|0» служит, например, для указания типа [3] значения, возвращаемого из функции: увидели «|0» после значения — значит, перед нами знаковое целое.
Вдругорядь я заметил конструкцию «|0» в примере кода [4] на Гитхабе, где происходило преобразование к целому числу результата деления на 1024².
Тогда глаза мои открылись, и я увидел прекрасные возможности:
( 3|0 ) === 3; // целые числа не изменяет
( 3.3|0 ) === 3; // у дробных чисел отбрасывает дробную часть
( 3.8|0 ) === 3; // не округляет, а именно отбрасывает дробную часть
( -3.3|0 ) === -3; // в том числе и у отрицательных дробных чисел
( -3.8|0 ) === -3; // у которых Math.floor(-3.3) == Math.floor(-3.8) == -4
( "3"|0 ) === 3; // строки с числами преобразуются к целым числам
( "3.8"|0 ) === 3; // при этом опять же отбрасывается дробная часть
( "-3.8"|0 ) === -3; // в том числе и у отрицательных дробных чисел
( NaN|0 ) === 0; // NaN приводится к нулю
( Infinity|0 ) === 0; // приведение к нулю происходит и с бесконечностью,
( -Infinity|0 ) === 0; // и с минус бесконечностью,
( null|0 ) === 0; // и с null,
( (void 0)|0 ) === 0; // и с undefined,
( []|0 ) === 0; // и с пустым массивом,
( [3]|0 ) === 3; // но массив с одним числом приводится к числу,
( [-3.8]|0 ) === -3; // в том числе с отбрасыванием дробной части,
( [" -3.8 "]|0 ) === -3; // и в том числе с извлечением чисел из строк,
( [-3.8, 22]|0 ) === 0 // но массив с несколькими числами вновь зануляется
( {}|0 ) === 0; // к нулю также приводится пустой объект
( {'2':'3'}|0 ) === 0; // или не пустой
( (function(){})|0 ) === 0; // к нулю также приводится пустая функция
( (function(){ return 3;})|0 ) === 0; // или не пустая
Итак, во-первых, перед нами удобное средство отбрасывания дробной части.
Во-вторых, перед нами удобное средство преобразования различных типов к целым числам.
Наблюдая действие этого средства, следует сопоставлять его с тем приёмом («+» перед значением), который рекомендуется в «JavaScript Garden» [6] (а за ним и в «JavaScript Гарден» [7]) для преобразования к числу.
При таком сопоставлении тотчас явствует, что плюс преобразует к дробному числу, делая возможными и такие экзотические варианты дробных чисел, как минус бесконечность (получаемая, например, из «+[" -Infinity "]») или NaN (из «+{}»), тогда как «|0» преобразует к целому числу, и оттого экзотические варианты обнуляются.
Рекомендую этот приём к широкому применению в вашем джаваскриптовом коде по мере нужды.
Автор: Mithgol
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/29376
Ссылки в тексте:
[1] FAQ про asm.js: http://habrahabr.ru/post/171561/
[2] спецификации: http://asmjs.org/spec/latest
[3] для указания типа: http://asmjs.org/spec/latest/#return-type-annotations
[4] в примере кода: https://github.com/joyent/node/pull/4964#issuecomment-14760507
[5] четыре дня назад: http://habrahabr.ru/post/172041/#comment_5977027
[6] в «JavaScript Garden»: http://bonsaiden.github.com/JavaScript-Garden/#types.casting
[7] и в «JavaScript Гарден»: http://shamansir.github.com/JavaScript-Garden/#types.casting
[8] Источник: http://habrahabr.ru/post/172731/
Нажмите здесь для печати.