Because this is (somewhat sadly) how the language was defined -- I suspect it was originally for performance/optimization; note the case of assignment to a string
property below. (Java works similarly, although Scala and Python largely reject this distinction).
Note that Boolean
isn't the only "wrapper type". There are also String
and Number
, for instance.
Because of this there remains a number of quirks (the below could just as much apply to Boolean):
typeof("foo") // string
typeof(new String("foo")) // object
"foo" instanceof String // false
new String("foo") instanceof String // true
// result is undefined: a string is a primitive and silently "ate" the assignment
// this also makes it a much cheaper value as it's not a "real" object
x = "f"; x.bar = 42; x.bar
// result is 42: a String is a "real" object with real properties!
// however, this also means that it may have a good bit more overhead
x = new String("f"); x.bar = 42; x.bar
I know this didn't "answer" the question, but rather chucks some more wood on the fire ;-)
The only real "gotcha" otherwise from the above is that perhaps new Boolean(false)
is a truth-y value.
Happy coding.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…