天天看点

JS数据类型的四种方式

typeof

typeo f''; // string 有效
typeo f1; // number 有效
typeof Symbol(); // symbol 有效
typeof true; //boolean 有效
typeof undefined; //undefined 有效
typeof null; //object 无效
typeof [] ; //object 无效
typeof new Function(); // function 有效
typeof new Date(); //object 无效
typeof new RegExp(); //object 无效
           

总结

  • 对于基本类型,除了null,都能正确返回类型
  • 对于应用类型,除了function以外,一律返回object类型
  • 对于null,返回object类型

instanceof

  • 使用方法,A instanceof B,如果A是B的实例,返回true,否则返回false
  • 原理:insatanceof是监测的是原型
[] instanceof Array; // true
{} instanceof Object;// true
newDate() instanceof Date;// true
 
function Person(){};
newPerson() instanceof Person;
 
[] instanceof Object; // true
newDate() instanceof Object;// true
newPerson instanceof Object;// true
           
  • 以上需要注意的是,[]不仅是Array的实例,还是Object的实例。这是因为instanceof是根据原型监测的,array的__proto__是Array的prototgype,而Array的__proto__是Object的prototype,由此可以得到[]是Array的实例的依据
  • 所以,indtanceof只能判断两个对象是否属于实例关系,不能判断一个对象实例具体属于哪种类型

constructor

  • 函数被定义的时候,会为其添加prototype原型,而原型中有一个constructor属性,这个属性指向起构造函数
console.log(''.constructor); // String
console.log(new Number(1).constructor); // Number
console.log(true.constructor); // Boolean
console.log(new Function().constructor); // Function
console.log(new Date().constructor); // Date
console.log(new Error().constructor); // Error
console.log([].constructor); // Array
           
  • null和undefined是无效二点对象,因此没有constructor所以不能通过constructor进行判断类型

toString

toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。

对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。

console.log(Object.prototype.toString.call(''))   // [object String]);
console.log(Object.prototype.toString.call(1))    // [object Number]);
console.log(Object.prototype.toString.call(true)) // [object Boolean]);
console.log(Object.prototype.toString.call(Symbol())) //[object Symbol]);
console.log(Object.prototype.toString.call(undefined)) // [object Undefined]);
console.log(Object.prototype.toString.call(null)) // [object Null]);
console.log(Object.prototype.toString.call(new Function())) // [object Function]);
console.log(Object.prototype.toString.call(new Date())) // [object Date]);
console.log(Object.prototype.toString.call([])) // [object Array]);
console.log(Object.prototype.toString.call(new RegExp())) // [object RegExp]);
console.log(Object.prototype.toString.call(new Error())) // [object Error]);
           

继续阅读