Javascript's Nearly Unforgiveable Sins
Logic
Implicit conversion with ==
0=="0"
But no unboxing with ===
0!==new Number(0)
Equality is not transitive
"" == 0 0 == "0" "" != "0"
parseInt is not base ten!
parseInt("8"); //8 parseInt("08"); //0
Types and Objects don’t know about eachother
typeof "hello" === "string"; //true typeof new String("hello") === "string"; //false "hello" instanceof String; //false new String("hello") instanceof String; //true
No Actual Map
People use object literals {}
to construct map-like objects, but they’re not real maps! What they actually do is map the string conversion of the object. Look what happens when you try to nest objects inside objects:
> var a = {x:"a"} undefined > var b = {x:"b"} undefined > var obj = {} undefined > obj[a] = "a" "a" > obj[b] = "b" "b" > obj[a] "b"
Comments