You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:30:39