JS 布尔操作符 学习

布尔操作符

   布尔操作符一共有3个:逻辑非、逻辑与和逻辑或。

1、逻辑非

逻辑非操作符由一个叹号( ! )表示,可应用给 ECMAScript 中的任何值。这个操作符始终返回布 尔值,无论应用到的是什么数据类型。逻辑非操作符首先将操作数转换为布尔值,然后再对其取反。换 句话说,逻辑非操作符会遵循如下规则。
 
  • 如果操作数是对象,则返回false
  • 如果操作数是空字符串,则返回true
  • 如果操作数是非空字符串,则返回false
  • 如果操作数是数值0,则返回true
  • 如果操作数是非0数值(包括Infinity),则返回false
  • 如果操作数是null,则返回true
  • 如果操作数是NaN,则返回true
  • 如果操作数是undefined,则返回true
以下示例验证了上述行为:
console.log(!false); // true 
console.log(!"blue"); // false 
console.log(!0); // true 
console.log(!NaN); // true 
console.log(!""); // true 
console.log(!12345); // false
逻辑非操作符也可以用于把任意值转换为布尔值。同时使用两个叹号( !! ),相当于调用了转型函 数 Boolean() 。无论操作数是什么类型,第一个叹号总会返回布尔值。第二个叹号对该布尔值取反, 从而给出变量真正对应的布尔值。结果与对同一个值使用 Boolean() 函数是一样的:
 
console.log(!!"blue"); // true 
console.log(!!0); // false 
console.log(!!NaN); // false 
console.log(!!""); // false 
console.log(!!12345); // true

通俗的讲, 两个感叹号(!!) 其实就是把一个值转为布尔(Boolean)类型。

2.逻辑与

逻辑与操作符可用于任何类型的操作数,不限于布尔值。如果有操作数不是布尔值,则逻辑与并不 一定会返回布尔值,而是遵循如下规则:
  •  如果第一个操作数是对象,则返回第二个操作数。
  •  如果第二个操作数是对象,则只有第一个操作数求值为true才会返回该对象。
  •  如果两个操作数都是对象,则返回第二个操作数。
  •  如果有一个操作数是null,则返回null
  •  如果有一个操作数是NaN,则返回NaN
  •  如果有一个操作数是undefined,则返回undefined
逻辑与操作符是一种短路操作符,意思就是如果第一个操作数决定了结果,那么永远不会对第二个操作数求值。对逻辑与操作符来说,如果第一个操作数是 false,那么无论第二个操作数是什么值,结果也不可能等于 true。
 
let found = true; 
let result = (found && someUndeclaredVariable); // 这里会出错
console.log(result); // 不会执行这一行
// someUndeclaredVariable is not defined
上面的代码之所以会出错,是因为 someUndeclaredVariable 没有事先声明,所以当逻辑与操作符 对它求值时就会报错。变量 found 的值是 true ,逻辑与操作符会继续求值变量 someUndeclaredVariable 。 但是由于 someUndeclaredVariable 没有定义,不能对它应用逻辑与操作符,因此就报错了。假如变量 found 的值是 false ,那么就不会报错了:
let found = false; 
let result = (found && someUndeclaredVariable); // 不会出错
console.log(result); // 会执行
// false

3.逻辑或

与逻辑与类似,如果有一个操作数不是布尔值,那么逻辑或操作符也不一定返回布尔值。它遵循如下规则。
 
  •  如果第一个操作数是对象,则返回第一个操作数。
  •  如果第一个操作数求值为false,则返回第二个操作数。
  •  如果两个操作数都是对象,则返回第一个操作数。
  •  如果两个操作数都是null,则返回null
  •  如果两个操作数都是NaN,则返回NaN
  •  如果两个操作数都是undefined,则返回undefined
同样与逻辑与类似,逻辑或操作符也具有短路的特性。只不过对逻辑或而言,第一个操作数求值为true,第二个操作数就不会再被求值了。看下面的例子:
 
let found = true; 
let result = (found || someUndeclaredVariable); // 不会出错
console.log(result); // 会执行
// true

乘性操作符

ECMAScript定义了3个乘性操作符:乘法、除法和取模。这些操作符跟它们在JavaC语言及Perl 中对应的操作符作用一样,但在处理非数值时,它们也会包含一些自动的类型转换。如果乘性操作符有不是数值的操作数,则该操作数会在后台被使用Number()转型函数转换为数值。这意味着空字符串会被当成 0,而布尔值true 会被当成 1,false会被当成0

1.乘法操作符

乘法操作符由一个星号( * )表示,可以用于计算两个数值的乘积。不过,乘法操作符在处理特殊值时也有一些特殊的行为:
  •  如果操作数都是数值,则执行常规的乘法运算,即两个正值相乘是正值,两个负值相乘也是正 值,正负符号不同的值相乘得到负值。如果 ECMAScript不能表示乘积,则返回Infinity或 -Infinity。
  •  如果有任一操作数是NaN,则返回NaN
  •  如果是Infinity乘以0,则返回NaN
  •  如果是Infinity乘以非0的有限数值,则根据第二个操作数的符号返回Infinity-Infinity
  •  如果是Infinity乘以Infinity,则返回Infinity
  •  如果有不是数值的操作数,则先在后台用 Number()将其转换为数值,然后再应用上述规则。

2.除法操作符

除法操作符由一个斜杠( /)表示,用于计算第一个操作数除以第二个操作数的商。跟乘法操作符一样,除法操作符针对特殊值也有一些特殊的行为。
 
  •  如果操作数都是数值,则执行常规的除法运算,即两个正值相除是正值,两个负值相除也是正 值,符号不同的值相除得到负值。如果ECMAScript不能表示商,则返回Infinity-Infinity
  •  如果有任一操作数是NaN,则返回NaN
  •  如果是Infinity除以Infinity,则返回NaN
  •  如果是0除以0,则返回NaN
  •  如果是非 0 的有限值除以 0,则根据第一个操作数的符号返回Infinity 或-Infinity
  •  如果是Infinity 除以任何数值,则根据第二个操作数的符号返回Infinity 或-Infinity
  •  如果有不是数值的操作数,则先在后台用 Number()函数将其转换为数值,然后再应用上述规则。

3.取模操作符

取模(余数)操作符由一个百分比符号( %)表示,与其他乘性操作符一样,取模操作符对特殊值也有一些特殊的行为
  •  如果操作数是数值,则执行常规除法运算,返回余数。
  •  如果被除数是无限值,除数是有限值,则返回NaN
  •  如果被除数是有限值,除数是0,则返回NaN
  •  如果是Infinity除以Infinity,则返回NaN
  •  如果被除数是有限值,除数是无限值,则返回被除数。
  •  如果被除数是0,除数不是0,则返回0
  •  如果有不是数值的操作数,则先在后台用Number()函数将其转换为数值,然后再应用上述规则。

4. 关系操作符

关系操作符执行比较两个值的操作,包括小于( < )、大于( > )、小于等于( <= )和大于等于( >= ), 用法跟数学课上学的一样。这几个操作符都返回布尔值,
  •  如果操作数都是数值,则执行数值比较。
  •  如果操作数都是字符串,则逐个比较字符串中对应字符的编码
  •  如果有任一操作数是数值,则将另一个操作数转换为数值,执行数值比较。
  •  如果有任一操作数是对象,则调用其valueOf()方法,取得结果后再根据前面的规则执行比较如果没有 valueOf()操作符,则调用toString()方法,取得结果后再根据前面的规则执行比较。
  •  如果有任一操作数是布尔值,则将其转换为数值再执行比较。

相等操作符

1等于和不等于

ECMAScript 中的等于操作符用两个等于号( == )表示,如果操作数相等,则会返回 true 。不等于操作符用叹号和等于号(!= )表示,如果两个操作数不相等,则会返回 true 。这两个操作符都会先 进行类型转换 (通常称为 强制类型转换 )再确定操作数是否相等。
在转换操作数的类型时,相等和不相等操作符遵循如下规则。
  •  如果任一操作数是布尔值,则将其转换为数值再比较是否相等。false转换为0true转换为 1
  •  如果一个操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否相等。
  •  如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法取得其原始值,再根据前面的规则进行比较。在进行比较时,这两个操作符会遵循如下规则。
  •  null 和 undefined 相等。
  •  null 和 undefined 不能转换为其他类型的值再进行比较。
  •  如果有任一操作数是 NaN,则相等操作符返回 false,不相等操作符返回 true。记住:即使两个操作数都是 NaN,相等操作符也返回 false,因为按照规则,NaN 不等于 NaN。
  •  如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true。否则,两者不相等。
特殊情况及比较的结果。
null == undefined true
"NaN" == NaN false
5 == NaN false
NaN == NaN false
NaN != NaN true
false == 0 true
true == 1 true
true == 2 false
undefined == 0 false
null == 0 false
"5" == 5 true

2.全等和不全等

全等和不全等操作符与相等和不相等操作符类似,只不过它们在比较相等时 不转换操作数 。全等操作符由 3 个等于号( === )表示,只有两个操作数在不转换的前提下相等才返回 true ,比如:
 
let result1 = ("55" == 55); // true,转换后相等
let result2 = ("55" === 55); // false,不相等,因为数据类型不同
虽然 null == undefined true (因为这两个值类似),但 null === undefined 是false,因为它们不是相同的数据类型。
 
PS: 由于相等和不相等操作符存在类型转换问题,因此推荐使用全等和不全等操作符。这样有助于在代码中保持数据类型的完整性
 
 
 
 
 
 
 
 
 
 

版权声明:本文为qq_21436667原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。