typeof 对于基本类型,除了 null 均可以显示正确的类型数组
000 开头表明是对象,然而 null 表示 为全零,因此将它错误的判断为 object 。
bash
typeof 没法判断数组,对象.spa
能够经过 Object.prototype.toString. call(xx)。这样咱们就能够得到相似 [Object Type] 的字符串。
prototype
instanceof 能够正确的判断对象的类型,由于内部机制是经过判断对象的原型链 中是否是能找到类型的 prototype。
code
ToString负责处理非字符串到字符串的强制类型转换cdn
null转换为'null',undefined转换为'undefined',其余基本类型都调用基本类型的包装对象属性toString()并返回值。对象
const a = 123;
const _a = new Number(123);
console.log(String(a), _a.toString()); //'123' '123' 复制代码
数字的字符串化遵循通用规则,可是极小极大数字使用指数形式blog
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
复制代码
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)