yorickshan
5/15/2019 - 12:21 AM

数据类型转换

基本数据类型

  • 数字 number
  • 字符串 string
  • 布尔 boolean
  • 空 null
  • 未定义 undefined

引用数据类型

  • 对象 object
    • 普通对象
    • 数组对象 Array
    • 正则对象 RegExp
    • 日期对象 Date
    • 数学函数 Math ...
  • 函数 function

其它数据类型转换为number类型

场景

  • isNaN检测: 当被检测的值不是数字类型, 浏览器会先调用Number方法转换为数字, 然后再检测是否为非有效数字
isNaN('3') //false
  Number('3') //3
  isNaN(3) //false

isNaN('3px') //true
  Number('3px') //NaN
  isNaN(NaN) //true
  • 用parseInt/parseFloat/Number显式转换为数字类型
  • 数学运算: + - * / %, 注意'+'不仅仅是数学运算, 还可能是字符串拼接
'3' - 1 //2
  Number('3') //3
  3 - 1 //2

'3px' - 1 //NaN

'3px' + 1 //'3px1'

var i = '3';
i = i + 1; //'31'
i += 1; //'31'
i++ //4 单纯的数学运算, 没有字符串拼接
  • 在基于"=="比较的时候, 有时候会把其他值转换为数字类型
  • ...

转换规律

  • 字符串转数字
//浏览器在自行转换时都是基于Number()方法完成的
只要遇到一个非有效数字字符, 结果就是NaN

'' → 0
'   ' → 0 空格 space
'\n' → 0 换行符 enter
'\t' → 制表符 tab
  • 布尔转数字
true → 1
false → 0
  • 空/未定义转数字
null → 0
undefined → NaN
  • 引用类型值转数字
//首先转换为字符串(toString), 然后再转换为数字(Number)

其它类型值转换为字符串

场景

  • 基于alert/confirm/prompt/document.write等方法输出内容的时候, 会把输出的值转换为字符串, 然后再输出
alert(1) //'1'
  • 基于"+"进行字符串拼接的时候
  • 把引用类型值转换为数字的时候, 首先会转换为字符串, 然后再转换为数字
  • 给对象设置属性名, 如果不是字符串, 首先转换为字符串, 然后再当做属性存储到对象中(对象的属性只能是数字或者字符串)
  • 手动调用toString/toFixed/join/String等方法的时候, 也是为了转换为字符串
var n = Math.PI; //获取圆周率
n.toFixed(2); //"3.14"

var arr = [12, 23, 34];
arr.join('+'); //'12+23+34'
  • ...

转换规律

//调用`toString`方法进行转换

//对象以外
1 → '1'
NaN → 'NaN'
null → 'null'
[] → ''
[13] → '13'
[12, 23] → "12, 23"
...

//对象
'[object object]'

其它值转换为布尔类型

场景

  • 基于`!/!!/Boolean等方法转换
  • 条件判断中的条件最后都会自动转换为布尔类型
  • ...

转换规律 只有0/NaN/''/null/undefined五个值转换为布尔的false, 其余都是转换为true ![] == false //true []为true ![]为false

数学运算和字符串拼接+

//当表达式中出现字符串, 就是字符串拼接, 否则就是数学运算
1 + true //2
'1' + true //'1true'

[12] + 10 //"1210" 引用类型转换为数字, 首先会转换为字符串, 所以这里变成了字符串拼接
({}) + 10 //"[object Object]10"
[] + 10 //"10"

{} + 10 //10 这里既不是数学运算也不是字符串拼接, {} 代表一个代码块(块级作用域), 最终被执行的是 +10
严格写法为: {}; +10;

1 + undefined //NaN 这里为数学运算, Number(undefined) 为 NaN
1 + null //1
1 + false //1

==在进行比较的时候, 如果左右两边的数据类型不一样, 则先转换为相同的类型, 再进行比较

对象 == 对象 //比较的是地址

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

var obj1 = {};
var obj2 = obj1;
obj1 == obj2 //true
对象 == 数字: 对象转换为数字后再比较
对象 == 布尔: 都转换为数字 [] == false //0 == 0 true
对象 == 字符串: 都转换为数字
字符串 == 数字: 字符串转换为数字
字符串 == 布尔: 都转换为数字
布尔 == 数字: 布尔转换为数字 2 == true //false

//都是把其它值转换为数字后再进行比较
null == undefined: true
null != undefined和自己以外的其它值
undefined != null和自己以外的其它值

NaN == NaN: false //NaN和包括自己之内的所有值都不相等