内置类型
JS 中分为七种内置类型,七种内置类型又分为两大类型:基本类型和对象(Object)。 基本类型有六种: null
,undefined
,boolean
,number
,string
,symbol
。
Typeof
typeof 对于基本类型,除了 null 都可以显示正确的类型
000 开头代表是对象,然而 null 表示 为全零,所以将它错误的判断为 object 。
instanceof 和 Object.prototype.toString.call
typeof 无法判断数组,对象.
可以通过Object.prototype.toString.call(xx)
。这样我们就可以获得类似 [Object Type]
的字符串。instanceof
可以正确的判断对象的类型,因为内部机制是通过判断对象的原型链 中是不是能找到类型的 prototype
。
类型转换
ToString
负责处理非字符串到字符串的强制类型转换
null转换为’null’,undefined转换为’undefined’,其他基本类型都调用基本类型的包装对象属性toString()并返回值。
const a = 123;
const _a = new Number(123);
console.log(String(a), _a.toString()); //'123' '123'
数字的字符串化遵循通用规则,但是极小极大数字使用指数形式
const a = 1.07*1000*1000*1000*1000*1000*1000*1000;
console.log(String(a)); //'1.07e+21'
对于普通对象来说,除非自行定义,否则toString()
返回Object.prototype.toString()
的值,其他对象有自己的toString()
方法则调用自己的该方法.
const b = {};
console.log(String(b)); //[object object]
对于数组来说会转成以“,”拼接各项的字符串
const arr = [{s:1},2,3]
console.log(arr.toString()) //"[object Object],2,3"
ToNumber
负责处理非数字到数字的强制类型转换
true转换为1,false转换为0,undefined转换为NaN,null转换为0
console.log(Number(null)); //0
console.log(Number(undefined)); //NaN
console.log(Number(true)); //1
console.log(Number(false)); //0
对字符串的处理遵循数字常量的相关规定/语法,处理失败时返回NaN
console.log(Number('123')); //123
console.log(Number('0b111')); //7
console.log(Number('0o123')); //83
console.log(Number('0x123')); //291
console.log(Number('123a')); //NaN
console.log(Number('a123')); //NaN
对象(包括数组)会首先按照ToPrimitive
抽象操作被转换为相应的基本类型值,再按照前两条规则处理;如果某个对象即不存在valueOf
方法也不存在toString
方法,则会产生TypeError
错误(例如Object.create(null)不存在以上两种方法)
const arr = [1, 2, 3];
console.log(Number(arr)); //NaN
console.log(Number(arr.toString())); //NaN
const num = new Number(123);
console.log(Number(num)); //123
console.log(Number(num.valueOf())); //123
const bool = new Boolean(true);
console.log(bool.valueOf()); //true
console.log(Number(bool)); //1
console.log(Number(bool.valueOf())); //1
const obj1 = {
toString:()=>"21"
}
const obj2 = {
valueOf:()=>"42",
toString:()=>"21"
}
const obj3 = {
a:1
}
console.log(Number(obj1)); //21
console.log(Number(obj2)); //42
console.log(obj3.toString()); //[object Object]
console.log(Number(obj3)); //NaN
const obj = Object.create(null);
console.log(Number(obj)); //TypeError
ToBoolean
负责处理非布尔值到布尔值的强制类型转换,规则如下
可以被转换为false
的值(undefined
,null
,false
, 0
和NaN
,’’)
其他都被转换为true(切记:封装对象均被转为true)
隐式强制类型转换
隐式强制类型转换为字符串
一元运算符加号(+)首先把非基本类型通过ToPrimitive抽象操作转换为基本类型,如果加号中的两项有一项是字符串,另一项则进行ToString操作,进行字符串拼接,如果是布尔值加数字,则对布尔进行ToNumber操作再求和
隐式强制类型转换为数字,通过一元运算符-、/、*转换,遵循ToNumber的抽象值操作规则
隐式强制类型转换为布尔值
if(..)语句中的条件判断表达式
for(..;..;..)语句的第二个条件判断表达式
while(..)和do..while(..)的条件判断表达式
?:中的条件判断表达式
逻辑运算符||和&&左边的操作数(a||b等同于a?a:b,a&&b等同于a?b:a)