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传递过来的值

发布了79 篇原创文章 · 获赞 9 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_33807889/article/details/105117584