1、typeof( 基本类型 )
- 主要用于判基本类型
- 数组、对象、null 都会被判断为 object
console.log(typeof "str"); // string
console.log(typeof 2); // number
console.log(typeof true); // boolean
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof []); // object
console.log(typeof {}); // object
console.log(typeof function () {}); // function
2、instanceof( 实例 )
判断对象类型,不能判断基本数据类型- 内部的机制是通过判断在其 原型链( proto )中能否找到该类型的原型
// 手写实现
function instance_of(L, R) {
let O = R.prototype;
L = L.__proto__;
while (true) {
if (L == null) return false;
if (O === L) return true;
L = L.__proto__;
}
}
instance_of([2], Array);
// [Number、String、Boolean] instanceof [Number、String、Boolean] 为false
console.log(2 instanceof Number); // false
console.log(true instanceof Boolean); // false
console.log("str" instanceof String); // false
//true [].__proto__ == Array.prototype
console.log([] instanceof Array); // true
console.log(function () {} instanceof Function); // true
console.log({} instanceof Object);
3、constructor ( 构造函数 )
- 判断数据的类型
- 对象实例通过 constrcutor 对象访问它的构造函数
- 如果创建一个对象来改变它的原型,constructor就不能用来判断数据类型了
console.log((2).constructor === Number); // true
console.log(true.constructor === Boolean); // true
console.log("str".constructor === String); // true
console.log([].constructor === Array); // true
console.log(function () {}.constructor === Function); // true
console.log({}.constructor === Object); // true
function Fn() {}
Fn.prototype = new Array();
var f = new Fn();
console.log(f.constructor === Fn); // false
console.log(f.constructor === Array); // true
4、Object.prototype.toString.call()
- Object.prototype.toString.call()
- slice(8,-1)
var a = Object.prototype.toString;
// a.call( type ).slice(8,-1) "[object Number]"===> Number
console.log(a.call(2)); // Number
console.log(a.call(true)); // Boolean
console.log(a.call("str"));
console.log(a.call([]));
console.log(a.call(function () {}));
console.log(a.call({}));
console.log(a.call(undefined));
console.log(a.call(null));