首先,布尔值是一个js的基础数据类型,是可以参与正常比较的,但
奇怪的是Boolean被用作一个构造函数时,它返回的不是一个boolean值,而是一个对象:
// Outputs: trueconsole.log(primitiveTrue);// Outputs: trueconsole.log(functionTrue);// Outputs: Boolean {}console.log(constructorTrue);//Outputs booleanconsole.log(typeof primitiveTrue);// Outputs: objectconsole.log(typeof constructorTrue);
事实证明,使用布尔构造函数是相当危险的。为什么呢?JavaScript有关强制类型转换是想当激进的。如果您尝试把一个字符串和一个数字相加,这个数字将被强制转换为字符串。
并且,如果在if语句中尝试使用一个对象,对象将被强制转换为true。而且,由于Boolean对象是一个对象,它也将强制为true,即使它的值是false。
// Outputs: "Objects coerce to true."if ({}) { console.log("Objects coerce to true."); }//或者let a = new Boolean() // a默认是一个值为false的对象 : {Boolean:false}//但是记住a是一个对象,如果进入if判断if(a){console.log('a是一个对象') //成功输出,即使a是一个false的对象}
上例中,因为a是一个对象而不是一个布尔类型的值,所以即使a对象里的值是false,但他本身不是,所以仍然被 if当成一个true来对待!
由于存在这样的现象,所以我们平时定义boolean、number、string值时,建议使用字面量的形式定义。同时在一些代码检测工具(jshint/jsLint)中,使用构造函数初始化时,会报错。
