1.数据类型
(1)原始值:number、string、boolean、undefined、null、symbol
(2)引用值:object
(3)区别:原始值和引用值的存储方式不同,原始值在栈内存里放的是值,而引用值放的是堆地址,所以当将一个引用值赋值给一个变量时,拷贝的也是堆的地址,指向同一个地址,改变的时同一个引用值
2.typeof
返回字符串,表示传入值的数据类型

typeof function fn(){} //"function"
typeof "abc" //"string"
typeof NaN //"number"
typeof undefined //"undefined"
typeof true //"boolean"
typeof null //"object"
typeof [1, 3] //"object"
typeof {name: "lemon"} //"object"
typeof new String("abc") //"object"
3. 类型转换
(1)显式类型转换
①Number():将括号内的值转换为数值型
传入原始值时
-
数值 => 数值
-
字符串 => 数值、NaN、0
-
布尔值 => 1/0
-
undefined => NaN
-
null => 0
传入引用值时
-
先调用该引用值的valueOf方法,返回的值如果为原始值,则直接对该值使用Number()方法,结果如上所示
-
若返回的值为引用值,接着调用对象自身的toString函数,如果返回值为原始值,则对该值使用Number
-
valueOf() => 原始值 => Number()
=> 引用值 => toString() => 原始值 => Number()
=> 引用值 => 报错
②String():将括号内的值转化为字符串
传入原始值
- 原始值 => 字符串
传入引用值
- 先调用引用值的的toString方法,如果返回原始值,则对该值使用String方法
- 如果返回引用值,再调用引用值自身的ValueOf方法,若返回原始值,则对该值使用String,若仍返回引用值,则报错
-
toString() => 原始值 => String()
=> 引用值 => valueOf() => 原始值 => String()
=> 引用值 => 报错
③ Boolean():将传入的值转换为布尔值
除了undefined/null/NaN/0/false/""转化为false之外,其它均为true
④parseInt(string, radix):以radix为基底,转化为10进制的整数
parseInt("c", 16) //12
parseInt("10.5") //10 不会四舍五入,直接去掉小数点
parseInt("8abc") //8
⑤parseFloat(string):转化为正常小数
parseFloat("12.6ac") //12.6
⑥toString(radix):以10进制为基底转化为目标进制,undefined和null不可以使用toString()方法(不能形成包装类)
[1,3].toString() //"1,3"
(10).toString(8) //"12"
true.toString() //"true"
({name: "lemon"}).toString() //"[object Object]"
(2)隐式类型转化
①四则运算
'1' + true // '1true'
1 + true //2
②判断语句
if("aaa"){
console.log('aaa') //"aaa"转化为布尔值为true,所以打印出"aaa"
}
③Native调用,如console.log/alert
④isNaN():判断是否为NaN,先进行Number()转换
isNaN(NaN) //true
isNaN(undefined) //true
isNaN(null) //false