我正在阅读John Resig的 JavaScript Ninja的秘密并看到了这段代码:
function Ninja(){
this.swung = false;
// Should return true
this.swingSword = function(){
return !!this.swung;
};
}
我知道!!
用于将表达式转换为布尔值。但我的问题是他为什么使用:
return !!this.swung;
这不是多余的,因为swung
已经是一个布尔变量,或者我错过了什么?
BTW这里是完全相关的代码以防万一:
function Ninja(){
this.swung = false;
// Should return true
this.swingSword = function(){
return !!this.swung;
};
}
// Should return false, but will be overridden
Ninja.prototype.swingSword = function(){
return this.swung;
};
var ninja = new Ninja();
assert( ninja.swingSword(), "Calling the instance method, not the prototype method."
)
答案 0 :(得分:6)
this.swung
不是局部变量,而是Ninja
实例的属性。因此,可以通过外部方法修改属性。
为确保swingSword
始终返回布尔值,使用!!
进行显式转换非常有用。
至于您的代码:我认为它应该是!this.swung
,因为!!this.swung
会为false
返回this.swung = false
:
this.swung = false; // Defined in code
!!this.swung === !!false; // See previous line
!!false === !true; // Boolean logic
!true === false; // Boolean logic
false === this.swung; // See first line