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。