首页 > 试题广场 >

说一说JavaScript有几种方法判断变量的类型?

[问答题]

说一说JavaScript有几种方法判断变量的类型?

推荐

得分点

typeof、instanceof、Object.prototype.toString.call()(对象原型链判断方法)、 constructor (用于引用数据类型)

参考答案

标准回答

JavaScript有4种方法判断变量的类型,分别是typeof、instanceof、Object.prototype.toString.call()(对象原型链判断方法)、 constructor (用于引用数据类型)

typeof:常用于判断基本数据类型,对于引用数据类型除了function返回’function‘,其余全部返回’object'。

instanceof:主要用于区分引用数据类型,检测方法是检测的类型在当前实例的原型链上,用其检测出来的结果都是true,不太适合用于简单数据类型的检测,检测过程繁琐且对于简单数据类型中的undefined, null, symbol检测不出来。

constructor:用于检测引用数据类型,检测方法是获取实例的构造函数判断和某个类是否相同,如果相同就说明该数据是符合那个数据类型的,这种方法不会把原型链上的其他类也加入进来,避免了原型链的干扰。

Object.prototype.toString.call():适用于所有类型的判断检测,检测方法是Object.prototype.toString.call(数据) 返回的是该数据类型的字符串。

这四种判断数据类型的方法中,各种数据类型都能检测且检测精准的就是Object.prototype.toString.call()这种方法。

加分回答

instanceof的实现原理:验证当前类的原型prototype是否会出现在实例的原型链proto上,只要在它的原型链上,则结果都为true。因此,instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype,找到返回true,未找到返回false。

Object.prototype.toString.call()原理:Object.prototype.toString 表示一个返回对象类型的字符串,call()方法可以改变this的指向,那么把Object.prototype.toString()方法指向不同的数据类型上面,返回不同的结果

延伸阅读

instanceof代码手撕

function myinstanceOf_(left, right) {
    let proto = left.__proto__;
    let prototype = right.prototype
    while (true) {
        if (proto == null) return false
        if (proto == prototype) return true
        proto = proto.__proto__;
    }
}
编辑于 2021-09-15 11:56:39 回复(0)

分为三个方面:存储 生命周期 性能

    存储:cookie 4k左右,localstorage 5MB, sessionstorage 5MB

    生命周期:cookie 可设置失效时间,默认是关闭浏览器后失效

            localstorage 除非被清除否则永久保存

            sessionstorage 仅在当前会话下有效,关闭页面或浏览器后就会被清除

    性能:cookie 每次都会携带在http头上,如果使用cookie保存过多数据会带来性能问题

         localstorage 仅在客户端中保存,不参与和服务器之间的通信

         sessionstorage 仅在客户端(即浏览器)中保存,不参与和服务器的通信

发表于 2022-05-13 22:43:53 回复(0)
1. typeof 方法,可以判断number、string、boolean、function等类型可以精准判断,undefined、null、array、object等返回object不准确。
2. inftanceOf方法,通过原型判断对象是否是另一个对象的实例。
3. Object.prototype.toString方法,可以返回一个表示变量类型的字符串。
4. 数组有个Array.isArray方法可以判断数组



发表于 2024-02-16 19:54:54 回复(0)
变量类型有:number,string、null、undefined、object、Boolean、Array、json、function、Date、RegExp、Error,其余的都是object
方法1:
            typeof 判断:number、string、object、Boolean
方法2:
             instanceof :判断  参照对象的prototype的属性  所指向的对象  的是否在   被行测的对象的 原型               链上  
            其中 undefined 和 null 被测为object 应为js 没有这种全局类型;
           但对于number、string、Boolean 类型 需要通过构造函数定义如:

           let num =new Number(1);

           let str =  new String('abc');

           let bool = new Boolean(true);才能被检查到;
方法3:
            constructor (构造器):原型对象的属性 指向构造函数
            constructor 解决了 number、string、Boolean 在instanceof 中需要通过构造函数定义的弊端
            可以检查出除了undefined 和 null 的类型
            但是这种方式仍然有个弊端, 就是constructor所指向的 构造函数 是可以被修改的.下例:
              
  class Stuent = {
 
              constructor(age){
 
                this.age =age;
 
             }
 
          }
 
       Student.prototype = new Person('张三')
 
       Student.prototype.constructor === 'Person'//true


发表于 2021-09-14 22:30:14 回复(0)