当前位置: 首页 > 工具软件 > falsy > 使用案例 >

JavaScript ==,Object.is(), Truthy、Falsy与true、false的区别

赫连坚
2023-12-01

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。
  • 如果一个操作数是字符串,另一个操作数是数字,则先尝试把字符串转换为数字。
  • 如果一个操作数是字符串,另一个操作数是对象,则先尝试把对象转换为字符串。
  • 如果一个操作数是数字,另一个操作数是对象,则先尝试把对象转换为数字。
  • 如果两个操作数都是对象,则比较引用地址。如果引用地址相同,则相等;否则不等。

所以我们可以将**==**运算分为三种情况:

  1. 两边都是对象,这时候比较引用地址;
  2. 一边是对象,一边是字符串,这时候把对象转换成字符串,两边再比较;
  3. 其他情况就将两边都装换成数字比较
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() 方法判断两个值是否为同一个值。如果满足以下条件则两个值相等:

  1. 都是 undefined
  2. 都是null
  3. 都是trueorfalse
  4. 内容相同的字符串
  5. 同一个对象(不是相同的对象)
  6. 同一个数字(包括两个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
 类似资料: