一、数据类型

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