我们如何在JavaScript中创建类似布尔的对象?

时间:2011-05-17 06:54:35

标签: javascript

我想创建类似布尔的对象。 但我不想污染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或其他任何内容。

提前致谢。

3 个答案:

答案 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是一个对象,因此存在,因此是真的。