JS类型转换总结

2018-08-05  本文已影响0人  destiny0904

前言

JS 令人头疼的一点就是它属于弱类型语言,一个变量存储的值可以是字符串、数值、布尔值或者对象等,可以随时变更。获取一个变量,你不会知道其存储的值是什么类型的,所以很多时候都需要进行类型检测。

除了手动变更类型之外,有些情况下,JS 内部也会自动进行类型转换,以满足部分操作符以及语句等的执行。

下面就是我对 JS 类型转换的一些总结,其中大部分来自《JavaScript 高级程序设计》这本书。

1. Boolean 转换

转换情况

转换规则

数据类型 转换为 true 的值 转换为 false 的值
String 任何非空字符串 空字符串""
Number 任何非零数字值(包括无穷大) 0NaN
Object 任何对象 null
Undefined 不适用 undefined

也就是说,只有 0 / NaN / "" / null / undefined 才会转换为 false,其余都是 true

所以在 if 判断中,直接写变量有时候是不够严谨的

if (!a){
  //=> 想要在 a 不存在或没定义的时候执行
  //=> 实际上存储的值是 0 或者 '' 等也会执行
}

//=> 应该使用 typeof
if (typeof a == 'undefined') {
  //=> a 不存在或没定义的时候执行
}
//=> 或者使用全等
if (a === undefined) {
  //=> 使用 == 也不够严谨,因为 null == undefined
  //=> 需要区分 null 或 undefined 的 情况较少
}

2. Number 转换

转换情况

转换规则

Number()

// [普通对象]
({}).toString() => '[object Object]' => NaN

// [数组]
[12,23].toString() => '12, 23' => NaN
[12].toString() => '12' => 12
[].toString() => '' => 0

// [正则]
/^$/.toString() => '/^$/' => NaN

// [函数]
function a() {}
a.toString() => "function a(){}" => NaN

parseInt()

parseFloat()

3. String 转换

转换情况

转换规则

toString() 方法

String() 转型函数,你可以认为 StringtoString 转换机制是一样的。

4. 特殊转换

+ 号操作的特殊情况

// 虽然没有看到字符串,但是引用类型转换为数字时,会先转换为字符串,这样就变成了字符串拼接
[12] + 10 //=> "1210"
({}) + 10 //=> '[object Object]10'

{} + 10 //=> 10
//=> 原因是 {} 会被解析为代码块,最后只是操作了 +10 

{} + {} //=> '[object Object][object Object]'
//=> 非常特殊,不同浏览器解析有差异

({})+{} //=> '[object Object][object Object]'
{} + ({}) //=> NaN
//=> 一行中开头的 {} 才会被解析为代码块,所以用 () 包裹后可以避免被解析为代码块,一行后面的 {} 不会被解析为代码块,而是空对象。

== 进行比较时
对象 == 对象:地址相等才相等

{} == {} //=> false
[] == [] //=>false
{name: 'xxx'} == {name: 'xxx'} //=> false

var obj1 = {};
var obj2 = obj1;
obj1 == obj2 //=> true

对象 == 数字:把对象转换为数字
对象 == 布尔:都转化为数字
字符串 == 数字:把字符串转换为数字
字符串 == 布尔:都转化为数字
布尔 == 数字:把布尔转换为数字
对象 == 字符串:把对象转换为字符串之后再比较

1==true //=> true
1==false //=> false
2==true //=> false,都转化为数字

[]==false //=> true,都转换为数字
[]==true //=> false,都转换为数字
![]==false //=> true,先算 ![] 为 false,再比较
![]==true //=> false,先算 ![] 为 false,再比较
[]==![] //=> true,先算 ![] 为 false,然后都转换为数字再比较
上一篇下一篇

猜你喜欢

热点阅读