4 ms·
I think "value | 0" is basically same as "Math.floor(value)"
by pakastin 11y ago
I think "value | 0" is basically same as "Math.floor(value)"
- ZitchDog 11y agoYes, but it is 18% faster do run the bitwise or on my machine: https://jsperf.com/or-vs-floor/2 https://jsperf.com/or-vs-floor/2
- ldesegur 11y agoi/13|undefined works too
- logicallee 11y agoplus i/13|undefined has that "this was originally written in javascript, not ported halfheartedly from some other language" feel. (Well, maybe PHP.)
- ygra 11y agoThat's just adding another conversion from undefined to Number to Int32 for the right operand. You could probably use false as well. Or the empty string.
- Stormcaller 11y agoIts because they don't do the same thing Math.floor() favors the number equal to/less than the parameter, Math.floor(-15.5) is -16 while (-15.5 | 0) is -15 Also because the returned value is int32[0], Math.floor(2147483648.5) is 2147483648 while (2147483648.5 | 0) is -2147483648 You are fine if you know the input is less than (2^31) + 1 and you want to truncate, rather than floor. [0]: http://www.ecma-international.org/ecma-262/6.0/#sec-binary-bitwise-operators-runtime-semantics-evaluation http://www.ecma-international.org/ecma-262/6.0/#sec-binary-b...
- nkron 11y agoECMAScript 2016 adds Math.trunc()[0] which should give the same value as | 0 for inputs that fit in 32 bits. [0] http://www.javascripture.com/Math#trunc http://www.javascripture.com/Math#trunc
- 4Data 11y agoHmm, pretty sure floor rounds a number downward to its nearest integer. So Math.floor(-15.5) would be 15. https://developer.mozilla.org/pt-PT/docs/Web/JavaScript/Reference/Global_Objects/Math/floor https://developer.mozilla.org/pt-PT/docs/Web/JavaScript/Refe...
- catchmrbharath 11y agoNope. Math.floor(-15.5) would be -16. It rounds a number downwards. -16 < -15.
- Stormcaller 11y agoLiterally the first example on that page: > Math.floor( 45.95); // 45 > Math.floor(-45.95); // -46 Its not like its hidden or anything... Its in the center of the page on my 1920x1080 screen.
- jpollock 11y agoThere is no substantial difference in performance on mine (within 2%), although the OR was always a little bit faster. Chrome 45 on Linux It's odd that a bitwise operator should have the effect of truncating the float (since X|0 == X)? I'm guessing there's an implicit type conversion to int in the middle?
- TazeTSchnitzel 11y agoThe bitwise operators don't make sense for floating-point values. So they work by converting to a 32-bit integer first.
- deleted 11y ago[deleted]
- aaronm67 11y agoAnd every time a developer sees that, they're going to google "bar javascript" "single bar javascript" "bitwise or javascript" "bitwise or javascript effect" until they figure out WTF is going on. This all to save a fraction of a microsecond on an operation that's called 60 times on the page.
- pkstn 11y agoActually only 52 :D But yeah, I agree about googling part: I remember having Googled "tilde javascript" and "pipe javascript".. :) Tilde is useful with indexOf: if (~array.indexOf(item)) {} ..equals to: if (array.indexOf(item) > -1) {}
- yellowapple 11y agoThis is the sort of thing that makes Perl readable in comparison to Javascript :)
- irascible 11y agogulp I guess I should stop using parseInt :/
- robocat 11y agovalue | 0 will always return a 32 bit integer. Math.floor(value) can return some weirder values such as: NaN (for anything that isn't a number), and Infinity, -Infinity, -0. And Math.floor(-1e-300); is -1 so care needs to be taken with floating values near zero.