类型是值的内部特征,它定义了值的行为以使其区别于其他值。JavaScript中变量没有类型,值才有。
内置基本类型
8种,分为原始类型和引用类型。
- 原始类型
number用于任何类型的数字:整数或浮点数,在±(253-1)范围内的整数。bigint用于任意长度的整数。(ES2020)string用于字符串:一个字符串可以包含 0 个或多个字符,所以没有单独的单字符类型。boolean用于true和false。null用于未知的值 —— 只有一个null值的独立类型。undefined用于未定义的值 —— 只有一个undefined值的独立类型。symbol用于唯一的标识符。(ES2015)
- 引用类型
object用于更复杂的数据结构。
- 原始类型和引用类型的区别:
- 原始类型值无法更改
- 原始类型判断是否相等比较的是值,引用类型比较的是地址
- 复制原始类型值是独立拷贝,复制引用类型复制的是地址,他俩指向用一个对象。
类型转换
1.隐式转换:
-
原始类型:
String();Number();Boolean; -
引用类型:
-
-
调用
obj[Symbol.toPrimitive](hint)如果这个方法存在, -
否则,如果 hint 是
"string"- 尝试
obj.toString()和obj.valueOf(),无论哪个存在。
- 尝试
-
否则,如果 hint 是
"number"或者
"default"- 尝试
obj.valueOf()和obj.toString(),无论哪个存在。
- 尝试
-
2.显示转换:
-
String();Number();Boolean;Object() -
.toString() // undefined null 没有 Number(3).toFixed() Number(3).toExponential() Number(3).toPrecision() ''+value // 特殊 先调用valueOf +value parseInt(); parseFloat();
类型识别
typeOf value任何引用对象只能识别为对象,null也是对象obj instance costructor判断变量是否是给定类的实例,不可跨frameobj.constructor.name可检测自定义类型,null,undefined没有,不检查原型链有原型时失效,多重继承失效,不可跨frame4.鸭子类型duck-typing isArray的原理 5.
Object.prototype.toString.call(obj)检测[[class]] 可以检测所有原生对象,不可检查自定义对象的具体类型。