美文网首页JsWeb前端之路让前端飞
前端面试题——变量的类型检测

前端面试题——变量的类型检测

作者: ac68882199a1 | 来源:发表于2017-04-02 00:00 被阅读130次

上周写了一篇文章 常见工具方法的编写——逐步实现 once 方法 - 简书,然而不知道为什么一周过去了并没有什么阅读量,综合分析了一下,觉得应该是发布时间的问题,果然不能在白天发布,以后还是回到晚上十点以后发布吧!为了提升上一篇的阅读量,在本篇开始之前,不付广告费地打个广告,感兴趣的小伙伴可以直接点击上面的链接查看哦!

下面进入正题,本篇又回到了《前端面试题》系列,这次来探讨一下 js 中的基本数据类型的检测方式

javascript 中的基本数据类型:Number String Boolean Array Object Null Undefined

常用检测方法 —— typeof

基本使用

var a = ''
typeof a

typeof 并不是一个方法,所以不需要通过()进行调用,只需要在它的后面紧跟我们需要检测的变量就可以,因为它是一个运算符

每种类型对应的 typeof 的值

typeof 1 // 'number'
typeof '' // 'string'
typeof true // 'boolean'
typeof [] // 'object'
typeof {} // 'object'
typeof null // 'object'
typeof undefined // 'undefined'
typeof function(){} // 'function'

上面的代码中,我们会发现:

  1. typeof 可以用来检测函数
  2. 当需要被检测的变量是数组、对象和 null 时,返回的结果都是object,因为 js 中的数组,本质上还是一个对象,而 null 在 js 中是一个表示为空的特殊的对象

typeof可以用来检验变量的类型,那么它的返回值又是什么类型呢?

typeof typeof 1 // 'string'
typeof typeof '' // 'string'
typeof typeof true // 'string'

通过上面的代码,我们知道了typeof的返回值是一个字符串类型

typeof 的不足

既然数组、对象和 null 通过 typeof 的检验返回的都是object,这也就说明 typeof 并不能够完美的帮助我们区分数组、对象和 null,某些情况下会给我们的工作带来不便

或许我们可以通过封装一个方法来帮助进行更细致的检测,但有没有别的方式呢?

另一种类型检测方式 —— instanceof

instanceof 运算符用来判断一个构造函数的prototype属性所指向的对象是否存在另外一个要检测对象的原型链上

简单来说,就是检测一个对象是否继承于另一个对象

基本使用

var a = 1 
a instanceof Number // true
a instanceof String // false

instanceof前为我们需要检测的变量,后面是需要判断是否有继承关系的对象,返回一个布尔值表示是否存在继承关系

所以聪明的小伙伴肯定想到了下面这种情况:

var a = []
a instanceof Array // true
a instanceof Object // true

var b = {}
b instanceof Array // false
b instance Object // true

var c = null
c instanceof Object // false

因为数组本质上也是一个对象,所以上面的两个计算结果都会返回true,但是我们也会发现,数组的检测已经和正常形式的对象区分开来了

当一个变量是null时,判断是否为Object的实例,返回为false,说明 null 虽然是个特殊的对象,但是并不继承自 Object

instanceof 的不足

虽然 instanceof能够区分数组、对象和 null,但是它的右边只能够接收一个对象类型,这也就说明,无法用instanceof来检测数字、字符串、布尔、Null 和 Undefined 类型

var a = 1
a instanceof Number // false

var b = null
b instanceof Null // Uncaught TypeError: Right-hand side of 'instanceof' is not an object

结合 typeof 与 instanceof

下面的代码是作者结合两者的特点封装过得检测变量类型的方法

    function typeOf(item) {
        if (arguments.length != 1) throw new Error('must given one argument')

        var type = typeof item

        // 判断是否为空
        if (!item) {
            return type === 'number' ? 'number' :
                        type === 'string' ? 'string' :
                             type === 'boolean' ? 'boolean' :
                                  type === 'undefined' ? 'undefined' : 'null'
        }

        // 判断是否为 object
        return type !== 'object' ? type :
            // 判断是数组还是对象
            (item instanceof Array) ? 'array' : 'object'
    }

使用上面的方法检验变量类型:

    console.log(typeOf(0)) // 'number'
    console.log(typeOf(1)) // 'number'
    console.log(typeOf('')) // 'string'
    console.log(typeOf('sss')) // 'string'
    console.log(typeOf(true)) // 'boolean'
    console.log(typeOf(false)) // 'boolean'
    console.log(typeOf([])) // 'array'
    console.log(typeOf({})) // 'object'
    console.log(typeOf(null)) // 'null'
    console.log(typeOf(undefined)) // 'undefined'
    console.log(typeOf(function(){})) // 'function'

最终,我们还是通过封装 typeof 和instanceof 完成了最终我们需要的变量检测方法

扫一扫关注前端周记微信公众号

相关文章

  • 前端面试题——变量的类型检测

    上周写了一篇文章 常见工具方法的编写——逐步实现 once 方法 - 简书,然而不知道为什么一周过去了并没有什么阅...

  • Js类型相关总结

    Js的基本数据类型 复杂数据类型 类型检测 typeof 检测检测原理是根据变量存储时低位 instanceof检...

  • typeof

    JS用来检测一个变量的类型

  • Upload-labs通关笔记(更新中)

    upload-labs包含漏洞类型分类 Pass-01(前端JS绕过) 方法一:前端检测。js的检测只能位于cli...

  • js检查各种数据类型的几种方法以及特殊情况

    js的变量是松散类型的,所以需要检测变量数据类型的方法。 1. typeof运算符 使用typeof来检测是一种基...

  • javascript检测变量的类型

    javascript检测变量的类型:目前JavaScript有三种方式:typeof,instanceof,obj...

  • 3.8 文件上传

    3.8.1. 文件类型检测绕过 3.8.1.1. 更改请求绕过   有的站点仅仅在前端检测了文件类型,这种类型的检...

  • 解两道关于JS“引用类型”和“变量提升”的面试题

    在前端面试中,少不了关于JS引用类型和变量提升的题目,今天就分享两道面试题并附上详解过程。供读者学习巩固基础知识。...

  • 009——基础加强

    检测变量 打印变量 类型转换 销毁变量 函数 时间戳函数 读取文件夹 数组 static 类

  • js

    js 是动态语言,变量的数据类型是可以变化的 isNaN(m),判断 m 是否不是数字 typeof 检测变量类型...

网友评论

    本文标题:前端面试题——变量的类型检测

    本文链接:https://www.haomeiwen.com/subject/zwbwottx.html