前言

首先需要知道的是,js中有6个值为false,分别是: 0, '', null, undefined, NaN 和 false, 其他(包括{}, [], Infinity)为true.

可以使用Boolean()函数或是两次取非就能获得对象的布尔值,例如Boolean(undefined)和!!undefined同样能取得布尔值false,

对于0, '', null, undefined, NaN,{}, [], Infinity求布尔值,分别是false false false false false true true true.

因此我们知道的一点是:对象的布尔值是true,即使是对象{}。

 boolean类型的特殊性

JS比较规则:

  • 如果比较的两者中有bool,会把 bool 先转换为对应的 number,即 0 和 1
  • 如果比较的双方中有一方为number一方为string,会把string转换为数字
  • 把string直接转换为bool的时候,空字符串‘'转换为 false,除此外的一切字符串转换为 true

例:

if ('0') alert("'0' is true");
if ('0' == false) alert("'0' is false"); 运行结果:两次都会alter

示例:

‘true’==true;为什么返回false

相等操作符

在转换不同的数据类型时,相等和不相等操作符遵循下列基本规则:
1. 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,而true转换为1;
2. 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
3. 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较;

首先 'true' == true 符合规则 1,这样就转化成了对 'true' == 1 进行求值

此时表达式符合规则 2

2. 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;

也就是说需要将 'true' 转换成数值之后,再与数字 1 进行比较。把 'true' 转换成数值是使用 Number 函数

Number 类型

Number()函数的转换规则如下。
1. 如果是Boolean值,true和false将分别被转换为1和0。
2. 如果是数字值,只是简单的传入和返回。
3. 如果是null值,返回0。
4. 如果是undefined,返回NaN。
5. 如果是字符串,遵循下列规则: 
5.1 如果字符串中只包含数字(包括前面带加号或负号的情况),则将其转换为十进制数值, 即"1"会变成1,"123"会变成123,而"011"会变成11(注意:前导的零被忽略了);
5.2 如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);
5.3 如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;
5.4 如果字符串是空的(不包含任何字符),则将其转换为0;
5.5 如果字符串中包含除上述格式之外的字符,则将其转换为NaN。

按照规则 5 和规则 5.5,Number('true') 的值为 NaN,也就是说现在的问题变成了对 NaN == 1 进行求值。

还是在这一节中,提到了

其次,NaN与任何值都不相等,包括NaN本身。

也就是说 NaN == 1 的值是 false。

最后捋一遍,'true' == true --> 'true' == 1 --> NaN == 1 --> false

!和!!的区别及用法

1. !可将变量转换成boolean类型,null、undefined和空字符串取反都为false,其余都为true。

!null=true

!undefined=true

!''=true

!100=false

!'abc'=false

2. !!常常用来做类型判断,在第一步!(变量)之后再做逻辑取反运算

let a;

if(a!=null&&typeof(a)!=undefined&&a!=''){

    //a有内容才执行的代码  

}

if(!!a){

    //a有内容才执行的代码...  

}
上面两种写法实现的功能一样,下面一种明显更简单
1.对null的"非"返回true

var temp = null;
alert(temp);
结果:null var temp = null;
alert(!temp);
结果:true var temp = null;
alert(!!temp);
结果:false 2.对undefined的"非"返回true var temp;
alert(temp);
结果:undefined var temp;
alert(!temp);
结果:true var temp;
alert(!!temp);
结果:false 3.对空字符串的"非"返回true var temp="";
alert(temp);
结果:空 var temp="";
alert(!temp);
结果:true var temp="";
alert(!!temp);
结果:false 4.对非零整型的"非"返回false var temp=1;
alert(temp);
结果:1 var temp=1;
alert(!temp);
结果:false var temp=1;
alert(!!temp);
结果:true 5.对0的"非"返回true var temp = 0;
alert(temp);
结果:0 var temp = 0;
alert(!temp);
结果:true var temp = 0;
alert(!!temp);
结果:false 6.对字符串的"非"返回false var temp="ab";
alert(temp);
结果:ab var temp="ab";
alert(!temp);
结果:false var temp="ab";
alert(!!temp);
结果:true 7.对数组的"非"返回false var temp=[1,2];
alert(temp);
结果:1,2 var temp=[1,2];
alert(!temp);
结果:false var temp=[1,2];
alert(!!temp);
结果:true

==和===的区别

1. ===:称为等同符,当两边值的类型相同时,直接比较值,若类型不相同,直接返回false;

2. ==:称为等值符,当等号两边的类型相同时,直接比较值是否相等,若不相同,则先转化为类型相同的值,再进行比较;

类型转换规则:

  1)如果等号两边是boolean、string、number三者中任意两者进行比较时,优先转换为数字进行比较。

  2)如果等号两边出现了null或undefined,null和undefined除了和自己相等,就彼此相等

注意:NaN==NaN  //返回false,NaN和所有值包括自己都不相等。

关于 null 和 undefined 有一些有趣的特性:

如果对值为 null 的变量使用 typeof 操作符的话,得到的结果是 object ;

而对 undefined 的值使用 typeof,得到的结果是 undefined 。

如 typeof null === "object" //true; typeof undefined === "undefined" //true null == undefined //true,但是 null !== undefined //true

typeof和instanceof用法:

typeof用以获取一个变量或者表达式的类型,typeof一般只能返回如下几个结果:

number,boolean,string,function(函数),object(NULL,数组,对象),undefined。

如:

alert(typeof (123));//typeof(123)  返回"number" 
alert(typeof ("123"));//typeof("123")  返回"string"

我们可以使用typeof来获取一个变量是否存在,如if(typeof a!="undefined"){},而不要去使用if(a)因为如果a不存在(未声明)则会出错,

正因为typeof遇到null,数组,对象时都会返回object类型,所以当我们要判断一个对象是否是数组时

或者判断某个变量是否是某个对象的实例则要选择使用另一个关键语法instanceof

instanceof用于判断一个变量是否某个对象的实例,如var a=new Array(); alert(a instanceof Array); 会返回true,

同时alert(a instanceof Object)也会返回true;这是因为Array是object的子类。

再如:function test(){};var a=new test();alert(a instanceof test)会返回true。

console.log(true instanceof Boolean); 返回false

console.log(new Boolean(true) instanceof Boolean);  返回true

JS中bool值转换与比较的更多相关文章

  1. js中的bool值转换及"&&" 、"||"、 "!!"详解

    bool值转换 数据类型 bool值转化 undefined undefined 转化为 false Object null 转化为false,其他为 true Boolean false 转化为 f ...

  2. js中的时间转换—毫秒转换成日期时间

    转自:http://www.javascript100.com/?p=181 前几天,在项目中遇到js时间增加问题,要将js毫秒时间转换成日期时间 var oldTime = (new Date(&q ...

  3. JS中应用正则表达式转换大小写

    JS中应用正则表达式转换大小写,代码很简单,看代码: 以下首字母大写,其它字母小写 <script type="text/javascript"> function r ...

  4. js 中 字符串的转换

    JS 中将 number 转换为 string 我们比较熟悉,直接用toString() 的方法就可以了:那么将 string 转换成为 number 都有些什么方法呢?如下便简单的列举了一些,以便记 ...

  5. js中把字符串转换成number格式方法

    方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有 ...

  6. js中json的转换

    //aa='{"id":0,"appId":"app***********Id","appSecret":"a ...

  7. js中的值类型和引用类型的区别

    1.JavaScript中的变量类型有哪些? (1)值类型(基本类型):字符串(String).数值(Number).布尔值(Boolean).Undefined.Null  (这5种基本数据类型是按 ...

  8. JS中原始值和引用值分析

    JS中变量中两种类型的值:原始值,引用值 原始值是存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置. var x = 1; //1就是一个原始值,变量x中存放的就是原始 ...

  9. 晨叔技术晨报: 你真的搞懂JS中的“值传递”和“引用传递”吗?

    晨叔周刊,每周一话题,技术天天涨. 本周的话题是JS的内存问题(加入本周话题,请点击传送门). 图 话题入口 今天的技术晨报来,就来谈谈JS中变量的,值传递和引用传递的问题.现在,对于很多的JSer来 ...

随机推荐

  1. 每天一个linux命令--ssh的host配置用户名密码

    1.在终端输入 cd ~/.ssh/ vi config 输入服务器的用户名和密码 souche@kickseed:~/.ssh$ cat config # 这是跳板机的配置,给跳板机的 IP 起个别 ...

  2. 如何查看当前工程,已经安装的nuget包?

    本文链接:https://blog.csdn.net/Microsoft_Mao/article/details/101161872如果想知道,当前解决方案(solution)里都安装了什么包,这里可 ...

  3. python 日志模块 日志格式

    形如: formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s","%Y%b%d-%H: ...

  4. Go操作Elasticsearch

    文章转自   Elasticsearch Elasticsearch 下载 https://www.elastic.co/cn/start 运行 解压后cd到解压目录 ./bin/elasticsea ...

  5. 购物单 && 动态规划 && 背包问题

    题目叙述的言语倒是蛮多的: 王强今天很开心,公司发给N元的年终奖.王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子: 主件 附件 电脑 ...

  6. php对字符串的操作3之 字符类型转换详解

    所有的数据输出到屏幕上,实际上被隐式的转换成了字符型,首先了解下各种数据类型的字符串表示 <?php echo 300,'<hr>'; echo true,'<hr>'; ...

  7. 安装VMware Tools和设置屏幕

    在虚拟机窗口的虚拟机-安装VMware Tools,点击安装,直到安装完成,出现以下界面 在主文件夹中新建VM文件夹,将VMware Tools中的VMwareTools-10.0.10-430167 ...

  8. 第二十六篇 玩转数据结构——二分搜索树(Binary Search Tree)

          1.. 二叉树 跟链表一样,二叉树也是一种动态数据结构,即,不需要在创建时指定大小. 跟链表不同的是,二叉树中的每个节点,除了要存放元素e,它还有两个指向其它节点的引用,分别用Node l ...

  9. robotframework初始化时有返回值怎么处理

    方法一:set suite variable/set global variable 假设执行add school class会返回一个id,这个id在后面的脚本中还要使用. 因为初始化时只能有一个关 ...

  10. 一段代码实现Aplayer+网易云音乐接口

    玩cnblogs的小伙伴可以将以下代码复制到页脚html当中哦 <!-- require APlayer --> <link rel="stylesheet" h ...