JavaScript如何判断一个变量是不是Number对象,而不是基本类型的数字

var num = 1;

var numObj = new Number(1);

var getType = (num)=>Object.prototype.toString.call(num)==='[object Number]' && typeof num ==='object'

console.log(getType(num),getType(numObj)); // false,true

JavaScript中的类只是对象的一个私有属性,不会被任何行为改变。

所以使用Object.prototype.toString.call可以获得准确的类型(引用数据类型)。

 

但是call方法会导致一次装箱操作,就把数字1转为了对象1(基本数据类型转为引用数据类型)。

所以我们还有依赖typeof 判断他是object还是number(基本数据类型的number)

 

为什么不能使用instanceof?

假设 现在我们判断 son instanceof dad

那么instanceof的原理是,先找到dad.prototype备好放一边,

然后找son.__proto__看它是不是等于dad.prototype;

如果不等于,就看son.__proto__.__proto__是不是等于dad.prototype;

如果不等于,就沿这__proto__继续往上寻找,知道找到dad.prototype或者没有下一个了为止。

所以数组也是Object类型,new Date也是Object类型,这种颗粒度太粗糙了。

另外一个很重要的不用instanceof的原因是:全局执行环境不同就会导致结果不一样,例如iframe传递过来的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值