js 类型
类型分类
js中数据类型 一共有八种。分别是 7种原始类型 ( undefined,Null Number,String,Boolean,Symbol,BigInt)和对象 (Object)
除了Object 其他的类型的值本身都是无法被改变的。
Object 其实又可以细分为 function, Arrary,Date,RegExp
类型判断
typeOf
基本类型都可以用typeof来判断,function 也可以通过typeof来判断
但是基本类型中有例外-null 直接用typeof null 会返回 object 需要使用String(null)来判断null
typeof NaN 会返回 number 需要用isNaN来判断是否是NaN类型。
Object 类型直接用typeof判断会返回object,没办法细分,所以我们要用其他办法判断
Object.property.toString.call()
因为js一切皆对象,所以每个对象上都有一个这个toString方法。这个方法几乎支持所有的类型的判断。 这里的NaN类型也会返回为number,所以要精确的判断的是否是NaN 只能用isNaN
比如
let arr = new Array() Object.prototype.toString.call(arr) //'[object Array]' let a = 1 Object.prototype.toString.call(a) //'[object Number]' Object.prototype.toString.call(NaN) //'[object Number]' Object.prototype.toString.call(null)//'[object Null]’ function fn(){ Object.prototype.toString.call(fn)//'[object Function]’
instanceof
instanceof 是用来判断一个对象是不是另一个对象的原型链中 所以我们可以用来判断引用类型的类型。
如:
[1,2] instanceof Array //true ({a:1}) instanceof Object //true (new Date) instanceof Date //true //值类型直接用instanceof 会返回false ,null 和 NaN 用instanceof 会报错 "a" instanceof String //false null instanceof null // Uncaught TypeError: Right-hand side of 'instanceof' is not an object at <anonymous>:1:6 NaN instanceof NaN // Uncaught TypeError: Right-hand side of 'instanceof' is not an object at <anonymous>:1:5 *如果非要用instanceof 判断值类型 可以这么判断 需要明确的定义一下如: let a = new String("a") a instanceof String //true
instanceof的实现原理
instanceof就是去遍历左边函数的原型链,判断右边的对象 是否能在左边的原型链中,如果是就返回true,否则返回false。 手动实现一个instanceof
手写instanceof function myInstanceof(left,right){ //let proto = Object.getPrototypeOf(left); let proto = left.__proto__ let prototype = right.prototype; while(true){ if(proto === null){ return false; }else if(proto === prototype){ return true; }else{ //proto = Object.getPrototypeOf(proto); proto = proto.__proto__ } } }
类型转换
类型转换有显式的转换方式,也有隐式的转换方式。
显示
转换类型 | 函数 | 当值为null时 | 特性 | 备注 |
转为字符串 | toString | 报错 |
[1].toString() //“1”
[1,4].toString()//“1,4"
|
|
String() | 'null' | |||
转为数字 | Number() | 0 | 转为数字 | 如果x无法转成数字 会返回NaN |
parseInt() | NaN | 转为整数 | 如果x无法转成数字 会返回NaN | |
parseFloat() | NaN | 转为浮点数 | 如果x无法转成数字 会返回NaN | |
转为布尔值 | Boolean() | false |
字符串,数字(除0以外)等转为true
undefined转为false
0转为false
|
隐式
隐式转换就是通过一些运算符号或者对比符号进行隐式转换。
-(减号)*(乘号)/(除号)%(取余) 一律转成数值计算。
+(加号)
- 数字+字符串 = 字符串
- 数字+对象 先调用对象的valueof再调用tostring 进行拼接 举几个例子
1+{"a":"2”} //'1[object Object]’ 1+(function a(){}) //'1function a(){}’ 1+ (new Date()) //'1Thu Oct 21 2021 18:21:27 GMT+0800 (中国标准时间)’ 1+["a","b”] //'1a,b'
- 数字+boolean = 数字
1+true //2 1+false //1
- 数字+null = 数字
1+null //1
- 数字+undefined ==NaN / +undefined ==NaN
NaN !== NaN