javascript之用代码实现typeof

1.typeof 用来判断的类型

基本类型有:number, undefind, null, string, boolean, symbol(ES6新增)
引用数据类型有:Object, Arrary, RegExp, Date, Function
它们的区别:基本数据类型不可变,即存在栈中。引用数据类型可变,是根据栈中对应的地址去找到对应的堆,即引用数据类型在堆中(这里还可以延申到深浅拷贝的知识)。
typeof 对于引用数据类型,除了function之外,其他都只能判断成"object"
在这里插入图片描述
在这里插入图片描述

2.typeof的实现和图解

这里我们用到一个核心的方法:Object.prototype.toString
为了更明白 我们深入源码查看
在这里插入图片描述
在这里插入图片描述
意思很明了:返回的是该判断对象的字符串形式

如下图所示
在这里插入图片描述

核心源码如下

function typeofDemo(params) {
	// call用于改变this的指向 改变成params对应的this
	return Object.prototype.toString.call(params).slice(8, -1)
}

但是问题来了:
在这里插入图片描述

typeof判断null, array, object的都是 “object”, 说到这里为什么null也是object?因为js在开发初期为了性能而使用低位存储变量的类型信息,约定000开头为对象,而null二进制刚好设置为全0,所以这个是历史遗留的问题。

我们需要改进一下代码

function typeofDemo(params) {
    if(!params) return
    const result = Object.prototype.toString.call(params).slice(8, -1)
    let map = {
        Number: 'number',
        Array: 'object',
        String: 'string',
        Object: 'object',
        Null: 'object',
        undefined: 'undefined',
        Symbol: 'symbol',
        Boolean: 'boolean',
        Function: 'function'
    }
    return map[result]
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值