判断数据类型(typeof&instanceof&toString)
一、数据类型
ES6规范中有7种数据类型,分别是基本类型和引用类型两大类
基本类型(简单类型、原始类型):String、Number、Boolean、Null、Undefined、Symbol
引用类型(复杂类型):Object(对象、Function、Array)
二、typeof
- typeof对于原始类型来说,除了null都可以显示正确类型
- typeof对于对象来说,除了函数都会显示object
var b = true; var u; var n = null; var o = new Object(); var a = new Array(); var f = function(){ } console.log(typeof "message"); // string console.log(typeof 921); // number console.log(typeof b); // boolean console.log(typeof u); // undefined console.log(typeof n); // object console.log(typeof o); // object console.log(typeof a); // object console.log(typeof f); // function
- typeof无法分出array与object,解决办法
Array.isArray()来判断是否是数组
三、instanceof
- instanceof 用于判断一个变量是否属于某个对象的实例。
- 语法:object instanceof constructor
object:某个对象实例;constructor:某个构造函数
var o = new Object(); var a = new Array(); var f = function(){ } console.log(o instanceof Object); // true console.log(a instanceof Object); // true console.log(a instanceof Array); //true console.log(f instanceof Object); // true
console.log(newDate() instanceof Date);//true
- 一些容易出错的点
var simpleStr = "This is a simple string"; var myString = new String(); var newStr = new String("String created with constructor"); var myDate = new Date(); var myObj = {}; var myNonObj = Object.create(null); // 返回 false, simpleStr 并不是对象 simpleStr instanceof String; // 返回 true myString instanceof String; // 返回 true newStr instanceof String; // 返回 true myString instanceof Object; // 返回 true myObj instanceof Object; // 返回 true ({}) instanceof Object; // 返回 false, 一种创建非 Object 实例的对象的方法 myNonObj instanceof Object; // 返回 false myString instanceof Date; // 返回 true myDate instanceof Date; // 返回 true myDate instanceof Object; // 返回 false myDate instanceof String;
Object.create(null) 会造成创建的对象其 __proto__ 指向为空
四、toString
- 每一个引用类型都有
toString
方法,默认情况下,toString()
方法被每个Object
对象继承。如果此方法在自定义对象中未被覆盖,toString()
返回"[object type]"
,其中type是对象的类型。 - 注意,上面提到了如果此方法在自定义对象中未被覆盖,
toString
才会达到预想的效果,事实上,大部分引用类型比如Array、Date、RegExp
等都重写了toString
方法。 - 我们可以直接调用
Object
原型上未被覆盖的toString()
方法,使用call
来改变this
指向来达到我们想要的效果。
function getType(target) { return Object.prototype.toString.call(target); }
const mapTag = '[object Map]'; const setTag = '[object Set]'; const arrayTag = '[object Array]'; const objectTag = '[object Object]'; const boolTag = '[object Boolean]'; const dateTag = '[object Date]'; const errorTag = '[object Error]'; const numberTag = '[object Number]'; const regexpTag = '[object RegExp]'; const stringTag = '[object String]'; const symbolTag = '[object Symbol]'; //例子 const setType = getType(new Set()); console.log(setType === setTag) //true