首先,布尔值是一个js的基础数据类型,是可以参与正常比较的,但
    奇怪的是Boolean被用作一个构造函数时,它返回的不是一个boolean值,而是一个对象:

    1. // Outputs: true
    2. console.log(primitiveTrue);
    3. // Outputs: true
    4. console.log(functionTrue);
    5. // Outputs: Boolean {}
    6. console.log(constructorTrue);
    7. //Outputs boolean
    8. console.log(typeof primitiveTrue);
    9. // Outputs: object
    10. console.log(typeof constructorTrue);

    事实证明,使用布尔构造函数是相当危险的。为什么呢?JavaScript有关强制类型转换是想当激进的。如果您尝试把一个字符串和一个数字相加,这个数字将被强制转换为字符串。

    并且,如果在if语句中尝试使用一个对象,对象将被强制转换为true。而且,由于Boolean对象是一个对象,它也将强制为true,即使它的值是false。

    1. // Outputs: "Objects coerce to true."
    2. if ({}) { console.log("Objects coerce to true."); }
    3. //或者
    4. let a = new Boolean() // a默认是一个值为false的对象 : {Boolean:false}
    5. //但是记住a是一个对象,如果进入if判断
    6. if(a){
    7. console.log('a是一个对象') //成功输出,即使a是一个false的对象
    8. }

    上例中,因为a是一个对象而不是一个布尔类型的值,所以即使a对象里的值是false,但他本身不是,所以仍然被 if当成一个true来对待!

    由于存在这样的现象,所以我们平时定义boolean、number、string值时,建议使用字面量的形式定义。同时在一些代码检测工具(jshint/jsLint)中,使用构造函数初始化时,会报错。