JavaScript 数据类型转换详解

1. 内置类型

JavaScript 中有 7 中内置类型,分为基本类型引用类型

(1)基本类型

  • null
  • undefined
  • boolean
  • number
  • string
  • symbol

其中NaN属于number,但是NaN !== NaN

基本类型变量都保存在栈内存中。

(2)引用类型

  • object

函数、对象、数组,都属于object

引用类型变量保存在栈内存中,保存在堆内存中,通过指针来指向堆内存中对应的值。

2. 类型判断 typeof

(1)基本类型

除了null显示object,其他的类型都能正常显示自身的数据类型。

console.log(typeof null); // object
console.log(typeof undefined); // undefined
console.log(typeof true); // boolean
console.log(typeof 1); // number
console.log(typeof 'abc'); // string
console.log(typeof Symbol()); // symbol

(2)引用类型

除了函数显示function,其他的都能显示object

console.log(typeof console.log); // function
console.log(typeof {}); // object
console.log(typeof []); // object

3. 类型转换

在 JavaScript 中,只有3种类型转换:

  • 转为boolean
  • 转为string
  • 转为number

1. 直接转换

转换规则

原始值转换目标结果
numberboolean0+0-0NaNfalse,其余为true
stringboolean''false,其余为true
nullundefinedbooleanfalse
引用类型booleantrue
numberstring2 => '2'
booleanstringtrue => 'true'
数组string[1, 2] => '1,2'
对象string'[object Object]'
stringnumber'1' => 1'a' => NaN
数组number[] => 0、只有一个数[2] => 2、其余NaN
nullnumber0
除了数组引用类型numberNaN
symbolnumberCannot convert a Symbol value to a number

常见转换举例

类型to Booleanto Numberto String
Booleantruetrue1"true"
Booleanfalsefalse0"false"
Number123true123"123"
NumberInfinitytrueInfinity"Infinity"
Number0false0"0"
NumberNaNfalseNaN"NaN"
String""false0""
String"123"true123"123"
String"123abc"trueNaN"123abc"
String"abc"trueNaN"abc"
Nullnullfalse0"null"
UndefinedundefinedfalseNaN"undefined"
Functionfunction() {}trueNaN"function(){}"
Object{}trueNaN"[object Object]"
Array[]true0""
Array["abc"]trueNaN"abc"
Array["123"]true123"123"
Array["123", "abc"]trueNaN"123, abc"

2. 四则运算

(1)加法运算,一个是string,另一个也转为string

(2)其他运算,一个是number,另一方也转为number

console.log(2 + '3'); // 23
console.log(null + '3'); // null3
console.log('a' + +'b'); // aNaN
console.log(true + true); // 2
console.log(1 + [1, 2]); // 11,2

console.log(2 * '3'); // 6
console.log(2 - '3'); // -1

3. == 操作符

如果被比较的两个数据类型不一致,则会自动进行类型转换后再比较。

判断X == Y

  1. 判断两者类型是否相同。若相同,则比较是否相等。

  2. 若类型不相等,先进行类型转换。

  3. 首先判断是否为null == undefined,若是,则返回true

  4. 判断是否为string === number,若是,将string转化为number后再判断两者值是否相等。

    '123' => 123

  5. 判断是否出现boolean,若出现boolean,将boolean转化为number后再进行判断。

    true => 1false => 0

  6. 判断其中一方是否为 object 且另一方为 stringnumber 或者 symbol,是的话就会把 object 转为原始类型再判断。

    { name: 'jack' } => '[object Object]'

判断流程总结如下图所示:

4. 比较运算符

  • 如果是对象,就通过toPrimitive转换对象
  • 如果是字符串,就通过unicode字符索引来比较

📘📘欢迎在我的博客上访问:
https://lzxjack.top/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火星飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值