Заголовок, выраженный словами, понадобился только для поисковой находимости. Но речь пойдёт о роли символьной конструкции «|0» в JavaScript.
Впервые на неё я обратил внимание, когда переводил FAQ про asm.js и читал спецификации этого подмножества языка JavaScript. Там «|0» служит, например, для указания типа значения, возвращаемого из функции: увидели «|0» после значения — значит, перед нами знаковое целое.
Вдругорядь я заметил конструкцию «|0» в примере кода на Гитхабе, где происходило преобразование к целому числу результата деления на 1024².
Тогда глаза мои открылись, и я увидел прекрасные возможности:
( 3|0 ) === 3;
( 3.3|0 ) === 3;
( 3.8|0 ) === 3;
( -3.3|0 ) === -3;
( -3.8|0 ) === -3;
( "3"|0 ) === 3;
( "3.8"|0 ) === 3;
( "-3.8"|0 ) === -3;
( NaN|0 ) === 0;
( Infinity|0 ) === 0;
( -Infinity|0 ) === 0;
( null|0 ) === 0;
( (void 0)|0 ) === 0;
( []|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()», например.
Во-вторых, перед нами удобное средство преобразования различных типов к целым числам.
Читать полностью »