在使用逻辑and运算时,会发生一些奇妙的现象,我们来看看吧。
**
1.介绍
**
五种非布尔值情况:
1.如果一个运算数是对象,另一个是 Boolean 值,返回该对象。
2.如果两个运算数都是对象,返回第二个对象。
3.如果某个运算数是 null,返回 null。
4.如果某个运算数是 NaN,返回 NaN。
5.如果某个运算数是 undefined,发生错误。
2.一个运算符是对象,另一个是Boolean值
如果顺序不同,会发生不同的结果。
对象在前,Boolean在后:
let a=new String('hello world')
let result=a&&true;
console.log(result) //true
Boolean在前,对象在后:
let a=new String('hello world')
let result=true&&a;
console.log(result) //[String: 'hello world']
原因在于,
第一种情况,计算机先找到的是a,发现非空字符串,继续执行后面发现是true,最后返回后面对象(Boolean)的值为true。
第二种情况:计算机先找到的是true,发现为真,继续执行后面发现是a,最后返回后面对象(String)的值为[String: ‘hello world’]。
**
3.如果两个运算数都是对象,返回第二个对象
**
这个与标题2的情况大致一样,只上代码简单演示下:
let a=new String('hello world')
let b=new Number(5)
let result=a&&b;
let result1=b&&a;
console.log(result) //[Number: 5]
console.log(result1); //[String: 'hello world']
**
4.如果某个运算数是 null,返回 null
**
let a=new String('hello world')
let c=null;
let result=a&&c;
let result1=c&&a;
console.log(result) //null
console.log(result1) //null
**
如果我们把a换成空字符串或者0或者false等,会得出不同结果。
let a=false;
let c=null
let result=a&&c;
let result1=c&&a;
console.log(result) //false
console.log(result1) //null
因为javascript和java语言一样,采取了如果第一个数为假,直接不会执行后面的数,直接返回false.
5.如果某个运算数是 NaN,返回 NaN
**
let a=new String('hello world')
let c=NaN;
let result=a&&c;
let result1=c&&a;
console.log(result) //NaN
console.log(result1) //NaN
**
这个改了之后呢?
let a=false;
let c=NaN
let result=a&&c;
let result1=c&&a;
console.log(result) //false
console.log(result1) //NaN
6.如果某个运算数是 undefined,发生错误
**
let a=new String('hello world')
let result=a&&c;
let result1=c&&a;
console.log(result) //报错
console.log(result1) //报错
这个呢?
let a=false;
let result=a&&c;
let result1=c&&a;
console.log(result) //false
console.log(result1) //报错
这是我在开发中遇到的一点比较有意思的情况,后续如果还有其他的也会继续分享。