逻辑非 !
应用于任何值,先将操作数转换成布尔值,再对其求反
规则:实际上先对操作数应用 Boolean()
转换为布尔值,然后再取反
同时使用两个逻辑非操作符,实际上就会模拟
Boolean()
函数的行为,用于将一个值转换为与其对应的布尔值
逻辑与 &&
可以应用于各种类型的操作数,而不仅仅是布尔值
在有一个操作数不是布尔值时,就不一定返回布尔值了
规则:
第一个操作数不是布尔值,则使用
Boolean()
进行转换,是布尔值,则直接判断结果为
true
,则返回第二个操作数结果是
false
,则返回第一个操作数。
短路操作:如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值
var found = true;
var result = (found && someUndefined);//发生错误
alert(result);//这一行不会执行
var found = false;
var result = (found && someUndefined);//不会发生错误
alert(result);//执行结果 false
回调函数:传值是函数时,让函数执行
function fn(callback) {
//=> 如果传递的值是一个函数,我们让其执行
// if(typeod callback === 'function') {
// callback()
// }
callback && callback(); //=> 如果 callback 存在则执行它
//=> 这种写法是不够严谨的,但是经常使用。因为约定好,默认 callback 要不然就传函数,要不然就不传。
}
fn(function() {})
逻辑或 ||
规则:
第一个操作数不是布尔值,则使用
Boolean()
进行转换,是布尔值,则直接判断结果为
true
,则返回第一个操作数结果是
false
,则返回第二个操作数
短路操作:如果第一个操作数的求值结果为
true
,那么就不会再对第二个操作数求值
赋值语句经常采用这种模式:可以给参数赋默认值
var myObject = preferredObject || backupObject;
虽然不够严谨,但是在真实项目中约定俗称,经常使用。因为默认要么不传值,要么传递的就是所需要的值。所以在需要传递的值为假的时候,应该避免这种默认值定义方式
ES6 新语法规范中可以直接给形参设置默认值:
一旦传递值,除了 undefined,都是按传递的值给形参赋值
如果不传递参数,或者传递的是 undefined,那么给形参赋值默认值
function fn(x=0) {
console.log(x);
}
fn(); //=> 0
fn(null); //=> null
fn(undefined); //=> 0
优先级
优先级从高到底:
逻辑非
逻辑与
逻辑或
0 || 1 && 2 || 0 || 3 && 2 || 1; //=> 2