JavaScript类型转换:隐式魔法与显式掌控

什么是类型转换

类型转换Type conversion/typecasting)是指将数据由一种类型变换成另一种类型。js是一门弱类型语言,其允许变量类型的隐式类型转换显示类型转换,较为常见的类型转换有三种:

  • 转字符串类型
  • 转数字类型
  • 转布尔类型

显示类型转换

显式转换 (也称为强制类型转换 )是指程序员主动在代码中明确指定的一种类型转换方式。 以下是较为常见的显示类型转换方法:

  • 转字符串类型 String(X)
  • 转数字类型 Number(X)
  • 转布尔类型 boolean(X)

下面列出常见数据类型分别显式转换为数值类型、字符串类型以及布尔类型的值

表 1.1 显式类型转换

图表来源:Torn《JavaScript之类型转换》

隐式类型转换

JavaScript是一种弱类型(动态类型)语言,在运算或者比较时,如果操作数的类型不匹配,引擎会自动进行隐式类型转换(Type Coercion)。

我们先来看看js中==VS===

1.==会发生隐式类型转换,所以只判断值是否相等。

2.===不会发生隐式类型转换,所以会判断值和类型是否相等。

两种隐式类型转换

1.原始类型转原始类型

2.引用类型转原始类型

这里我们着重来聊聊引用类型转原始类型:

  • 引用类型转布尔类型----任何引用类型都是true
  • 引用类型转字符串类型----String(obj)==>obj.ToString()==>Toprimitive(obj,string)
  • 引用类型转数字----Number(obj)==>obj.ToNmber()==>Toprimitive(obj,Number)

Toprimitive抽象操作的完整执行逻辑

  • Toprimitive(obj,String)
  1. 判断obj是否为原始类型,是则直接返回
  2. 否则,调用toString(),如果得到了原始类型,则返回
  3. 否则调用valueOf(),如果得到了原始类型,则返回
  4. 否则,抛出TyoeError异常
  • Toprimitive(obj,Number)
  1. 判断obj是否为原始类型,是则直接返回
  2. 否则,调用valueOf(),如果得到了原始类型,则返回
  3. 否则,调用toString(),如果得到了原始类型,则返回
  4. 否则,抛出TyoeError异常

valueOf()

valueOf()在对象原型上,它只能将包装类的对象转化为原始类型(new String() new Boolean() new Number())。

toString()

在js中的大部分构造函数原型上都有自己重写的toString()方法。

  1. {}.toStirng()返回由'[object 和[[class]]和]'组成的字符串
  2. \].toString()返回由数组中每个元素以逗号拼接而成的字符串

发生隐式类型转换的场景

  1. 四则运算 + - * / %
  2. 判断语句 if while == >= <= != > <

+号的特殊作用

1.作为一元运算符 -- 会发生隐式类型转换,转成number (+'123'直接变成数字123) 2. 作为二元运算符 -- 只要+左右两边有一个是字符串,那么另一个也会转字符串进行拼接

下面列出常见数据类型分别隐式转换为数值类型、字符串类型以及布尔类型的值

表 1.2 隐式类型转换

相关推荐
空中海2 小时前
01 React Native 基础、核心组件与布局体系
javascript·react native·react.js
前端之虎陈随易5 小时前
2年没用Nodejs了,Bun很香
linux·前端·javascript·vue.js·typescript
好运的阿财6 小时前
OpenClaw工具拆解之host_workspace_write+host_workspace_edit
前端·javascript·人工智能·机器学习·ai编程·openclaw·openclaw工具
XiYang-DING6 小时前
JavaScript
开发语言·javascript·ecmascript
空中海7 小时前
02 React Native状态、导航、数据流与设备能力
javascript·react native·react.js
空中海8 小时前
02 状态、Hooks、副作用与数据流
开发语言·javascript·ecmascript
空中海8 小时前
04 React Native工程化、质量、发布与生态选型
javascript·react native·react.js
杨超凡9 小时前
豆包收费了?我特么自己用“意念”搓了一个!
javascript
threelab9 小时前
Three.js 咖啡杯烟雾效果 | 三维可视化 / AI 提示词
开发语言·javascript·人工智能