JS基础拾遗 - 3 - 操作符

二元 + 操作符在字符串处理上的区别

++、-- 和 一元 + - 在遇到字符串时,都是调用Number()进行转型,
结果很可能是 NaN。 只有二元 + 操作符才可以实现字符串拼接。
可以说:字符串拼接是二元 + 操作符独有的。

&& 和 ||

逻辑非(!)操作符返回值肯定是布尔值,但 && 和 || 则不一定(重要):
如果有一个操作数不是对象,它们不一定返回布尔值。
求值的过程,会自动调用 Boolean() 进行转型

&& :

如果有一个操作数是 null,则返回 null
如果有一个操作数是 NaN,则返回 NaN
如果有一个操作数是 undefined,则返回 undefined
如果第一个操作数是对象,则返回第二个操作数
如果第二个操作数是对象,当且仅当第一个操作数求值为true时才返回该对象

|| :

如果第一个操作数是对象,返回第一个对象
如果第一个操作数求值为false,返回第二个操作数
如果两个操作数都是 null,则返回null
undefined、NaN同理。

加性操作符

下面两种操作符,是从左到右运算的;
并且除了加操作符遇到string的特殊情况,遇到其他类型的操作数会自动调用 Number() 进行转型:

加法操作符

Infinity + -Infinity = NaN
+0 + -0 = +0

减法操作符

Infinity - Infinity = NaN
-Infinity - (-Infinity) = NaN
+0 - -0 = -0

关系操作符(>, <, >=, <=)

  • 如果两个操作数是数值,则执行数值比较;
  • 如果其中一个操作数是数值,则把另一个转换成数值,然后数值比较;
  • 如果一个操作数是布尔值,则先转换成数值,然后执行数值比较;
  • 如果一个操作数是对象,先调用valueOf(),如果没有则调用 toString()
  • 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值

任何操作数与NaN进行比较,结果都是false!
另外不要忘记,因为执行的是Number()转型函数,所以
undefined -> NaN
null -> 0

字符串的比较:
并不是按照字母表的位置,而是逐个比较字符编码,
因此需要特别注意比较两个数字字符串的情况:

举例:
“23” < “3”
"2"编码50,"3"编码51,因此返回 true!

“23” > 3
由于3是数值,因此把"23"转换成数值23,然后执行比较;

“a” < 3
先把"a"转换成数值NaN,比较结果为 false

true > 0
把true转换成1(Number()),然后进行比较

相等操作符(==,!=)

相等操作符会先转换操作数(有例外)。

转换规则:

  • 若有一个操作数是布尔值,比较前先转换成数值
  • 如果一个操作数是字符串,另一个是数值 ,比较之前先将字符串转换成数值
  • 只要有一个操作数是NaN,相等操作符就返回 false,NaN不等于NaN
  • 如果两个操作数都是对象,则比较它们是不是同一个对象(指向)
  • 两个操作数都是字符串时,可以直接使用 == 判断是否完全相等
  • undefined 和 null 不会被转换成其他任何值!
  • undefined == null 返回true,由于上一条,你也不能用类型转换来解释这种情况,它更像是一个规定。
var stra = "like";
var strb = "like";
console.log(stra == strb); // true
console.log(stra === strb); // true
console.log(0 >= null); // true
console.log(0 == null); // false

第一个,0 >= null,0是数值,所以null被转型成0,返回 true;
第二个 0 == null,null不会被转型,因此不相等,返回false;

全等操作符(===,!==)

比较之前不转换操作数

"55" === 55 // fase

在大多数情况下,建议使用全等操作符。

你可能感兴趣的:(前端,javascript,js)