以下代码应在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');
}
答案 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
原因很复杂,但修复很简单。
没有充分理由强行使用Boolean
,String
,Array
等简单对象。大多数浏览器都会优化简单形式:true
,{ {1}},""
。
如果你正在进行原型设计,它可能会有用,但无论如何你都不能使用[]
。