js基础--判断变量类型的方法梳理

在JavaScript中,判断变量类型的常见方法有以下几种:

typeof 操作符

typeof 是一个一元操作符,可以用来返回一个值的数据类型。对于基本数据类型,typeof 通常能直接返回准确的类型。

typeof 42;            // "number"
typeof 'Hello';        // "string"
typeof true;          // "boolean"
typeof undefined;     // "undefined"
typeof null;          // "object",这是一个历史遗留问题
typeof {name: 'Alice'}; // "object"
typeof [1, 2, 3];      // "object"
typeof function() {}; // "function"

 但typeof 也有一些局限性和缺点:

  1. 返回字符串typeof 返回的是表示类型的字符串,而不是类型本身。这意味着你不能直接使用 typeof 来区分不同的对象类型。

  2. 对于对象和数组的返回值: 对于所有对象(包括数组[]、对象{}等),typeof 总是返回 "object"。这意味着你不能使用 typeof 来区分数组和普通对象,或者函数和其他类型的对象。

  3. 对于 null 的返回值typeof null 返回 "object",这是ECMAScript规范的一个历史错误,可能会导致混淆。

  4. 不能区分 undefined 和其他类型typeof undefined 返回 "undefined",这是正确的,但 typeof 不能用于检查变量是否未声明,因为未声明的变量在严格模式下会导致引用错误,在非严格模式下会返回 undefined

  5. 不能用于区分 NaN 和数字typeof NaN 返回 "number",这意味着 typeof 不能用于区分 NaN(Not-a-Number)和其他数字类型。

  6. 不能用于检查自定义对象的类型: 如果你创建了自定义对象或类,typeof 只能告诉你它是一个对象,但不能提供更多关于对象类型的信息。

  7. 不能用于检查函数的参数类型: 在函数内部,typeof 可以用来检查参数是否为预期的类型,但它不能提供足够的信息来区分不同的对象类型或函数类型。

尽管有这些缺点,typeof 仍然是一个有用的工具,特别是在检查基本数据类型时。对于更复杂的类型检查,你可能需要使用其他方法,如 instanceofObject.prototype.toString.call() 或自定义类型检查函数。

    instanceof 操作符

    instanceof 操作符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

    const arr = [1, 2, 3];
    const obj = {};
    
    arr instanceof Array;   // true
    obj instanceof Object; // true

    Object.prototype.toString.call()

    这个方法可以返回一个对象的字符串表示形式,通常用于判断复杂类型。

    const arr = [1, 2, 3];
    const obj = {};
    
    Object.prototype.toString.call(arr);  // "[object Array]"
    Object.prototype.toString.call(obj);  // "[object Object]"
    Object.prototype.toString.call(null); // "[object Null]"

     为了更易读,可以创建一个辅助函数来解析这些字符串:

    function getType(obj) {
      return Object.prototype.toString.call(obj).slice(8, -1);
    }
    
    getType(arr);  // "Array"
    getType(obj);  // "Object"
    getType(null); // "Null"

    使用 slice(8, -1) 的目的是从以"[object "开头的复杂类型完整字符串中提取出类型名称:

    • 8 是因为 "[object ".length 是8个字符,从这里开始就是类型名称了。

    • -1 表示一直到字符串的末尾(不包括结束位置),这样可以确保提取出完整的类型名称。

    constructor 属性

    每个对象都有一个 constructor 属性,指向用于创建该对象的构造函数。

    const arr = [1, 2, 3];
    const obj = {};
    
    arr.constructor === Array;  // true
    obj.constructor === Object; // true

    注意constructor 属性可以被覆盖或修改,所以它并不是最可靠的方法。

    Array.isArray() 方法

    这个方法专门用于判断一个变量是否为数组类型。

    const arr = [1, 2, 3];
    const obj = {};
    
    Array.isArray(arr);  // true
    Array.isArray(obj);  // false

    总结

    在实际开发中,可以根据具体需求选择合适的方法来判断变量类型。对于基本数据类型,typeof 通常是最简单直接的方法;对于复杂类型或需要更精确判断的情况,可以使用 instanceofObject.prototype.toString.call()。对于数组类型,Array.isArray() 是最推荐的方法。

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值