Впервые на неё я обратил внимание, когда переводил 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; // или не пустая
Итак, во-первых, перед нами удобное средство отбрасывания дробной части.
- По отношению к отрицательным числам оно полезно тем, что дробное число превращается не в ближайшее меньшее целое число (возрастая по модулю), а в ближайшее меньшее по модулю целое число (возрастая по значению). Нередко именно это и требуется.
- По отношению к положительным числам оно полезно уж тем одним,
что конструкция «|0» более чем на порядок короче по сравнениюс «Math.floor()». Поэтому она может и должна вызывать у разработчиков привыкание не меньшее, чем та принятая в jQueryзапись «$()», о которой я говорил четыре дня назад, что с неё никто добровольно не перейдёт обратнона «document.getElementsByClassName()», например.
Во-вторых, перед нами удобное средство преобразования различных типов к целым числам.
- Оно умеет выковыривать целые числа (и отбрасывать дробную часть у дробных чисел), извлекая их из строк (с отбрасыванием начальных и конечных пробелов) и даже из одноэлементных массивов.
- По отношению к данным всех остальных типов (которые не умеет извлечь) это средство действует как универсальный обнулитель. Нередко именно это и требуется.
Наблюдая действие этого средства, следует сопоставлять его с тем приёмом
При таком сопоставлении тотчас явствует, что плюс преобразует
Рекомендую этот приём к широкому применению в вашем джаваскриптовом коде по мере нужды.
ссылка на оригинал статьи http://habrahabr.ru/post/172731/
Добавить комментарий