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
posted @ 2021-10-21 18:36  Ada_Blog  阅读(233)  评论(0编辑  收藏  举报