类型判断の四种方法

var num = 1234;
var str = "qwer";
var b = true;
var arr = [1,2,3];
var f = function(){
    return "f";
}
var obj = {
    a: 123,
    b: {
        c: "qwer",
        d: {
            rd: num
        }
    }
};
var n = null;
var u = undefined;
var s = Symbol("sym");

typeof判断

缺点:array和null对应的是object

console.log(typeof num);//"number"
console.log(typeof str);//"string"
console.log(typeof b);//"boolean"
console.log(typeof arr);//"object"
console.log(typeof f);//"function"
console.log(typeof obj);//"object"
console.log(typeof n);//"object"
console.log(typeof u);//"undefined"
console.log(typeof s);//"symbol"

instanceof判断变量是否为某个对象的实例

缺点:①字面量(即不用new)创建的number、string和boolean型无法正确检测

console.log(num instanceof Number);//false
console.log(str instanceof String);//false
console.log(b instanceof Boolean);//false

但是使用new形式创建出的三者结果均为true

var num1 = new Number(1234);
var str1 = new String("qwer");
var b1 = new Boolean(true);
console.log(num1 instanceof Number);//true
console.log(str1 instanceof String);//true
console.log(b1 instanceof Boolean);//true

②null、undefined和symbol无法正确检测

console.log(n instanceof Object);//false
console.log(u instanceof Object);//false
console.log(s instanceof Symbol);//false

但是可以将s再用new的形式创建出来,可以正确检测。这点后续要深挖啊,感觉symbol是个大坑 = =

var s1 = new Object(s);
console.log(s1 instanceof Symbol);//true

 其他都是可以通过这种方式进行检测的~感觉也没剩下啥了 = =

console.log(arr.constructor === Array);//true
console.log(f.constructor === Function);//true
console.log(obj.constructor === Object);//true

constructor构造函数检测法

缺点:①nullundefined会报错,无法使用这种方法

console.log(n.constructor === Object);//出错
console.log(u.constructor === Object);//出错

②不保险,因为可以被随意更改

在不被更改的原始情况下,其他的还是蛮好用的~

console.log(num.constructor === Number);//true
console.log(str.constructor === String);//true
console.log(b.constructor === Boolean);//true
console.log(arr.constructor === Array);//true
console.log(f.constructor === Function);//true
console.log(obj.constructor === Object);//true
console.log(s.constructor === Symbol);//true

Object.prototype.toString.call()最好用

缺点:可能就是没有缺点吧

console.log(Object.prototype.toString.call(num));//"[object Number]"
console.log(Object.prototype.toString.call(str));//"[object String]"
console.log(Object.prototype.toString.call(b));//"[object Boolean]"
console.log(Object.prototype.toString.call(arr));//"[object Array]"
console.log(Object.prototype.toString.call(f));//"[object Function]"
console.log(Object.prototype.toString.call(obj));//"[object Object]"
console.log(Object.prototype.toString.call(n));//"[object Null]"
console.log(Object.prototype.toString.call(u));//"[object Undefined]"
console.log(Object.prototype.toString.call(s));//"[object Symbol]"

猜你喜欢

转载自blog.csdn.net/weixin_40322503/article/details/81127715