面试整理:js判断数据类型的方法

208 阅读2分钟

判断数据类型

  • [typeof]** **

获取当前变量具体的数据类型
特点:
  1. 检测结果是一个字符串,字符串中包含数据类型
  2. 检测一个未被生命的变量,不会报错,返回undefined
  3. 任何实现内部[[call]]方法的对象都应该在typeof检测时返回‘function’
  4. 性能比instanceof好一些
  5. typeof function(){} => "function"
缺点:不能细分对象
js 的七种数据类型,分别为:Number Array Boolean String Object null undefine=>对应返回类型:number object boolean string object object undefine

其中null返回类型为“object”
原因: 所有数据类型值,在计算机底层都是按照‘二进制’来存储的64bit;typeof检测就是按照‘二进制’来进行的检测, null(0000...)与object(000) 前三位都是000所以都被识别为 object类型

  • [instanceof]

作用:可以细分不同类型的对象(也可以检测出基于构造函数方式创建出来的基本类型对象值)
用法:变量 instanceof 数据类型 返回的是true/false
原理:构造函数[symbol.hasInstance](实例)
          检测当前实例多出原型链上,这个构造函数是否会出现,如果出现就是true
缺点:1.在js中原型链是可以改动的
2.所有实例的原型链最后都指向object.prototype,所以“实例 instanceof object”的结果都是 true
3.字面量方式创造的的基本数据类型值无法基于instancof检测的,因为它本身不是对象不存在__proto__这个东西

特殊:var isArray = value instanceof Array; value必须与Array在同一个全局作用域中, 如果value在另一个frame中定义的数组,会返回 false

  • [Object.prototype.toString.call()方法]

作用:比较准确的判断对象实例的类型
特点:
   1.原生数组的构造函数名与全局作用域无关,所以没有 instanceof的限制
   2.可以用这个思路来测试某个值是不是原生函数或者正则表达式
缺点:Object.prototype.toString()本身也可能会被修改
大部分数据类型原型上都有toString,但一般转成字符串,symbol.toString()=>"symbol()",但object.prototype.toString='[object 所属构造函数信息]' =》所属构造函数信息是通过Symbol.toStringTag获取

  • [isNaN()]

isNaN看的是值,只要值是数值类型的即可

 var n1 = '123'; //判断n1是不是一个数字 
 var res = isNaN(n1); 
 console.log(res); // isNaN 返回的是一个 true, 不是数字

进行隐式数据转换 将null、boolean类型 转换成对应的数字,在进行判断 null=>Number(null)为 0

var a = null; 
var b = false; 
var s = 'abc'; 
console.log(isNaN(a),isNaN(b),isNaN(s));//false false true
  • [Array.isArray( value )]

确定某个值是不是数组
Array.isArray(arr) 返回 true / false
有浏览器兼容问题 , 支持HTML5的都支持