2.JS判断数据类型的四种方法 typeof、instanceof、constructor、Object.prototype.toString.call()

127 阅读1分钟
// 基本数据类型
var num = 123
console.log(typeof num); // number
console.log(Object.prototype.toString.call(num)); // [object, Number]

var str = '123'
console.log(typeof str); // string
console.log(Object.prototype.toString.call(str)); // [object, String]

var bool = true
console.log(typeof bool); // boolean
console.log(Object.prototype.toString.call(bool)); // [object, Boolean]

var test = null
// console.log(typeof test); // object
console.log(test === null); // true
// console.log(test instanceof Object); // false
console.log(Object.prototype.toString.call(test)); // [object, Null]

var test2
console.log(typeof test2); // undefined
console.log(Object.prototype.toString.call(test2)); // [object, Undefined]

// 引用数据类型
var obj = {}
// console.log(typeof obj); // object
console.log(obj instanceof Object); // true
console.log(obj.__proto__.constructor === Object); // true
console.log(obj.toString()); // [Object, Object]

var arr = [1, 2]
// console.log(typeof arr); // object
console.log(arr instanceof Array); // true
console.log(arr.__proto__.constructor === Array); // true
console.log(Object.prototype.toString.call(arr)); // [object, Array]

var date = new Date()
// console.log(typeof date); // object
console.log(date instanceof Date); // true
console.log(date.__proto__.constructor === Date); // true
console.log(Object.prototype.toString.call(date)); // [object, Date]

var reg = /123/
// console.log(typeof reg); // object
console.log(reg instanceof RegExp); // true
console.log(reg.__proto__.constructor === RegExp); // true
console.log(Object.prototype.toString.call(reg)); // [object, RegExp]

var func = function () { }
console.log(typeof func); // function
console.log(func instanceof Function); // true
console.log(func.__proto__.constructor === Function); // true
console.log(Object.prototype.toString.call(func)); // [object, Function]

instanceof 的简易实现

// instanceof 的原理:右边构造函数的 prototype 属性是不是在左边实例对象的原型链上
function myInstanceOf(left, right) {
    let leftVal = left.__proto__ // 或使用 Object.getPrototypeOf(object) 返回指定对象的原型
    let rightVal = right.prototype
    while (leftVal !== null) {
        if (leftVal === rightVal) return true
        leftVal = leftVal.__proto__
    }
    return false
}
var arr = []
console.log(myInstanceOf(arr, Date)); // false
console.log(myInstanceOf(arr, Array)); // true
console.log(myInstanceOf(arr, Object)); // true