!!表达式为布尔值

时间:2012-02-21 14:43:25

标签: javascript

我正在阅读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."
)

1 个答案:

答案 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