String
,Number
,Boolean
,null
,undefined
和 Symbol
。然而,当我们需要在这些基本类型上调用方法时,就需要用到 JavaScript 的包装类型。String
,Number
和 Boolean
。var str = 'hello';
console.log(str.toUpperCase()); // 输出 "HELLO"
str
是一个字符串基本类型,但我们可以在它上面调用 toUpperCase
方法。这是因为 JavaScript 在后台临时将 str
包装成了一个 String
对象,然后在这个对象上调用了 toUpperCase
方法。null
和 undefined
也是基本类型,但它们没有对应的包装类型,也没有可以调用的方法。Boolean
对象是一个包装类型,但它在布尔上下文中总是被视为 true
,无论它包装的值是 true
还是 false
。这可能会导致一些意想不到的结果。var bool = new Boolean(false);
if (bool) {
console.log('run?'); // 会进到 if 条件里面吗?
}
bool
是一个 Boolean
对象,其包装的值为 false
。然而,因为 bool
是一个对象,所以在 if
语句中,它被视为 true
,所以 console.log
语句总是会执行。所以打印出 run?
。var a = new Boolean(false);
if (!a) {
console.log('run?'); // 会进到 if 条件里面吗?
}
// 个人的解析过程:
1. var a = new Boolean(false); 之后,a 的值为 [Boolean: false]
2. 将 a 转换为包装类型,执行 Object(a) 后值为 [Boolean: false]
3. 因为在 if 语句中的判断条件都会转换为 boolean 再进行判断,那再进行 boolean 值的转换, !!Object(a) 后值为 true
4. 而在 if 语句中的条件是取反 a,则 if 条件不成立,则 if 中的语句不执行
(true 或 false)
和 Boolean
对象(通过 new Boolean()
创建的,它是一个包装对象,可以包装一个布尔值,但它本身是一个对象)。Boolean
对象)在布尔上下文中都被视为 true
,无论它们包装的值是 true
还是 false
。!a
不会执行的原因,因为 a
是一个 Boolean
对象,即使它包装的值是 false
,在布尔上下文中也被视为 true
,所以 !a
的结果是 false
。