JS类型
JS中基本数据类型记忆法:USONB(除了object,其他都存储在内存栈中)
- U:undefined
- S:string symbol
- O:object
- N:null(属于object类型,typeof判断得到的结论) number
- B:boolean
关于null和undefined:
null表示"没有对象",用作一个空值的显示。表示一个变量预期有值,但是目前为空值。
undefined表示“缺少值” ,即访问一个不存在的变量或对象属性时的默认返回值。
JS中引用类型:(存储在内存堆中)
- Object
- Array
- Date
- Regexp
- Function
- 基本包装类型(String Number Boolean Global Math)
类型判断
(1)typeof——用于基本数据类型
typeof 不能精确判断object类型,只能告诉我们是object,所以对object对象的判断使用instanceof。
(2)instanceof——用于引用类型
判断一个实例是否属于某种类型、判断一个实例是否是其祖先类型的实例。
(3)Object.prototype.toString.call——用于任意类型
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call('hi') // "[object String]"
Object.prototype.toString.call({a:'hi'}) // "[object Object]"
Object.prototype.toString.call([1,'a']) // "[object Array]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(() => {}) // "[object Function]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(Symbol(1)) // "[object Symbol]"
类型转换
基本数据类型->基本数据类型
| 原始值 | 转为boolean | 转为number | 转为string |
|---|---|---|---|
| false | false | 0 | 'false' |
| true | true | 1 | 'true' |
| 0 | false | 0 | '0' |
| 1 | true | 1 | '1' |
| NaN | false | NaN | 'NaN' |
| Infinity | true | Infinity | 'Infinity' |
| -Infinity | true | -Infinity | ''-Infinity' |
| '0' | true | 1 | '0' |
| '20' | true | 1 | '20' |
| '' | false | 0 | '' |
| 'hjh' | true | NaN | 'hjh' |
| null | false | 0 | 'null' |
| undefined | false | NaN | 'undefined' |
引用类型->基本数据类型(内含ToPrimitive函数原理)
| 原始值 | 转为boolean | 转为number | 转为string |
|---|---|---|---|
| {} | true | NaN | '[object Object]' |
| [] | true | 0 | '' |
| function(){} | true | NaN | 'function(){}' |
| [1] | true | 1 | '1' |
| [1,2] | true | NaN | '1,2' |
| ['aaa'] | true | NaN | 'aaa' |
| ['aaa','bbb'] | true | NaN | 'aaa,bbb' |
(1)所有引用类型转boolean都是true
(2)转number或string逻辑
- 转string时调用
ToPrimitive(input, 'string'),先调用toString方法,如果得到的是原始数据类型,返回该值;否则调用valueOf方法,如果得到的是原始数据类型,返回该值;否则抛出异常 - 转number时,调用
ToPrimitive(input, 'number'),先调用valueOf方法,如果得到的是原始数据类型,返回该值;否则调用toString方法,如果得到的是原始数据类型,返回该值;否则抛出异常
valueOf和toString的返回值
| valueOf返回值 | toString返回值 | |
|---|---|---|
| Number | 返回对象本身 | 转换为字符串类型时的字符串值。 可以传一个参数,决定转换为字符串时的进制(2、8、16) |
| String | 返回对象本身 | 返回对象本身 |
| Boolean | 返回对象本身 | 返回"true"或"false"字符串 |
| Object | 返回对象本身 | 返回的是"[object type]"字符串,"type"指的是对象本身的类型识别。 例如Object对象返回"[object Object]",Math对象返回"[object Math]" |
| Array | 返回对象本身 | 相当于用数组值调用join(',')所返回的字符串。 例如:[1,2,3].toString()会是"1,2,3" |
基本数据类型->引用类型
| 字符串 | 数值 | true | false | boolean |
|---|---|---|---|---|
| object | new String(字符串) | new Number(数值) | new Boolean(true) | new Boolean(false |
隐式类型转换场景
- 条件判断
- 一元操作符,例如
+'1'、-a - 二元运算符,例如
a==b,a+b