JS严格相等运算符返回undefined而普通相等运算符无此问题是什么原因?
问题解答
根因:运算符优先级错误导致循环未执行
你遇到的问题完全是运算符优先级导致的逻辑错误,和===本身的判断逻辑无关:
- JS中
!(逻辑非)的优先级远高于===(严格相等),你写的while(!arr.length === 0)实际会按(!arr.length) === 0的顺序执行,而非你预期的!(arr.length === 0)。
实际执行流程:
- 初始状态下
arr是传入的3个数组组成的数组,arr.length = 3 - 第一步先算
!arr.length:3是真值,取反后得到false - 第二步判断
false === 0:严格相等要求类型和值都一致,布尔值和数字类型不同,结果为false - 循环判断条件一开始就不成立,循环体一次都不会执行
sym函数没有显式写return语句,默认返回undefined,所以外层console.log就打印了undefined
为什么用普通相等==就没问题?
==会做隐式类型转换,false == 0的结果是true,所以循环能正常进入,属于误打误撞符合了你的预期,但写法本身是不规范的。
推荐的正确写法
你完全没必要把判断写得这么绕,直接用下面任意一种即可:
// 写法1:直观判断长度不为0 while(arr.length !== 0) { arr.pop(); console.log(arr.length); } // 写法2:直接用长度的真值判断,更简洁 while(arr.length) { arr.pop(); console.log(arr.length); }
内容的提问来源于stack exchange,提问作者Ricardo Castillo
相关产品推荐
相关产品推荐

