若是算术运算的值不是数值,那么js
后台会先使用Number()
转型函数将其转换为数值:node
var num = 1 + NaN;//NaN,只要有一个NaNny就为NaN var num = 10 + '10';//1010,'+'为字符串链接符,有字符串就不是加法 var box = '你的岁数是:'+10+10;//你的岁数是:1010,被转换成字符串 var box = '你的岁数是'+(10+10);//你的岁数是:20,没有被转换成字符串 var box = 10+10+'是你的岁数';//20是你的岁数,没有被转换成字符串
第一个操做数 | 第二个操做数 | 结果 |
---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
若是两边的操做数有一个操做数不是布尔值的状况下,与运算符就不必定返回布尔值,此时,遵循如下规则:函数
1. 第一个操做数是对象,则返回第二个操做数 2. 第二个操做数是对象,则第一个操做数返回true,才返回第二个操做数,不然返回false; 3. 有一个操做数是null,则返回null; 4. 有一个操做数是undefined,则返回undefined。 var box = 对象 && (5>4);//true,返回第二个操做数 var box = (5>4)&&对象;//[object Object] var box = (3>4)&&对象;//false var box = (5>4)&&null;//null
var result = true || false;
与逻辑与操做类似,若是有一个操做数不是布尔值,逻辑或也不必定返回布尔值;此时,它遵循下列规则:编码
□ 若是第一个操做数是对象,则返回第一个操做数。 □ 若是第一个操做数求值为false,则返回第二个操做数。 □ 若是两个操做数都是对象,则返回第一个操做数。 □ 若是两个操做数都是null,返回null □ 若是两都为`undefined`,返`undefined`。 □ 若是两都为`NaN`,返`NaN` var box = 对象||(5>3);//[object Object] var box = (5>3)||对象;//true var box = 对象1 || 对象2;//[object Object] var box = null || null;//null var box = NaN || NaN;//NaN var box = undefined || undefined;//undefined
逻辑非运算符能够用于任何值。不管这个值是什么数据类型,这个运算符都会返回一个布尔值。它会先将这个值转换成布尔值,而后取反,规则以下:spa
1. 操做数是一个对象,返回false 2. 操做数是一个空字符串,返回true 3. 操做数是一个非空字符串,返回false 4. 操做数是数值0,返回true 5. 操做数是任意非0数值(包括Infinity),false 6. 操做数是null,返回true 7. 操做数是NaN,返回true 8. 操做数是undefined,返回true var box = !{};//false var box = !'trigkit';//false var box = !0;//true var box = !null;//true var box = !NaN;//true var box = !8;//false
对于双感叹号!!
的写法实际上是Boolean()
的简写法。好比下面是来自underscore.js
的一段源码:code
// Is a given value a DOM element? _.isElement = function(obj) { return !!(obj && obj.nodeType === 1); };
返回的值就是布尔值对象
1.两个操做数都是数值,则进行数值比较 2.两个操做数都是字符串,则比较两个字符串对应的字符编码值 3.两个操做数有一个是数值,则将另外一个转换为数值,再进行数值比较 4.两个操做数有一个是对象,则先调用valueOf()方法或toString()方法,再用结果比较 var num = '3'>22;//false var num = '3'>'22';//true,进行第一个数字的比较3>2,因此是true var num = 'a'>'b';//false,a=97,b=98,ASCII表 var num = 'a'>'B';//true,B=66
相等操做符会对操做值进行隐式转换后进行比较:blog
1.若是一个操做值为布尔值,则在比较以前先将其转换为数值,false转成0,true为1; 2.若是一个操做值为字符串,另外一个操做值为数值,则经过Number()函数将字符串转换为数值 3.若是一个操做值是对象,另外一个不是,则调用对象的valueOf()方法,获得的结果按照前面的规则进行比较 4.null与undefined是相等的 5.若是一个操做值为NaN,则相等比较返回false 6.若是两个操做值都是对象,则比较它们是否是指向同一个对象。若是两个操做数都指向同一个对象,则相等操做符返回true,不然,返回false 7.在全等和不全等的判断上,只有值和类型都相等,才返回true,不然返回false;
看下面的实例:图片
var num =2==2;//true var num = '2'==2;//true,'2'会转成数值2 var num = false ==0;//true,false转成数值就是0 var num = 'a'=='A';//false,转换后的编码不同 var num = 2==NaN;//false,只要有NaN,都是false var num = {}=={};//false,比较的是他们的地址,每一个新建立对象的引用地址都不一样 var age = {}; var height = age; var box = age == height;//true,引用地址同样,因此相等
分享一张网上找的思惟导图:element