1. Truthy:
在 JavaScript 中,truthy(真值)指的是在布尔值上下文中,转换后的值为真的值。所有值都是真值,除非它们被定义为 假值(即除 false、0、-0、0n、""、null、undefined 和 NaN 以外皆为真值)。
JavaScript 在布尔值上下文中使用强制类型转换(coercion)。
JavaScript 中的真值示例如下(将被转换为 true,if 后的代码段将被执行):
if (true)
if ({})
if ([])
if (42)
if ("foo")
if (new Date())
if (-42)
if (3.14)
if (-3.14)
if (Infinity)
if (-Infinity)
2. Falsy:
falsy 值 (虚值) 是在 Boolean 上下文中认定为 false 的值。
JavaScript 在需要用到布尔类型值的上下文中使用强制类型转换(Type Conversion )将值转换为布尔值,例如条件语句和循环语句。
在 JavaScript 中只有 8 个 falsy 值:false,0,-0,0n(BinInt中的0n)," 、``or " " (即空字符串),null,undefined,NaN
JavaScript 中 falsy 值的例子 (在布尔值上下文中被转换为 false,从而绕过了 if 代码块):
if (false)
if (null)
if (undefined)
if (0)
if (0n)
if (NaN)
if ('')
if ("")
if (``)
3. 比较运算符
运算符 | 说明 |
---|---|
== | 比较两个操作数的值是否相等 |
!== | 比较两个数的值是否不相等 |
=== | 比较两个数的值是否相等,同时检测它们的数据类型是否相等 |
!=== | 和‘===’的取值相反 |
在比较时,应当注意一下步骤:
- 如果操作数是布尔值,则先转换为数值,其中 false 转为 0,true 转换为 1。
- 如果一个操作数是字符串,另一个操作数是数字,则先尝试把字符串转换为数字。
- 如果一个操作数是字符串,另一个操作数是对象,则先尝试把对象转换为字符串。
- 如果一个操作数是数字,另一个操作数是对象,则先尝试把对象转换为数字。
- 如果两个操作数都是对象,则比较引用地址。如果引用地址相同,则相等;否则不等。
所以我们可以将**==**运算分为三种情况:
- 两边都是对象,这时候比较引用地址;
- 一边是对象,一边是字符串,这时候把对象转换成字符串,两边再比较;
- 其他情况就将两边都装换成数字比较
class Student {
constructor(age,name) {
this.age = age
this.name = name
}
toString(){
return this.name
}
}
console.log('Niall'==new Student(19,'Niall')) //true
console.log([]=='') //true
console.log('010'==10) //true
console.log([] == {}) //false
console.log(''==false) //true
[]==''
为什么是true?
[]
是object
类型,''
是字符串类型,所以会将[]
转换成str
之后再进行比较,[].toString
返回的是一个空字符串,所以最后结果为true
[] == {}
为什么是false?
[]
是object
类型,{}
也是object
类型,所以在比较的时候是比较他们两个的引用地址,所以最后的结果为false。
''== false
为什么是true?
''
是str
类型,false
也是boolean
类型,所以在比较的时候需要前置转换成数字,Number('')
为0,Number(false)
也为0,所以最后的结果为true。
4. Truthy和true、Falsy和false
Truthy代表的是真值,是该目标在布尔值上下文中强制转化后为真的值,而Falsy则相反。
结合3. 比较运算符,一个值是真值,并不意味者该值==true。
console.log(Boolean([])) //true
console.log([]==true) //false
这里在比较[]==true
时,会将两边都转换成数字进行比较,Number([])
为0,Number(true)
为1,所以结果为false。
5. Object.is()
Object.is() 方法判断两个值是否为同一个值。
语法:
Object.is(value1, value2);
返回值:一个Boolean类型标示两个参数是否为同一个值。
Object.is()
方法判断两个值是否为同一个值。如果满足以下条件则两个值相等:
- 都是
undefined
- 都是
null
- 都是
true
orfalse
- 内容相同的字符串
- 同一个对象(不是相同的对象)
- 同一个数字(包括两个NaN相比较)
console.log(Object.is(NaN,NaN)) //true
let a = {name:'Niall',age:12}
let b = {name:'Niall',age:12}
console.log(Object.is(a,b)) //false