判断数据类型的几种方法

本文详细探讨了JavaScript中typeof和instanceof用于判断数据类型的优缺点,指出typeof对于值类型判断准确但对引用类型区分模糊,而instanceof则适用于检测原型链关系,但受制于构造函数。重点介绍了toString方法作为精确类型标识的实用性和其在不同数据类型上的表现。
摘要由CSDN通过智能技术生成

typeof

目前能返回以下8种判断类型

  • 值类型
    • string
    • number
    • boolean
    • symbol
    • bigint(es10新增)
    • undefined
  • 引用类型
    • object
    • function
  console.log(typeof '嚣张') // string
   console.log(typeof 18) // number
   console.log(typeof true) // boolean
   console.log(typeof undefined) // undefined
   const s1 = Symbol('s')
   const s2 = Symbol('s')
  console.log(s1); // Symbol(s)
  console.log(s1 == s2); // false
   console.log(typeof 1234567891011121314n); //bigint
  console.log(typeof null) // object
   console.log(typeof {}) // object
   console.log(typeof []) // object
   console.log(typeof function() {}) //; function
   

在这里插入图片描述

从上述案例就可以看出来其缺点是什么
值类型可以分辨清楚, 但是对于引用类型,只返回object/function, 不知道他返回的是数组, 日期还是对象

instanceof

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

   // 定义构造函数
    function A() {}
    function B() {}
    
    // A的实例对象
    const a = new A();
    
    console.log(A.prototype);
    console.log(Object.getPrototypeOf(a)); //返回指定对象的原型
    console.log(a instanceof A) //true  因为 Object.getPrototypeOf(a) === A.prototype
    console.log(a instanceof B) // false 因为B.prototype不在a的原型链上;
    // isPrototypeOf() 方法用于测试一个对象是否存在于另一个对象的原型链上。
    console.log(Object.prototype.isPrototypeOf(a)); //true
    console.log(a instanceof Object) // 因为上面为true, 所以该值也为true
    console.log(a.prototype instanceof Object) //true 同上;

    A.prototype = {};
    const a2 = new A();
    console.log(a2 instanceof A); //true
    console.log(a instanceof A); // false  A.prototype指向一个空对象, 这个空对象不在a的原型链上

    B.prototype = new A() // 继承
    // B的实例对象
    const b = new B();
    console.log(b instanceof B); // true
    console.log(b instanceof A); // true 因为A.prototype现在在b的原型链上

以上是为了让你更加料及instanceof 真正的 判断数据类型在下面

   const b = new B()
      console.log(b instanceof B) // true
      console.log(b instanceof A) // true 因为A.prototype现在在b的原型链上

      function Fn() {}
      const fn = new Fn()
      const num = new Number()
      console.log(fn instanceof Fn) // true
      console.log(num instanceof Fn) // false
      console.log(num instanceof Number) // true
      console.log('嚣张' instanceof String); // false
      console.log(18 instanceof Number); //false
      console.log(true instanceof Boolean); // false
      console.log([] instanceof Array); // false
      console.log({} instanceof Object); // false

在这里插入图片描述

看到上面运行结果会发出一个疑问, 为什么下面几个的结果是false, 因为像 ‘嚣张’ , 18, true, [], {} 等不是对象实例
此类方法只能检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

constructor

所有对象都会从它的原型上继承一个 constructor 属性

在这里插入图片描述

看上去constructor是最好的选择 , 但是官网给出了例子, 我们可以改变对象的 constructor,
只有 ‘嚣张’, 18, true 不受影响, 因为创建他们的是只读的原生构造函数(native constructors)。这个例子也说明了依赖一个对象的 constructor 属性并不安全。

Object.prototype.toString

toString() 方法返回一个表示该对象的字符串

看到toString方法 我们首先会想到, 咦 这不就是转换成字符串类型的方法吗

在这里插入图片描述
这是各数据类型调用toString()的返回值, 可以看出他们都有toString()方法

接下来再看一个例子

在这里插入图片描述
可以发现两者 Object.toString输出的是function Object() { [native code] }而object的原型上的toString输出的是[object Object]
mdn给出的解释是
每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 “[object type]”,其中 type 是对象的类型

eg:

 var o = new Object();
 console.log(o.toString()); // [object Object]
    

在这里插入图片描述
从结果可以看出来, 每个数据类型都显示出来了, 此方法是最常用,最精准的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值