typeof null =='object' // true
typeof [] =='object' // true
typeof {} =='object' // true
?
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
由于具体实现上的问题,在实际的项目应用中,typeof只有两个用途,就是检测一个元素是否为undefined,或者是否为function。
为何呢?
JavaScript Garden整理出来了如下表格:
所以我们一般用“鸭子类型”来做流程控制,好晚了,不多讲,去搜一下吧。
一定要区分这些东西?
Object.prototype.toString()有一个妙用,如果我们以某个特别的对象为上下文来调用该函数,它会返回正确的类型。我们需要做的就是手动处理其返回的字符串,最终便能获得typeof应该返回的正确字符串。可以用来区分:
Boolean,Number,String,Function,Array,Date,RegExp,Object,Error等等。jQuery.type()就是这样实现的。以下代码从jQuery源码中抽取出来,可以直接用。使用结果:
这三个表达式在JS看来都是对的。如果题主是想说『如何区分null,数组,和普通对象』,那确实有大学问。有趣的是题主给的顺序难度正好递增:)
第一关 null
这一关最简单,有100%靠谱的简单解
x === null不多解释第二关 []
x instanceof Array看上去不错?可惜这不是最佳答案!问题在于
window.Array乃至[].constructor都不100%靠谱,因为x可能来自另外一个frame!公认的靠谱解法是
Object.prototype.toString.call(x) === '[object Array]'第三关{}
这个……定义不准确的问题,臣妾做不到啊,我只能给一些常见的判断和他们的局限性吧
x.constructor === Object这个问题明显:怕{constructor:yyy}但由于constructor这个名字在JS里的特殊地位,真有人乱用这个名字可以去打他的pptry { var x2 = JSON.parse(JSON.stringify(x)); for(k in x) if(x2[k] !== x[k]) throw new Error() } catch(e) { return false; } return true;好长……简单来说,就是可以被JSON化,又可以逆转回来保持信息不变,也就是判断对象是不是个JSON安全的普通意义上的数据对象jQuery.isPlainObject源码,通过各种检查努力排除了DOM,jQ,window对象,排除了绝大多数(并不100%)情况下new Xxx()(Xxx非Object)出来的对象后面这两个比较起来,前者不排斥但后者排斥的有
function a(){}; new a()(有自定义构造器),后者不排斥但前者排斥的有{aa:function(){}}(JSON不安全的成员)var a = {}; a.me=a;(循环引用)利用
typeof做出基本的数据类型判断应该都没问题吧。至于
typeof null = 'object',可以参考:The history of “typeof null”用
lodashorunderscore.里面对于各种类型判断都提供了函数。