Why is implicit casting so much faster than explicit in JS? Is implicit casting good practice?

I know cleaner and nicer types, like String(1234)and Number("1234"), but I just tried to compare alternative ways to do the same, in particular "" + 1234 // -> "1234"and - - "1234" // -> 1234.

The results were quite unexpected (for me). I iterated over every path 100,000,000 times in Chrome.

I used this simple code.

var then = Date.now(); 
for (var i = 0; i < 100000000; ++i) {
    var a = - - "1234";
}; 
console.log(Date.now() - then);

Number("1234")It took 2351 ms, while it - - "1234"took only 748 ms.

Similarly, on the contrary, it String(1234)took 3701 ms, while it "" + 1234took only 893 ms.

The difference is surprisingly huge.

My questions are: what makes explicit casting so slower than implicit casting? My intuition tells me that it should be the other way around.

? - - "1234"? ?

PS: Firefox. 500 ( ). ? - ? , .

+4
2

, i , :

console.time('a');
for (var i = 0; i < 1e7; ++i) {
    var a = String(i);
}; 
console.timeEnd('a');
console.time('b');
for (var i = 0; i < 1e7; ++i) {
    var a = "" + i;
}; 
console.timeEnd('b');

:

a: 1062.192ms
b: 884.535ms

. 10. 100000000 === 1e8 1e7.

, , , .

Number(...) :

console.time('a');
for (var i = 0; i < 1e7; ++i) {
    var a = - - ("" + i);
}; 
console.timeEnd('a');
console.time('b');
for (var i = 0; i < 1e7; ++i) {
    var a = Number("" + i);
}; 
console.timeEnd('b');

:

a: 2010.903ms
b: 1557.735ms
+3

+ - , Number String, ToNumber ToString , .

, , , Number(x) +x, , - .

, ? , .

, , , . , , .

? - "1234"? ?

-'1234', "", - Number , x - -y.

+ +, +x Number(x). :

x + +y

.

+3

All Articles