typeof与instanceof的区别

news/2024/7/24 10:05:15 标签: javascript, 开发语言, ecmascript

最近又用到了对一个类型进行类型判断,这里对两种判断方法进行一个总结

相同点:

typeof与instanceof都是判断数据类型的方法

区别:

typeof会返回一个变量的基本类型(特殊 typeof null 会为object 但这只是JavaScript 存在的一个悠久 Bug),除了function会被检测出来,其他对象类型都为object,基本类型会反回对应的类型。

下面是一个简单示范

console.log(typeof a);    //'undefined'

console.log(typeof(true));  //'boolean'

console.log(typeof '123');  //'string'

console.log(typeof 123);   //'number'

console.log(typeof NaN);   //'number'

console.log(typeof null);  //'object'    

var obj = new String();

console.log(typeof(obj)); //'object'

var  fn = function(){};

console.log(typeof(fn));  //'function'

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

对象:000  浮点数:010  字符串:100  布尔:110  整数:1  null:全是0(因此会被误以为是对象类型)undefined:用 −2^30 整数来表示因此要避免用typeof 判断null

instanceof返回的是一个布尔值 可以准确的判断复杂的引用类型,但是不能判断基础数据类型

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

所以也可以用来判断一个实例对象是不是某个构造函数产生的

 var Person = function () {

    }
    var p1 = new Person();
    function isinstance(a, b) {
        while (a !== null) {
            if (a.__proto__ === b.prototype) {
                return true;
            } else {
                a = a.__proto__
            }
        }
        return false;
    }
    console.log(isinstance(p1, Object));//true
    console.log(isinstance(p1, Person));//true

如果需要通用检测数据类型,可以采用Object.prototype.tostring

console.log(Object.prototype.toString.call('aa'));//[object,string]

也可以用===

这里会涉及到原型、原型链部分的知识了,有兴趣可以看看我之前的博客

原型、原型链的关系?如何用自己的语言来叙述?_js 把方法挂到docment上_时雨.`的博客-CSDN博客


http://www.niftyadmin.cn/n/4949733.html

相关文章

两个List合并、去重、排序

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

Docker Dockerfile Docker-compose学习笔记

文章目录 Centos环境下安装Docker配置镜像源 Windows环境下安装Docker配置镜像源 使用Dokcer镜像1.获取镜像2.查看镜像信息(1)列出镜像(2)镜像标签(3)镜像详细信息(4)镜像历史 3.搜索镜像4.删除和清理镜像(1)使用标签删除镜像(2)使用ID删除镜像(3)清理镜像 5.创建镜像(1)基于已…

快速入门vue3新特性和新的状态管理库pinia

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 Vue3.3新特性 defineOptions defineModel pinia 介绍 与 Vuex 3.x/4.x 的比较 安装 核心概念 定义…

微服务参数透传实现

说明:在微服务架构中,用户身份经网关验证后,我们可以将用户信息,如ID加入到请求头上。后面的微服务中,可以设置一个拦截器,拦截请求,获取请求头上的用户ID,加入到ThreadLocal中。 最…

剑指Offer48.最长不含重复字符的子字符串 C++

1、题目描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字…

罗勇军 →《算法竞赛·快冲300题》每日一题:“质因子数量” ← 快速幂、素数筛

【题目来源】http://oj.ecustacm.cn/problem.php?id1780http://oj.ecustacm.cn/viewnews.php?id1023【题目描述】 给出n个数字,你可以任意选择一些数字相乘,相乘之后得到新数字x。 其中,x的分数等于x不同质因子的数量。 请你计算所有选择数…

android 上拉固定高度显示,下拉关闭View BottomSheetDialog

具体代码 复制使用 1,新建一个BottomBaseStationDialogLayout.java类继承BottomSheetDialogFragment public class BottomBaseStationDialogLayout extends BottomSheetDialogFragment { public static BottomBaseStationDialogLayout getInstance() {return new BottomBase…

初学者SpringBoot+Vue打通前后端详细步骤(从零开始)

目录 前言介绍 一、后端SpringBoot项目创建 (一)springboot后端实现增删改查 二、前端Vue项目的创建 (一)下载必要的环境(有则跳过) (二)创建vue项目并使用Element-ui 三、前…