JS:类型转换(三)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?

简介: JS:类型转换(三)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?

前言

JavaScript中类型转换是一个很令人头疼的问题,特别是对于初学者来说。这是由于 JavaScript 是一种弱类型语言,它在运行时会尝试自动转换数据类型,以使表达式能够执行。这种灵活性使得 JavaScript 非常强大,但也容易引发一些不直观的行为。就比如当字符串与数字相加时,例如"3" + 2,JavaScript 将数字 2 隐式转换为字符串,而不是执行数学运算。今天我们就来聊聊JS中的类型转换规则,并且带你解决经典面试问题[ ] == ![ ] ?。

对象转原始数据类型

其实,我们将对象转换为原始数据类型时,JS引擎会进行一个隐式操作,ToPrimitive

Toprimitive

ToPrimitive 是 ECMAScript 规范中定义的一个抽象操作,用于将值转换为原始值。这个操作通常在一些运算符和内建函数中使用,当需要原始值而当前值是对象时,会调用 ToPrimitive

Toprimitve这个抽象操作是由官方定义的,我们一起来看看官方文档:

image.png

官方文档链接在此: Toprimitive官方文档

小伙伴们一定要学会看文档,但有时文档的内容很完整很规范,那么我们看起来就会有点干涩和难懂,接下来我就用自己对官方文档的理解来给大家讲一下:

ToPrimitive(obj, Number)

将对象转换为数字型时:

  1. 如果obj是是一个基本类型值(如字符串、数字、布尔等),则返回该值
  2. 否则, 调用 valueof 方法, 如果得到原始值, 则返回该原始值
  3. 如果 valueof 没有得到原始值,则调用 toString 方法, 如果得到原始值, 则返回该原始值
  4. 若是toString没有得到原始值,抛出一个 TypeError 异常(报错

ToPrimitive(obj, String)

将对象转换为字符串类型时:

  1. 如果obj是是一个基本类型值(如字符串、数字、布尔等),则返回该值
  2. 否则, 调用 toString  方法, 如果得到原始值, 则返回该原始值
  3. 若是调用 toString 方法没有得到原始值,则调用 valueof 方法,如果得到原始值, 则返回该原始值
  4. 否则, 抛出一个 TypeError 异常(报错

这两个方法有什么用呢?怎么跟我们所讲的内容联系起来呢?我相信很多小伙伴们看到这里都有疑问了,这也太乱了,那我举一个例子来帮大家理解一下:

假如我们想将对象转换为一个数字类型,我们可以手动调用函数Number(obj),这是我们显示的操作,但是在v8引擎眼中,它看到我们想将对象转化为数字类型时,会进行两个隐式操作,这同时也是官方文档告诉我们的,我们来看一下:

image.png

我们通过文档可以得知,将对象转换为数字类型时,第一个进行的隐式操作就是我们上面所讲的ToPrimitive(obj, Number),进行这个操作之后得到一个原始值,然后进行第二个隐式操作ToNumber,就是我们上篇文章所讲的原始值转化为数字类型,概括一下,就是先将复杂的数据类型对象转化为简单原始数据类型,然后转化

对象转布尔类型

对象转换为布尔类型的规则是简单而直接的:

  1. 所有对象都被视为真值(truthy): 无论对象的属性或方法如何,对象在布尔上下文中被视为真值。
  2. 特殊对象情况:
  • 空对象 {} 空对象在布尔上下文中被视为真值。
  • 包装对象(如 new Boolean(false)): 除了 new Boolean(false),其他包装对象在布尔上下文中都被视为真值。

例如:

image.png

总结

ToPrimitive(obj, Number)

将对象转换为数字型时:

  1. 如果obj是是一个基本类型值(如字符串、数字、布尔等),则返回该值
  2. 否则, 调用 valueof 方法, 如果得到原始值, 则返回该原始值
  3. 如果 valueof 没有得到原始值,则调用 toString 方法, 如果得到原始值, 则返回该原始值
  4. 若是toString没有得到原始值,抛出一个 TypeError 异常(报错

ToPrimitive(obj, String)

将对象转换为字符串类型时:

  1. 如果obj是是一个基本类型值(如字符串、数字、布尔等),则返回该值
  2. 否则, 调用 toString  方法, 如果得到原始值, 则返回该原始值
  3. 若是调用 toString 方法没有得到原始值,则调用 valueof 方法,如果得到原始值, 则返回该原始值
  4. 否则, 抛出一个 TypeError 异常(报错

所有对象都被视为真值(truthy):

相关文章
|
2月前
|
Web App开发 JavaScript 前端开发
JS:类型转换(二)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?
JS:类型转换(二)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?
|
2月前
|
JavaScript 前端开发
JS:类型转换(四)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?
JS:类型转换(四)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?
|
2月前
|
JavaScript 前端开发
JS:类型转换(一)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?
JS:类型转换(一)从底层逻辑让你搞懂经典面试问题 [ ] == ![ ] ?
|
3月前
ES6 扩展运算符 ...【详解】(含使用场景、实战技巧和范例、实现原理、错误用法)
ES6 扩展运算符 ...【详解】(含使用场景、实战技巧和范例、实现原理、错误用法)
38 5
|
3月前
|
Java
代码优化设计问题之推荐使用函数式方法进行null判断问题如何解决
代码优化设计问题之推荐使用函数式方法进行null判断问题如何解决
|
3月前
|
前端开发 JavaScript 开发者
前端 JS 经典:通用性函数封装思路
前端 JS 经典:通用性函数封装思路
27 0
|
5月前
|
前端开发 JavaScript
前端 JS 经典:for-in 和 for-of 用法区别
前端 JS 经典:for-in 和 for-of 用法区别
43 0
|
5月前
|
前端开发 JavaScript
前端 JS 经典:数组去重万能方法
前端 JS 经典:数组去重万能方法
35 0
|
自然语言处理 前端开发 JavaScript
前端经典面试题 | 闭包的作用和原理
前端经典面试题 | 闭包的作用和原理
|
5月前
|
JavaScript 前端开发
Js数据类型判断都有哪几种方式?至少说出5种?它们的区别是什么?
Js数据类型判断都有哪几种方式?至少说出5种?它们的区别是什么?
49 0
下一篇
无影云桌面