使用localStorage手动生成自增员工ID时返回NaN的问题排查
问题根因
代码里if判断的括号位置错位,是导致最终返回NaN的核心原因。
你写的判断逻辑:if (localStorage.getItem(KEYS.employeeId === null)) {}
实际执行时的流程完全和预期不符:
- 运算优先级上,会先执行括号内部的
KEYS.employeeId === null:已知KEYS.employeeId的值是字符串'employeeId',和null比较的结果恒为false - 这个布尔值
false会被作为参数传入localStorage.getItem(),方法内部会自动把参数转成字符串'false',去本地存储中匹配key='false'的存储值——这个key从未被写入过,所以getItem永远返回null,if判断的条件恒为假 - 因为if判断永远不会触发,代码从来不会往本地存储的
'employeeId'键下写入初始值'0' - 后续读取
localStorage.getItem(KEYS.employeeId)时,拿到的是从未写入过的null值,parseInt(null)的执行结果就是NaN,后续无论加多少次1、存多少次,拿到的永远是NaN。
修正后的代码
把判断null的逻辑挪到getItem的返回值外层,也就是把括号位置调整正确:
function generateEmployeeId() { // 修正:先读取本地存储值,再判断返回值是否为null if (localStorage.getItem(KEYS.employeeId) === null) { localStorage.setItem(KEYS.employeeId, '0'); } // 补充十进制参数,消除radix相关的eslint警告 let id = parseInt(localStorage.getItem(KEYS.employeeId), 10); localStorage.setItem(KEYS.employeeId, (id += 1).toString()); return id; }
可选优化点
- 增加数值合法性校验:如果本地存储读出的id转数字后是NaN,直接重置为0,避免异常存储值污染整个自增流程
- 可以把自增逻辑的计算过程和存储过程拆分,降低代码的耦合度
内容的提问来源于stack exchange,提问作者Rishad
相关产品推荐
相关产品推荐

