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