夜下客

繁体版 简体版
夜下客 > JS修炼法则 > 第2章 JS类型转换

第2章 JS类型转换

类型转换

引子: 为什么类型之间可以进行转换?转换的分类有哪些?具体转换方式有哪些?

(可以先自行在脑海中思考上述问题,再继续往下阅读)

第一个问题:类型之间可以进行转换的*根本原因*是【JS 是弱类型语言】。

第二个问题:转换的分类有哪些?

通常有三种情况会涉及类型转换:【显式类型转换】、【隐式类型转换】、 【拆箱装箱】。下面分别来详细了解一下 各个情形。

2-1. 显式类型转换

显式类型转换通常有两种方式:构造函数,转换方法。

(1)调用构造函数,例如:

let a = Number('lxh')

let b = String(11111)

下面我将详细深入一下 Number()和 Boolean()两个方法的显式类型转换规则。

Number()的显式类型转换规则如下:

如果是Boolean,转换规则: true 为 1,false 为 0

如果是Number,转换规则:返回自身。

如果是null,转换规则:返回0。

如果是undefined,转换规则:返回NaN。

如果是String,转换规则:若由 纯数字、/0x开头的数字、/0X开头的数字、+或-的数字组成,则转为十进制;若由 有效浮点数组成,则转为浮点数;若由 ''(空字符串)组成,则转为0;若均不满足以上条件,则返回NaN。

如果是Symbol,转换规则:报错。

如果是是Object,转换规则:若内置 [Symbol.toPrimitive]则调用Number,否则调用valueOf();若上一步返回值为 NaN,则调用toString()。

Boolean()的显式类型转换规则如下:

除了 undefined、null、false、''、0(包括+0,-0)、NaN 转换出来是 false,其他都是 true。

(2)调用方法,例如:

转字符串:toString() 转数字: parseInt(),parseFloat()

2-2. 隐式类型转换

隐式类型转换通常有三种情况会发生: 操作符, if/while判断, == 。

复杂数据类型在隐式转换时,先调用 valueOf,再调用 toString。 空数组的 toString()方法会得到空字符串,而空对象的 toString()方法会得到字符串 [objectObject]

(1)操作符

一元正负:+ - 遇到字符串,转 Number。

&&,||,!,*,/,%:遇到字符串,转 Number。

二元加减:+ - 遇到字符串,+转 String,-转 Number。

下面我将详细深入一下 +操作符的隐式类型转换规则:

Number+Number ,进行加法运算;

String+String,进行字符串拼接;

String+(undefined/null/Boolean),调用【toString()】方法进行字符串拼接;

String+(纯Object/Array/RegExp),分情况调用Object的【toString()】或【ValueOf()】转为基本数据类型,再进行字符串拼接;

Number+(undefined/null/Boolean/Number),转为数字进行加法运算;

Number+(纯Object/Array/RegExp),分情况调用Object的toString()或ValueOf()转为基本数据类型,再进行字符串拼接;

Number+String,进行字符串拼接;

关于Object的toString()或ValueOf(),见下一小节「003 JS装箱拆箱」。

// todo 代码插图

(2)判断语句

i

『加入书签,方便阅读』