1、逻辑与(&&)
(1)对于布尔值,只有都为true才返回true,只要有一个false,就返回false;
(2)对于不是布尔值的情况则:
- 如果第一个操作数是对象,则返回第二个数
- 如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象。
- 如果两个操作数都是对象,则返回第二个数操作数。
- 如果有一个操作数是null,则返回null。
- 如果有一个操作数是NaN,则返回第NaN。
- 如果第一个操作数是undefined,则返回undefined。
var obj={};
console.log(obj && null); //null
console.log(null && obj); //null
console.log(obj && undefined) //undefined
console.log(undefined && obj); //undefined
console.log(obj && NaN); //NaN
console.log(NaN && obj); //NaN
var obj2={} ; var a=(obj && obj2);
console.log(a); //{} 返回第二个obj2{}
console.log(a==obj2); //true
( 3 ) 对于逻辑与的短路问题:
对于逻辑与,如果第一个操作数是false,无论第二个操作数是什么,结果都不可能再是true。
var found=true; var result=(found && someUdefinedVariable); console.log(result); //显示someUdefinedVariable
//例子中的found为true,所以会对someUdefinedVariable继续求值,但是该变量未定义,所以会提示错误
var found=false; var result=(found && someUdefinedVariable); console.log(result); //显示false
//例子中的found为false,所以第一个操作数就已经能够决定结果,就不会在对第二个操作数求值
2.逻辑或(||)
(1)对于布尔值,逻辑或是非常简单的,只要有一个true,就返回true;
(2)对于不是布尔值的情况则:
- 如果第一个操作数是对象,则返第一个操作数
- 如果第一个操作数的求值结果为false,则返回第二个操作数
- 如果两个操作数都是对象,则返回第一个操作数
- 如果两个操作数是null,则返回null
- 如果两个操作数是NaN,则返回NaN
- 如果两个操作数是undefined,则返回undefined
var found=true;
var result=(found || someUdefinedVariable);
console.log(result); //true
//对于逻辑或,当一个为true的时候,就不会在对第二个操作数进行求值了
console.log('' == false); //true
console.log('' || '- - '); //‘- -’ 相当于false || ‘- -’
3.逻辑非(!)
- 如果一个操作数是一个对象,返回true;
- 如果一个操作数是一个空字符串,返回false;
- 如果一个操作数是一个非空字符串,返回false;
- 如果一个操作数是一个数值0,返回false;
- 如果一个操作数是任意的非零字符,返回true;
- 如果一个操作数是null,返回false;
- 如果一个操作数是NaN,返回false;
- 如果一个操作数是undefined,返回true;
var obj = {id:1,name:'tom'}; console.log(!obj); //false
var obj = ''; console.log(!obj); //true
var obj = 'tom'; console.log(!obj); //false
var obj = 0; console.log(!obj); //true
var obj = 5; console.log(!obj); //false
var obj = null; console.log(!obj); //true
var obj = NaN; console.log(!obj); //true
var obj = undefined; console.log(!obj); //true
注:逻辑与,逻辑非都是从左向右判断,谁的第一个逻辑判断为true就显示谁,只不过逻辑非必须两个都为true,而且谁是第一个false就显示谁。