做值比较时typeof是否必要?JS undefined判断场景使用分析
结论先行
你当前的业务场景中,两种写法的运行结果完全一致,typeof并不是必须使用的。同事建议的写法是更通用的严谨编码规范,背后的核心差异和适用场景如下:
核心差异1:避免undefined被重写的风险
- ES5标准之前,全局的
undefined是可以被人为重写的(比如执行var undefined = true),如果直接用=== undefined做判断,逻辑会完全失效。 - ES5之后全局
undefined已经被设为只读属性无法修改,但局部作用域依然可以声明同名变量覆盖,比如函数内部写let undefined = 1,依然会导致直接等于判断出错。 typeof操作符返回的是固定字符串'undefined',永远不会被任何自定义变量篡改,兼容性和稳定性更强。
核心差异2:未声明变量的判断容错
- 如果你要判断的是一个从未被声明过的变量,直接写
if(abc === undefined)会直接抛出ReferenceError导致代码崩溃,而if(typeof abc === 'undefined')不会报错,会正常返回判断结果。 - 不过你当前的场景是访问已声明对象
users的属性,JS中访问对象不存在的属性只会返回undefined,不会抛出错误,所以这个差异在你这段代码里不会触发。
额外优化建议
如果你的业务逻辑是需要严格判断users对象上是否存在对应的name属性,那两种判断undefined的写法都存在漏洞:如果有人主动给users的某个属性赋值为undefined,两种写法都会误判为属性不存在。这种场景下更推荐用hasOwnProperty判断:
function getUser(name){ if(!users.hasOwnProperty(name)){ return false } const user = users[name]; // do something... return true }
最终编码选择建议
- 如果你的代码只运行在ES5+的现代环境(现在绝大多数前端/Node.js环境都满足),且团队没有强制规范要求,你的写法完全可以正常运行。
- 如果要追求更严谨、兼容性更强的统一编码规范,就采用同事的
typeof写法即可,两种写法都不属于语法错误,优先对齐团队统一规范即可。
内容的提问来源于stack exchange,提问作者KaiLee
相关产品推荐
相关产品推荐

