为什么使用{}.toString.call判断类型

最近在看jquery源码的时候,发现自己有好多基础知识都没有掌握,看来需要慢慢补足基础。
jquery在判断变量类型的时候,用到了{}.toString.call方法,一般我在判断类型的时候都会用typeof,那么为什么不直接用typeof呢?
度娘了一番,再通过自己的尝试,发现typeof确实不会每种类型都能判断。

var a;console.log(typeof a);// undefined
var b = null;console.log(typeof b);// object
var c = undefined;console.log(typeof c);// undefined
var d = new Object;console.log(typeof d);// object
var e = function(){};console.log(typeof e);// function
var f = {};console.log(typeof f);// object
var g = '';console.log(typeof g);// string
var h = [];console.log(typeof h);// object
var i = true;console.log(typeof i);// boolean
var j = 123;console.log(typeof j);// number
var k = NaN;console.log(typeof k);// number
var l = /^[-+]?\d+$/;console.log(typeof l);// object

原生typeof操作符的问题

  1. 引用类型除了函数,都是‘object’ typeof null为’object’ typeof
    undefined为’undefined’ 。
  2. null == undefined为真,null === undefined为假 NaN == NaN为false
  3. 常见的字符串转数字的常用用法 “10” -0 或 +“10”。如果转化失败,返回NaN。
  4. (“10x” - 0) == (“10x” - 0)返回false

通过String.prototype.toString方法来判断,此方法可以获取到某一个变量的具体类型。

function b(){};
console.log(({}).toString.call(1)); // [object Number]
console.log(({}).toString.call("11")); // [object String]
console.log(({}).toString.call(/123/)); // [object RegExp]
console.log(({}).toString.call({})); // [object Object]
console.log(({}).toString.call(function(){})); // [object Function]
console.log(({}).toString.call(new b())); // [object Object]
console.log(({}).toString.call([])); // [object Array]
console.log(({}).toString.call(true)); // [object Boolean]
console.log(({}).toString.call(new Date()); // [object Date]
console.log(({}).toString.call(new Error()); // [object Error]
console.log(({}).toString.call(null)); // [object Null]
console.log(({}).toString.call(undefined)); // [object Undefined]
console.log(({}).toString.call(new Map());  // [object Map]
console.log(({}).toString.call(new WeakMap()); // [object WeakMap]
console.log(({}).toString.call(new Set())); // [object Set]
console.log(({}).toString.call(new WeakSet()); // [object WeakSet]
console.log(({}).toString.call(Sysmbol()); // [object Sysmbol]
console.log(String(null)); // "null"
console.log(String(undefined)); "undefined"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值