Заголовок, выраженный словами, понадобился только для поисковой находимости. Но речь пойдёт о роли символьной конструкции «|0» в JavaScript.
Впервые на неё я обратил внимание, когда переводил FAQ про asm.js и читал спецификации этого подмножества языка JavaScript.Там «|0» служит, например, для указания типа значения, возвращаемого из функции: увидели «|0» после значения — значит, перед нами знаковое целое.
Вдругорядь я заметилконструкцию «|0» в примере кода на Гитхабе, где происходило преобразование к целому числу результата деления на 1024².
Тогда глаза мои открылись, и я увидел прекрасные возможности:
Итак, во-первых, перед нами удобное средство отбрасывания дробной части.
Во-вторых, перед нами удобное средство преобразования различных типов к целым числам.
Наблюдая действие этого средства, следует сопоставлять его с тем приёмом(«+» перед значением), который рекомендуется в «JavaScript Garden» (а за ним и в «JavaScript Гарден») для преобразования к числу.
При таком сопоставлении тотчас явствует, что плюс преобразуетк дробному числу, делая возможными и такие экзотические варианты дробных чисел, как минус бесконечность (получаемая, например, из «+[" -Infinity "]») или NaN (из «+{}»), тогда как «|0» преобразует к целому числу, и оттого экзотические варианты обнуляются.
Рекомендую этот приём к широкому применению в вашем джаваскриптовом коде по мере нужды.
Впервые на неё я обратил внимание, когда переводил FAQ про asm.js и читал спецификации этого подмножества языка JavaScript.
Вдругорядь я заметил
Тогда глаза мои открылись, и я увидел прекрасные возможности:
( 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; // или не пустая
Итак, во-первых, перед нами удобное средство отбрасывания дробной части.
- По отношению к отрицательным числам оно полезно тем, что дробное число превращается не в ближайшее меньшее целое число (возрастая по модулю), как это случилось бы
после «Math.floor()», а в ближайшее меньшее по модулю целое число (возрастая по значению). Нередко именно это и требуется.
- По отношению к положительным числам оно полезно уж тем одним,
что конструкция «|0» более чем на порядок короче по сравнениюс «Math.floor()». Поэтому она может и должна вызывать у разработчиков привыкание не меньшее, чем та принятая в jQueryзапись «$()», о которой я говорил четыре дня назад, что с неё никто добровольно не перейдёт обратнона «document.getElementsByClassName()», например.
Во-вторых, перед нами удобное средство преобразования различных типов к целым числам.
- Оно умеет выковыривать целые числа (и отбрасывать дробную часть у дробных чисел), извлекая их из строк (с отбрасыванием начальных и конечных пробелов) и даже из одноэлементных массивов.
- По отношению к данным всех остальных типов (которые не умеет извлечь) это средство действует как универсальный обнулитель. Нередко именно это и требуется.
Наблюдая действие этого средства, следует сопоставлять его с тем приёмом
При таком сопоставлении тотчас явствует, что плюс преобразует
Рекомендую этот приём к широкому применению в вашем джаваскриптовом коде по мере нужды.