JavaScript 类型判断 判断Null和Undefined

2023-11-16

js类型判断 判断Null和Undefined

javaScript中判断数据类型的方法主要有三种:

​ **typeof:**原理是通过根据变量的机器码来判断

instanceof:根据 构造函数的 prototype 属性是否出现在某个实例对象的原型链上

typeof

序号 类型 结果
1 Undefined “undefined”
2 Null “object”
3 Boolean “boolean”
4 Number “number”
5 BigInt(ECMAScript 2020 新增) “bigint”
6 String “string”
7 Symbol (ECMAScript 2015 新增) “symbol”
8 Function 对象 (按照 ECMA-262 规范实现 [[Call]]) “function”
9 任何对象(Array) “object”
10 宿主对象(由 JS 环境提供) 取决于具体实现

这里有两个地方需要注意

  1. 第一个是 typeof null的结果是"object"

    javaSctript在底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息:

    • 000:对象
    • 010:浮点数
    • 100:字符串
    • 110:布尔
    • 1:整数

    null:所有机器码均为0

    undefined:用 −2^30 整数来表示

    所以,typeof 在判断 null 的时候就出现问题了,由于 null 的所有机器码均为0,因此直接被当做了对象来看待。

  2. 还有就是表中最后一条,宿主对象(由 JS 环境提供)的结果是取决于具体情况

instanceof

  1. 用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上,所以instanceof 判断的是对象的实例,理解这一点非常关键

     let simpleStr = "This is a simple string";
     simpleStr instanceof String;  // 返回 false, 非对象实例,因此返回 false
     let str = String('aa')
     str instanceof Object // false
     'aaa' instanceof Object // false
    
  2. 正确的使用方法,只能判断通过new创建的字符串,也是instanceof 的缺陷

    let myString  = new String();
    let newStr    = new String("String created with constructor");
    let myDate    = new Date();
    let myObj     = {};
    
    myString  instanceof String; // 返回 true
    newStr    instanceof String; // 返回 true
    myDate  instanceof Object; // 返回 true
    myObj instanceof Object;    // 返回 true, 尽管原型没有定义
    ({})  instanceof Object;    // 返回 true, 同上
    
  3. 只能判断实例对象是否h在某一条原型链上,而不能直接判断实例对象是什么类型

     // Object.getPrototypeOf( o ) === Object.prototype,因为这几个对象都是在Object的原型链上,所以都是true
    Array instanceof Object // true
    Function instanceof Object // true
    String instanceof Object // true
    Date instanceof Object	 // true
    RegExp instanceof Object // true
    Reflect instanceof Object // true
    ...
    
  4. 如果要instanceof判断变量l类型,一般要具体到某一变量类型,不能判断unll和undefined

    // 判断是否是函数
    function fn(){}	
    fn instanceof Function // true
    let fn2 = ()=>{};
    fn2 instanceof Function // true
    
    // 判断是否是对象
    ({}) instanceof Object // true
    
    // 判断是否是数组
    [] instanceof Array // true
    let list = new Array
    list instanceof Array // true
    
    // 判断是否是字符串
    let str = 'aaa'
    str instanceof Object // false,str不是String 的实例
    let str = new String()
    str instanceof String // true
    
    // 判断哪是否是null 
    null instanceof null  // 报错 Uncaught TypeError: Right-hand side of 'instanceof' is not an object
    
    // 判断是否是undefined
    undefined instanceof undefined // Uncaught TypeError: Right-hand side of 'instanceof' is not an object
    
  5. 判断存在继承关系的对象实例

    function Car(make, model, year) {
      this.make = make;
      this.model = model;
      this.year = year;
    }
    var mycar = new Car("Honda", "Accord", 1998);
    var a = mycar instanceof Car;    // 返回 true
    var b = mycar instanceof Object; // 返回 true
    

Object.prototype.toString


Object.prototype.toString.call(1) // "[object Number]"

Object.prototype.toString.call('hi') // "[object String]"

Object.prototype.toString.call({a:'hi'}) // "[object Object]"

Object.prototype.toString.call([1,'a']) // "[object Array]"

Object.prototype.toString.call(true) // "[object Boolean]"

Object.prototype.toString.call(() => {}) // "[object Function]"

Object.prototype.toString.call(null) // "[object Null]"

Object.prototype.toString.call(undefined) // "[object Undefined]"
	
Object.prototype.toString.call(Symbol(1)) // "[object Symbol]"

总结:

typeof 和instanceof的缺点
  1. typeof:

    判断null的结果为“object”,是jasascript诞生就存在的bug

  2. instanceof:

    1、判断null 和undefined 的时候会报错

    2、在判断字符串的时候,如果不是通过new 方式创建的字符串,得到的结果为fasle

    let str = 'this is string; str instanceof String' 接口为fasle

    3、如果更改了对象的原型,那么得到结果也是不准确的

    var o = new C();
    o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototype
    C.prototype = {};
    o instanceof C; // false,C.prototype 指向了一个空对象,这个空对象不在 o 的原型链上.
    

    需要注意的是,如果表达式 obj instanceof Foo 返回 true,则并不意味着该表达式会永远返回 true,因为 Foo.prototype 属性的值有可能会改变,改变之后的值很有可能不存在于 obj 的原型链上,这时原表达式的值就会成为 false。另外一种情况下,原表达式的值也会改变,就是改变对象 obj 的原型链的情况,虽然在目前的ES规范中,我们只能读取对象的原型而不能改变它,但借助于非标准的 __proto__ 伪属性,是可以实现的。比如执行 obj.__proto__ = {} 之后,obj instanceof Foo 就会返回 false 了。

typeof 和instanceof的使用场景
  1. typoof和instanceof 都无法判断Null ,我们需要通过其他方式判断null

    // null 与自己比较,总是返回
    null === null // true
    
    // typeof exp != "undefined" 排除了 undefined
    function isNull(value) {
            if (!value && typeof value != "undefined" && value != 0) {
                return true;
            } else {
                return false;
            }
        }
    
  2. typeof 可以判断undefined,而 instanceof,判断会报错

    undefined === undefined // true 
    typeof undefined // "undefined"
    undefined instanceof undefined // Uncaught TypeError: Right-hand side of 'instanceof' is not an object
    
  3. typeof 无法判断Array 和Object,instanceof 可以

    typeof []  // "object"
    
    function fn(){};
    fn instanceof Function // true
    
  4. type 判断undefined 和null的区别(两个变量类型之间)

    typeof undefined // "undefined"
    typeof null // "object"
    
    //  undefined 和 null 之间要又 三等运算符
    undefined == null // true
    undefined === null // false
    undefined != null // false
    undefined !== null  // true
    

推荐阅读:

掘金:https://juejin.cn/post/6967727936216498190

掘金:https://juejin.cn/post/6844903613584654344#heading-2

MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof

MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 类型判断 判断Null和Undefined 的相关文章

随机推荐

  • CentOS 几种重启方式的区别

    CentOS 几种重启方式的区别 Linux centos重启命令 1 reboot 普通重启 2 shutdown r now 立刻重启 root用户使用 3 shutdown r 10 过10分钟自动重启 root用户使用 4 shut
  • XAML三个顶级元素以及窗体的外观和位置

    XAML三个顶级元素介绍 Window 窗口 UserControl 用户控件 Page 把窗体以网页形式展现 注意 在XAML页面中我们只能有一个顶级元素 而且顶级元素只能有一个子元素 所以我们要使用布局控件 窗体的外观和位置 窗口的外观
  • 怎么把MySQL的数据存到区块链_区块链存储数据的方式是什么

    区块链存储数据的方式 分布式数据存储 区块链是分布式数据存储 点对点传输 共识机制 加密算法等计算机技术的新型应用模式 从本质上讲 它是一个共享数据库 存储于其中的数据或信息 具有不可伪造 全程留痕 可以追溯 公开透明 集体维护等特征 本教
  • springmvc进阶(3):mvc:annotation-driven和mvc:default-servlet-handler在springmvc中的作用

    在springmvc xml中 经常会配置
  • 2036: [蓝桥杯2022初赛] 统计子矩阵(二维前缀和,一维前缀和)

    2036 蓝桥杯2022初赛 统计子矩阵 内存限制 256 MB 时间限制 1 S 标准输入输出 题目类型 传统 评测方式 文本比较 上传者 外部导入 提交 310 通过 74 题目描述 给定一个 N M 的矩阵A 请你统计有多少个子矩阵
  • linux安装mysql

    安装环境 工具 1 Linux CentOS 7 4版 2 mysql 8 0 12 el7 x86 64 tar gz 安装步骤 参考 https dev mysql com doc refman 8 0 en installing ht
  • 【满分】【华为OD机试真题2023 JS】寻找相似单词

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 寻找相似单词 知识点字符串排序 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 给定一个可存储若干单词的字典 找出指定单词的所有相似单词 并且按照单词名称从小到大
  • 人工智能-马尔可夫模型

    马尔可夫与马尔科夫都可以 所以也别纠结 马尔可夫模型 Markov Model 是一种统计模型 广泛应用在语音识别 词性自动标注 音字转换 概率文法等各个自然语言处理等应用领域 经过长期发展 尤其是在语音识别中的成功应用 使它成为一种通用的
  • java.util.LinkedHashMap cannot be cast to com.XXX.XXX

    ResquestBody的HashMap转List时错误java util LinkedHashMap cannot be cast to com XXX XXX RequsetBody Map
  • 五个温度带的分界线_亚热带,暖温带,到底是些什么带?

    在地理课上 讲到有关气候的内容时 经常会提到各种 带 例如暖温带 中温带 寒温带 你能清晰地分清谁是谁吗 首先 我们先来澄清一个概念 温度带和热量带 很多人分不清这两个词 但实际上 它们的内在含义是大致相同的 但是如果细究 两者的划分方式是
  • 服务器间数据传输的四种方式

    scp 优点 简单方便 安全可靠 支持限速参数 缺点 不支持排除目录 用法 scp就是secure copy 是用来进行远程文件拷贝的 数据传输使用 ssh 并且和ssh 使用相同的认证方式 提供相同的安全保证 scp 参数 lt 源地址
  • cmake tutorial

    Tutorial 1 最基本的项目是从源代码构建可执行文件 对于简单的项目 三行CMakeLists txt足够了 这就是本教程的起点 在Step1目录下创建一个CMakeLists txt 如下所示 cmake minimum requi
  • 运行报错:from .qhull import * ImportError: DLL load failed: 找不到指定的模块。

    记录一次报错 当出现这个问题时说明模块安装有误 但不知道原因 应该是在此之前需要先把安装的numpy scipy sklearn卸载掉 先看究竟是哪个模块出的错误 直接 pip uninstall numpy pip uninstall s
  • Chatgpt 未来可以应用的场景

    ChatGPT是一款基于GPT 3的聊天机器人 它具有自然语言处理和生成语言的强大能力 在很多场景下可以有很广泛的应用 以下是ChatGPT未来可以应用的一些场景 客服 ChatGPT可以被用作客服机器人 为用户提供帮助和解答问题 教育 C
  • 坐上支付宝微信支付巨头的刷脸顺风车

    人脸识别技术已经在互联网 政务领域得到了广泛应用 超过100个城市的用户通过支付宝刷脸完成身份验证中国财政科学研究院应用学博士后盘和林认为 刷脸支付比密码支付更安全更便捷 随着门槛的进一步降低 刷脸支付或将在未来3年内呈现爆发式的增长 20
  • Pytorch 计算一个矩阵行向量之间的相似度

    import torch def similarity input tensor step 1 计算行向量的长度 len a torch sqrt torch sum input tensor 2 dim 1 b len a unsquee
  • Enum枚举类型实战总结,保证有用!

    一般在我们开发时如果能使用枚举罗列的 一般都会定义一个枚举类型 将枚举类型作为方法的参数 可以方便的进行调用 给我们带来不少的便利 当然有时候它还不如直接用一个int类型带来 带来一定灵活性 但只要能满足业务咱们就怎么方便怎么来吧 基本使用
  • Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交

    在Java EE应用编程中Servlet是基础 JSP是建立在Servlet基础之上的 其他Web框架如Struts WebWork和Spring MVC都是基于Servlet的 本文主要讲述MyEclipse和Tomcat配置Servle
  • MATLAB的KLT算法实现视频中人脸跟踪检测

    上次已经用卡尔曼滤波实现了人脸跟踪 也取得了一定的效果 但仍存在一些问题 如人侧脸的时候跟踪效果并不理想 而KLT算法则能很好的解决这个问题 本文一共两部分 理论部分借鉴博了客园上的博主 https www cnblogs com moon
  • JavaScript 类型判断 判断Null和Undefined

    js类型判断 判断Null和Undefined javaScript中判断数据类型的方法主要有三种 typeof 原理是通过根据变量的机器码来判断 instanceof 根据 构造函数的 prototype 属性是否出现在某个实例对象的原型