我想创建类似布尔的对象。 但我不想污染Boolean.prototype。 所以我创建了像MyBool一样的
MyBool = function (x) {
this.value = x;
this.valueOf = function () { return x; };
this.toString = function () { return x; };
}
MyBool.prototype.and = function (y) {
if (y.constructor !== MyBool) throw 'You cannot do that!';
return this.value && y.value;
}
及其实例
mytrue = new MyBool(true);
myfalse = new MyBool(false);
但现在,我注意到了
if (myfalse) {
console.log ("myfalse is true!!!")
}
打印出myfalse是真的!!!
(然而+ myfalse(即[[ToNumber]]转换)来到falsy,感谢valueOf)
很明显,因为在ECMAScript中只有以下值是假的。
undefined, null, false, +0, -0, NaN, ''
如果Argument Type是Object,[[ToBoolean]]在任何情况下都会给我们带来真。 (参见ECMA类型转换和测试)
是否有任何狡猾的方法来创建一个虚假的对象? 没关系,如果
myfalse.constructor is MyBool
(!! myfalse) is false
欢迎任何作弊,包括ECMA5的set / get / defineProperty或其他任何内容。
提前致谢。
答案 0 :(得分:1)
如果你考虑的话,我认为目前不可能:
var myBool = new Boolean(false);
if (myBool) {
alert('Not false');
}
答案 1 :(得分:0)
回应你的评论,表明你想要一个严格的布尔值。为什么不使用相等运算符?
var someBoolean = false,
someObj = { };
if (someBoolean === false)
{
// tada, someBoolean is a boolean AND false
}
// Returns false because someObj is NOT a boolean
if (someObj === true)
{
..
}
答案 2 :(得分:-1)
了解if(myfalse){}
正在做什么。它正在检查myfalse
的存在,而不是它的真或假。在这种情况下,myfalse
是一个对象,因此存在,因此是真的。