isRegistered不返回true

时间:2013-10-16 16:23:24

标签: javascript jquery

以下代码应在sname中打印出字符串,但它没有这样做。根本没有丢失任何错误?

var Student = function(name, fee) {  
    if(fee >= 1000) { 
       this.registered = new Boolean(true);
    } else {
       this.registered = 'not rgistered yet'; 
    }
}  

Student.prototype.isRegistered = function() {
    return this.registered; 
}

var John = new Student('John', 1000);

if(John.isRegistered() === true) {
    $('#sname').text('John is now a registered student');
}  

3 个答案:

答案 0 :(得分:5)

<强> Working DEMO

你的问题在于以下几行:

this.registered = new Boolean(true);

永远不要在JS中使用new和原始类型。这可以通过更少的击键来完成:

this.registered = true;

new boolean(false)返回一个对象,该对象具有valueOf方法,返回包装值而不是实际预期值,在这种情况下为true

答案 1 :(得分:3)

new Boolean(true)创建一个boolean类型的对象。所以===失败了,因为它也进行了类型检查。实际上typeof new Boolean(true)object而不是boolean。所以你需要使用valueOf()方法获取值,该方法返回对象的原始布尔值。

对于您的代码,您应该这样做:

if(John.isRegistered().valueOf() === true) {

否则只需将其更改为原始布尔值。

if(fee >= 1000) { 
   this.registered = true;

答案 2 :(得分:2)

new Boolean(true) === true; // false

原因很复杂,但修复很简单。

没有充分理由强行使用BooleanStringArray等简单对象。大多数浏览器都会优化简单形式:true,{ {1}},""

如果你正在进行原型设计,它可能会有用,但无论如何你都不能使用[]