JavaScript中if条件判断执行疑问及splice方法问题排查
JavaScript中splice的副作用与console.log惰性求值问题解答
1. 初始代码输出异常的原因
Array.splice()是直接修改原数组的方法——它执行时会立刻改变原数组的结构,同时返回被删除元素组成的新数组,并非只做判断不修改原数据。
你的初始代码里:
if(arr.splice(4,6).join("")=="Script"){ arr.splice(4,6); // 重复执行删除操作 // ... }
第一次splice(4,6)已经把数组中索引4开始的6个元素(即"Script")删掉,此时原数组arr已变为["j","a","v","a","p","y","t","h","o","n"]。后续在if块里再次执行arr.splice(4,6),又删掉了索引4开始的6个元素("python"),最终只剩"java"。
删掉重复的arr.splice(4,6);后,数组仅被修改一次,自然得到正确结果。
2. 第一个console.log显示长度为10的原因
这是浏览器控制台惰性求值的特性导致的:
- 你在函数里未用
let/const声明arr,导致它成为挂载在window上的全局变量。 - 执行
console.log(window.arr)时,控制台仅记录了数组的引用,并未立即生成元素快照。 - 后续
splice修改了数组内容,当你在控制台展开数组时,显示的是数组当前的最终状态(已被修改为10长度),而非log执行时的初始状态(16长度)。
若要查看log那一刻的真实值,可以直接打印长度或创建数组副本:
console.log(window.arr.length); // 输出16,为log时的真实长度 console.log([...window.arr]); // 打印数组副本,保留log时的元素状态
3. 更简洁的实现方案
无需将字符串转为数组,直接用字符串的slice方法即可完成需求,代码无副作用且更直观:
function string_check(str) { // 先判断字符串长度是否足够,避免截取越界 if (str.length >= 10 && str.slice(4, 10) === "Script") { // 拼接前4位与第10位之后的内容 return str.slice(0, 4) + str.slice(10); } return str; } console.log(string_check("javaScriptpython")); // 输出"javapython" console.log(string_check("javaHello")); // 输出原字符串"javaHello"
内容的提问来源于stack exchange,提问作者yoga
相关产品推荐
相关产品推荐

