奇技淫巧之判断入参是否为undefined
前言
作为一个程序员,coding是每天必做的事情之一,今天埃尔斯在阅读腾讯AlloyTeam 的一个开源项目AlloyTouch,发现了一个有意思的小技巧,就是对undefined的精准判断。源码地址:https://github.com/AlloyTeam/AlloyTouch/blob/master/alloy_touch.js 这里面有个_getValue方法。
undefined的判断
在源码里的方法是这样的:
_getValue: function (obj, defaultValue) {
return obj === void 0 ? defaultValue : obj;
},
这里的意思是当obj为undefined的时候,return取defaultValue.
当看到这里的时候我就有点纳闷腾讯大神为什么不适用 “!”
为什么不写成这样的
_getValue: function (obj, defaultValue) {
return !obj ? defaultValue : obj;
},
按理说这样也能实现对undefined的判断,我自己试了试确实可以,我尝试的代码如下所示:
function aa(obj, defaultValue) {
return obj === void 0 ? defaultValue : obj;
}; aa(0,2)
**0** // 程序返回
function aa(obj, defaultValue) {
return obj === void 0 ? defaultValue : obj;
}; aa(null,2)
**null**// 程序返回
function aa(obj, defaultValue) {
return obj === void 0 ? defaultValue : obj;
}; aa(undefined,2)
function aa(obj, defaultValue) {
return obj === void 0 ? defaultValue : obj;
}; aa(bb,2)
**VM504:3 Uncaught ReferenceError: bb is not defined
at <anonymous>:3:8**// 程序返回 报错
(anonymous) @ VM504:3
function aa(obj, defaultValue) {
return obj === void 0 ? defaultValue : obj;
};
var bb ={};
aa(bb,2)
**{}** // 程序返回
function aa(obj, defaultValue) {
return obj === void 0 ? defaultValue : obj;
};
var bb ={};
aa(bb.c,2)
**2** // 程序返回
上面程序在Chrome里的console里面打印结果如下图所示:
总结
经过小伙伴上面的实验发现了一个有趣的事情。使用 !运算符,他会将undefined,null, 0,false, 变为true,即(obj为undefined,null, 0,false时, !obj === true), 但是当使用void 0 时,他只会全等于undefined。
注意(bb={}时,bb.c是undefined),所以小伙伴们
在需要判断某对象的属性为undefined,并前要使程序能取到false,0,null等值时可以使用 void 0 进行判断
,从而解决大家实际中遇到的问题。如果小主们觉得这篇分享还比较有用的话请不要吝啬点个—赞