比较运算符(== 和 ===)
比较运算符在逻辑语句中使用,以测定变量或值是否相等。
相对比较(==)
当比较的两个值 数据类型不一样时会先进行数据类型转换 再比较
// 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false 转换为 0,而true 转换为 1;
console.log(false == []) // true 0 == 0
console.log(true == []) // false 1 == 0
console.log(false == '') // true 0 == 0
console.log(true == '') // false 1 == 0
// 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
console.log('1' == 1) // true 1 == 1
console.log('' == 1) // false 0 == 1
console.log('1' == [1]) // true 1 == 1
// 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法,用得到的基本类型值按照前面的规则进行比较
var obj = {name: 'js'}
console.log(obj == 1) // false {} == 1
obj.valueOf = function () {
return 1
}
console.log(obj == 1) // true 1 == 1
! 操作符优先级要高于比较操作符
[] == false // true
// !取反操作符 先转换为Boolean值 再取反
![] == false // true 先将空数组转换为Boolean再取反
注意:JS中 空字符'' 、NaN、 null、 undefined、 0 只有这五个值转化为Boolean值时都为false,其余都为true 如:Boolean([]) === true Boolean('2') === true
全等(===)
严格比较 先比较类型 再比较值,如果类型和值都相等情况下 才返回true 否则false
console.log('1' === 1) // false 类型不等
console.log('1' === '2') // false 类型相等 值不等
console.log('1' === '1') // true 类型和值都相等
这两个操作符在进行相对比较时则要遵循下列规则。
- null 和 undefined 是相等的,undefined相对比较时 除了自身和null外 其他的都不相等。
- 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值。
- NaN 和任何一个值都不相等,即使两个操作数都是 NaN,相等操作符也返回 false;因为按照规则 NaN 不等于 NaN。
- 如果两个操作数都是对象,则比较它们是不是同一个对象(同一个引用地址)。如果两个操作数都指向同一个对象, 则相等操作符返回 true;否则,返回 false。
在工作中通常是使用全等(===)和全部不等(!==)进行比较,只有判断null 或 undefined时 是用相对比较
参考表格
逻辑运算符
逻辑与(&&)
当两边操作值是布尔值时
两边都为true时 它才返回true 如果其中一个操作值为false 则返回false
var a = 1
var b = 2
console.log(a == 1 && b == 2) // true
console.log(a == 2 && b == 2) // false
当两边操作值是真值或假值时
-
如果两边都是真值时,则返回后面的那个真值 (左操作符是真值 还要再看右操作值 如果是真值 则整个表达式结果就是真值,如果右操作值是假值 则整个表达式结果就是假值)
-
如果两边只要有一个是假值,则返回这个假值(运算符首先优先计算左操作值,如果是假值那么整个表达式的结果也一定是假值,因此直接返回左边操作值 而不会对右操作值进行计算)
// 如果两边都是真值时 则返回后面的那个真值
1 && 2 // 2
2 && '3' // '3'
// 如果两边只要有一个假值 则返回这个假值
0 && 2 // 0
2 && false // false
[] && '' // ""
null && 2 // null
在JavaScript中任何希望使用布尔值的地方,表达式和语句都会将其当做真值或假值来对待,并不总是返回true 和false
逻辑或(||)
对两边操作值做 布尔或(OR)运算,如果其中一个或两个都是真值 则返回一个真值,如果两个都是假值 则返回一个假值
-
若只有一个真值 则返回这个真值,如果两边都是真值 则返回前面那个真值
-
若两边都是假值 则返回后面那个假值
// 一个或两个真值
1 || 2 // 1
1 || 0 // 1
0 || 2 // 2
null || 2 // 2
undefined || 2 // 2
// 两边都是假值
null || undefined // undefined
0 || null // null
逻辑与(&&)的优先级高于逻辑或(||)
&& 与 || 运算符 同时存在时,先计算&&的结果 再计算 || 结果
// 先看 1 && 2 => 2 || 3 && '' || 6 => 2 || '' || 6 => 2 || 6 => 2
1 && 2 || 3 && '' || 6 // 2
// 先看 3 && 5 => 0 || 5 || 6 => 5 || 6 => 5
0 || 3 && 5 || 6 // 5
// 可通过小括号改变优先级
(1 || 3) && (0 || 6) // 6 先 1 || 3 => 1 && (0 || 6) => 1 && 6 => 6
逗号操作符
使用逗号操作符可以在一条语句中执行多个操作,如下面的例子所示:
var num1=1, num2=2, num3=3;
逗号操作符多用于声明多个变量;但除此之外,逗号操作符还可以用于赋值。在用于赋值时,逗号
操作符总会返回表达式中的最后一项,如下面的例子所示:
var num = (5, 1, 4, 8, 0); // num 的值为 0
关系操作符
小于(<) 、大于(>) 、小于等于(<=)和大于等于(>=)这几个关系操作符用于对两个值进行比
较,比较的规则则跟数学中比较一样。这几个操作符都返回一个布尔值,如下面的例子所示
1 > 2 // false
5 > 3 // true
'2' > 1 // true
// 对于对象比较时 会调用对象自身的valueOf()方法或toString()方法的到原始值再进行比较
var obj = { name: 'wenli' }
console.log(obj > 2) // false
obj.valueOf = function() {
return 5
}
console.log(obj > 2) // true
比较规则:
- 如果两个操作数都是数值,则执行数值比较。
- 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
- 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。
- 如果一个操作数是对象,则调用这个对象的 valueOf()方法,用得到的结果按照前面的规则执
行比较。如果对象没有 valueOf()方法,则调用 toString()方法,并用得到的结果根据前面
的规则执行比较。
- 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。
布尔操作符
逻辑非!
逻辑非操作符由一个叹号(!)表示,可以应用于 ECMAScript 中的任何值。无论这个值是什么数据
类型,这个操作符都会返回一个布尔值并取反。
// 转换为布尔值并取反
alert(!false); // true
alert(!"blue"); // false
alert(!0); // true
alert(!NaN); // true
alert(!""); // true
alert(!12345); // false
赋值操作符
每个主要算术操作符(以及个别的其他操作符)都有对应的复合赋值操作符。这些操作符如下所示:
-
乘/赋值(*=)
-
除/赋值(/=)
-
模/赋值(%=)
-
加/赋值(+=)
-
减/赋值(-=)
...
var num = 10;
num = num + 10;
// 等价于
var num = 10
num += 10
一元操作符
只能操作一个值的操作符叫做一元操作符
递增或递减
// 递增
var a = 1
a++
console.log(a) // 2
++a
console.log(a) // 3
// 递减
var n = 4
--a
console.log(a) // 3
a--
console.log(a) // 3
i++ 和 ++i
运算表达式:先从左往右依次进行取值(解析),然后再按运算符优先级进行计算,对于i++和++i每次取完值就会自加1。
// ++i 先自身加1 再进行运算
var i = 0
console.log(++i + 2) // 1 + 2 = 3
// i++ 先运算 然后再自身加1
var i = 0
console.log(i++ + 2) // 0 + 2 = 2
console.log(i) // 1
var i = 0
console.log((i++)+2+(i++)+1+(++i)+1*i++) // 10
var i = 1
console.log(i++ + 2 * i++) // 5
var i = 3
var j = i++ + i++ + i++
console.log(j, i)
// 问题:表达式的值是多少呢?j = 12 i = 6
//
// 解析:有的编译系统按照自左向右顺序执行括号内的运算,求解完第1个i++的值后会实现i的自加,i值变为4,
// 再求第2个i++的值后,实现i的自加,i值变为5,
// 结果表达式相当于3+4+5,即12。而另外一些系统(如Turbo C和MS C)把3作为表达式中所有i的值,因此3个i相加,得到表达式的值为9。在求出整个表达式的值后i变量再实现自加3次,i的值变为6。
JS中运算符优先级 (了解一下,就ok)
更详细的优先级列表
----------------------------------------------------------------------------------------------------------------
参考文章&&强烈推荐:布罗利