运行指定JavaScript代码时电脑冻结,请求分析原因
为什么这段JavaScript代码会让你的电脑冻结?
咱们来一步步拆解这段代码的问题根源,很快就能搞明白:
首先聚焦核心的循环逻辑:
while (y != 1) { res = res + y % 2; y = y / 2; }
最致命的问题:无限循环陷阱
这个循环的终止条件是y != 1,但这里有个关键的细节被忽略了:JavaScript里的/是浮点数除法,不是整数除法。举几个实际运行的例子你就懂了:
- 如果传入的参数是奇数(比如3):第一次循环后y变成1.5,接下来会变成0.75、0.375……这个数值会无限趋近于0,但永远不会等于1,循环会一直跑下去。
- 如果传入的是0:y永远是0,完全达不到
y === 1的终止条件,直接触发无限循环。 - 哪怕传入非2的幂次方的偶数(比如6):6/2=3(奇数),接下来就会进入上面的死循环,y持续变成小数,永远到不了1。
无限循环会霸占CPU的全部运算资源,系统根本腾不出余力处理其他操作,电脑自然就会出现冻结的情况。
次要但值得注意的细节:变量作用域混淆
你在函数外部声明了var y;,但函数内部又用function deci(y)重新声明了同名参数y。虽然这不会直接导致冻结,但会造成变量作用域的混淆,建议尽量避免这种重复命名的写法。
修复方案(如果你的目标是十进制转二进制)
如果这段代码是用来实现十进制转二进制字符串,我们需要改成整数除法,同时处理y为0的特殊情况。比如修改后的代码可以是:
function deci(y) { if (y === 0) return "0"; var res = ""; while (y > 1) { res = (y % 2) + res; y = Math.floor(y / 2); } return y + res; }
这样循环就能正常终止,不会再出现无限运行的问题了。
内容的提问来源于stack exchange,提问作者shahbaz ansari
相关产品推荐
相关产品推荐

