1

下面的代码应该打印出字符串,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');
}  
4

3 回答 3

5

工作演示

您的问题在于以下行:

this.registered = new Boolean(true);

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

this.registered = true;

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

于 2013-10-16T16:24:11.990 回答
3

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

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

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

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

if(fee >= 1000) { 
   this.registered = true;
于 2013-10-16T16:26:31.080 回答
2
new Boolean(true) === true; // false

原因很复杂,但解决方法很简单。

Boolean强制使用简单对象(如,String等)并不是一个很好的理由Array。大多数浏览器都会优化简单形式:true, "", []

===如果您正在着手进行原型设计,它可能会很有用,但无论如何您都无法使用。

于 2013-10-16T16:24:16.920 回答