前言

  日常的开发中,我们经常会遇到判断一个变量的数据类型或者该变量是否为空值的情况,你是如何去选择判断类型的操作符的?本文来总结记录一下我们开发人员必须掌握的关于 typeof 和 instanceof 的知识点以及在开发中的使用建议,同时在面试过程中也经常会遇到这样的问题。

正文

  1、typeof 操作符

  typeof 操作符,确定任意变量的数据类型,确切说,它是判断一个变量是否为字符串、数值、布尔值或 undefined 的最好方式。其返回值为字符串类型,其使用方法如下:typeof 是一个操作符,不是一个函数,但是使用可以将变量作为参数传入:
  a、typeof  operand
  b、typeof (operand)
  (1)返回值为字符串类型,其中:
  

返回值

含义值

"undefined"

未定义

"boolean"

布尔值

"string"

字符串

"number"

数值

"object"

对象(而不是函数)或 null

"function"

函数

"symbol"

符号

  (2)常见使用方法

  1. console.log(typeof undefined);//'undefined'
  2. console.log(typeof true);//'bpplean'
  3. console.log(typeof ("number")); //'string'
  4. console.log(typeof "number"); //'string'
  5. console.log(typeof 1);//'number'
  6. console.log(typeof Symbol());//'symbol'
  7. //对于Array,Null等特殊对象使用typeof一律返回object,这正是typeof的局限性
  8. console.log(typeof null); //'object'
  9. console.log(typeof [1, 2, 3]);//'object'
  10. console.log(typeof undefined); //'undefined'
  11. //通过 typeof 操作符来区分函数和其他对象
  12. function f1() { console.log(111); }
  13. console.log(typeof f1); //'function'
  14. console.log(typeof f1()); // 111 'undefined'
  
  (3)不能通过typeof 来判断一个变量是否存在
  1. var a;
  2. if (a === undefined) {
  3. console.log("变量不存在")
  4. } else {
  5. console.log("变量存在")
  6. }
         // 变量不存在

  2、instanceof 操作符

  typeof虽然对原始值很有用,但它对引用值的用处不大。我们通常不关心一个值是不是对象,而是想知道它是什么类型的对象。为了解决这个问题,ECMAScript 提供了 instanceof 操作符。使用如下:

  1. function f1() { console.log(111); }
  2. console.log(f1 instanceof Object);//true
  3. console.log(f1 instanceof Function);//true
  4. console.log(f1 instanceof RegExp);//false

  所有引用值都是 Object 的实例,因此通过 instanceof 操作符检测任何引用值和Object 构造函数都会返回 true 。类似地,如果用 instanceof 检测原始值,则始终会返回 false ,因为原始值不是对象。

  instanceof 运算符用于判断构造函数的 prototype 属性是否出现在对象的原型链中的任何位置。其实现原理如下:

  1. function myInstanceof(left, right) {
  2. let proto = Object.getPrototypeOf(left), // 获取对象的原型
  3. prototype = right.prototype; // 获取构造函数的 prototype 对象
  4.  
  5. // 判断构造函数的 prototype 对象是否在对象的原型链上
  6. while (true) {
  7. if (!proto) return false;
  8. if (proto === prototype) return true;
  9. proto = Object.getPrototypeOf(proto);
  10. }
  11. }

  3、typeof 和 instanceof 的区别以及开发中的使用建议

  typeof 与 instance 都是判断数据类型的方法,区别如下:

  • typeof会返回一个变量的基本类型,instanceof返回的是一个布尔值

  • instanceof 可以准确地判断复杂引用数据类型,但是不能正确判断基础数据类型

  • typeof 也存在弊端,它虽然可以判断基础数据类型(null 除外),但是引用数据类型中,除了 function 类型以外,其他的也无法判断

  可以看到,上述两种方法都有弊端,并不能满足所有场景的需求

  如果需要通用检测数据类型,建议采用Object.prototype.toString,调用该方法,统一返回格式“[object Xxx]” 的字符串。使用如下:

  1. console.log(Object.prototype.toString.call(undefined)) //"[object Undefined]"
  2. console.log(Object.prototype.toString.call(true)) // "[object Boolean]"
  3. console.log(Object.prototype.toString.call('1')) // "[object String]"
  4. console.log(Object.prototype.toString.call(1)) // "[object Number]"
  5. console.log(Object.prototype.toString.call(Symbol())) // "[object Symbol]"
  6. console.log(Object.prototype.toString.call({})) // "[object Object]"
  7. console.log(Object.prototype.toString.call(function () { })) // "[object Function]"
  8. console.log(Object.prototype.toString.call([])) //"[object Array]"
  9. console.log(Object.prototype.toString.call(null)) //"[object Null]"
  10. console.log(Object.prototype.toString.call(/123/g)) //"[object RegExp]"
  11. console.log(Object.prototype.toString.call(new Date())) //"[object Date]"

写在最后

  以上就是本文的全部内容,希望给读者带来些许的帮助和进步,方便的话点个关注,小白的成长踩坑之路会持续更新一些工作中常见的问题和技术点。

js--typeof 和 instanceof 判断数据类型的区别及开发中的使用的更多相关文章

  1. js中单引号和双引号的区别(html中属性规范是用双引号,js中字符串规定是用单引号)(js中单引号区别和php很像:单引号快,双引号可转义字符,双引号可解析变量)

    js中单引号和双引号的区别(html中属性规范是用双引号,js中字符串规定是用单引号)(js中单引号区别和php很像:单引号快,双引号可转义字符,双引号可解析变量) 一.总结 1.html中属性规范是 ...

  2. JS中typeof和instanceof的用法和区别

    typeof和instanceof的区别 instanceof 常用来判断一个变量是否为空,或者是什么类型的.但它们之间还是有区别的 instanceof的用法 instanceof返回的是一个布尔值 ...

  3. JS typeof与instanceof的区别

    typeof 与 instanceof 通常是用来判断一个变量的类型,二者有如下区别: typeof: 判断一个变量的类型,返回值是字符串形式,返回结果有如下几种: number,boolean,st ...

  4. JavaScript 中typeof、instanceof 与 constructor 的区别?

    typeof.instanceof 与 constructor 详解 typeof  一元运算符 返回一个表达式的数据类型的字符串,返回结果为js基本的数据类型,包括number,boolean,st ...

  5. js高阶函数--判断数据类型、函数胡柯里化;

    一.判断数据类型: 常见的判断有typeof.instanceof. constructor. prototype,先来看typeof: var a = "hello world" ...

  6. js严格模式下判断数据类型

    function isType(type) { return function (content) { let t = Object.prototype.toString.call(content). ...

  7. 怎样手势的判断android GestureDetector在android开发中

    import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view. ...

  8. typeof()和instanceof()用法区别

    typeof()和instanceof()用法区别: 两者都是用来判断数据类型的 typeof()是能用来判断是不是属于五大类型Boolean,Number,String,Null,Undefined ...

  9. javascript篇-typeof,instanceof,constructor,toString判断数据类型的用法和区别

    javascript基本数据类型有:string,number,Boolean,undefined,null 引用类型(复杂类型):object, ES6中新增了一种数据类型:Symbol 以上数据类 ...

随机推荐

  1. 集合框架2- ArrayList

    其实 Java 集合框架也叫做容器,主要由两大接口派生而来,一个是 collection,主要存放对象的集合.另外一个是Map, 存储着键值对(两个对象)的映射表. 下面就来说说 List接口,Lis ...

  2. JDK1.8源码(五)——java.util.Vector类

    JDK1.8源码(五)--java.lang. https://www.cnblogs.com/IT-CPC/p/10897559.html

  3. CSS导航菜单(二级菜单)

    index.html <div class="nav"> <ul> <li> <a href="#">Java& ...

  4. stream流思想应用

    1.计算集合中某字段数值和 subTotal = subTotal+ complainCountResult.stream().filter(childSource->childSource.g ...

  5. 判断IE浏览器版本

    //判断IE浏览器版本 function IEVersion() { var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串 var isI ...

  6. ysoserial CommonsColletions5分析

    我们知道,AnnotationInvocationHandler类在JDK8u71版本以后,官方对readobject进行了改写. 所以要挖掘出一条能替代的类BadAttributeValueExpE ...

  7. 尚硅谷Java基础学习笔记

    综述: Java学习图谱: 常见dos命令: 操作案例: Java语言的特点: 面向对象 两个基本概念:类.对象 三个基本特性:封装.继承.多态 健壮性.可继承性 write once,run any ...

  8. 抽奖之Flash大转盘

    1.搭建JS与Flash互通的环境 function thisMovie(movieName){ if (window.document[movieName]) { return window.doc ...

  9. ESP8266- 使用AT指令获取网络时间

    前言:很早就考虑过用 ESP8266 获取网络时间,以前都是用 ESP8266 刷机智云的 Gagent 固件,但无奈现在手头的 ESP-01 的 Flash 只有 1M,实在无法胜任.经过在网络上的 ...

  10. 网站URL Rewrite(伪静态)设置方法

    1.如果您的服务器支持.htaccess,则无需设置,网站根目录下的.htaccess已经设置好规则.规则详情:http://download.destoon.com/rewrite/htaccess ...