http://www.jb51.net/article/48881.htm

经常看到这样的例子:

var a;
var b=!!a;

a默认是undefined。!a是true,!!a则是false,所以b的值是false,而不再是undefined,也非其它值,主要是为后续判断提供便利。

!!一般用来将后面的表达式强制转换为布尔类型的数据(boolean),也就是只能是true或者false; 
因为javascript是弱类型的语言(变量没有固定的数据类型)所以有时需要强制转换为相应的类型,类似的如:

a=parseInt(“1234″)
a=”1234″-0 //转换为数字
b=1234+”” //转换为字符串
c=someObject.toString() //将对象转换为字符串

其中第1种、第4种为显式转换,2、3为隐式转换

布尔型的转换,javascript约定规则为

false、undefinded、null、0、”” 为 false 
true、1、”somestring”、[Object] 为 true

对null与undefined等其他用隐式转换的值,用!操作符时都会产生true的结果,所以用两个感叹号的作用就在于将这些值转换为“等价”的布尔值; 
再来看看:

var foo;
alert(!foo);//undifined情况下,一个感叹号返回的是true;
alert(!goo);//null情况下,一个感叹号返回的也是true;
var o={flag:true};
var test=!!o.flag;//等效于var test=o.flag||false;
alert(test);

这段例子,演示了在undifined和null时,用一个感叹号返回的都是true,用两个感叹号返回的就是false,所以两个感叹号的作用就在于,如果明确设置了变量的值(非null/undifined/0/”“等值),结果就会根据变量的实际值来返回,如果没有设置,结果就会返回false。

最新文章

  1. 字符串和datatime.time类型转为秒
  2. Apworks框架实战(三):单元测试与持续集成
  3. iOS语音
  4. html ul li的学习
  5. HTML 学习笔记 JavaScript (实现)
  6. go 的 protoc 插件调用逻辑
  7. 关于Ruby的一些知识
  8. 用Delphi的TIdHttp控件发起POST请求和Java的Servlet响应
  9. mac apktool配置
  10. 初识 go 语言:数据类型
  11. .gitignore文件的配置和生效
  12. NOIp2018 复习笔记
  13. javascript转义unicode十六进制编码且带有反斜杠后的html
  14. THINKPHP5近期暴露的漏洞
  15. keepalive的工作原理和如何做到健康检查
  16. Python面向对象高级编程-__slots__、定制类,枚举
  17. 十五. Python基础(15)--内置函数-1
  18. Java并发编程:Java Thread 的 run() 与 start() 的区别
  19. (转)Python科学计算之Pandas详解,pythonpandas
  20. JavaWeb基础—Http协议

热门文章

  1. 新安装的金蝶K3软件,初始化后,在基础资料中对于币别,科目,部门,客户等资料均无法新增,无法引出,等操作,K3CASysSet.dll
  2. 获取input光标的x和y轴
  3. FAT12中,如何定位大于一个扇区(512B)的文件内容
  4. EF6&EFCore 注册/使用实体类的正确姿势
  5. iOS 逆向 - Class-dump 安装和使用方法
  6. 【BZOJ2654】tree 二分+最小生成树
  7. scrapy架构解析
  8. mac sublime text 3 add ctags plugin
  9. 为什么需要onRoute函数?
  10. Tomcat学习笔记【5】--- 项目部署详解