Ste*_*ram 6 javascript destructuring ecmascript-6
我在ES6中实现了一个简单的GCD算法(通过node-esml),并且在一个while循环中更新了变量值,从而产生了奇怪的行为.这段代码非常有用:
function gcdWithTemp(x, y) {
let [r, rdash] = [x, y]
while (r != 0) {
q = Math.floor(rdash / r)
temp = r
r = rdash - q * r
rdash = temp
}
return(rdash)
}
console.log(gcdWithTemp(97, 34))
Run Code Online (Sandbox Code Playgroud)
回到了预期的答案1
.但是,如果我删除临时变量而是使用解构赋值来尝试实现相同的结果:
function gcdWithDestructuredAssignment(x, y) {
let [r, rdash] = [x, y]
while (r != 0) {
q = Math.floor(rdash / r)
[r, rdash] = [rdash - q * r, r]
}
return(rdash)
}
console.log(gcdWithDestructuredAssignment(97, 34))
Run Code Online (Sandbox Code Playgroud)
它永远不会完成,进一步调试显示r将始终具有分配给的第一个值,x
.看来这两个实现应该是一样的吗?请参阅交换变量
我也试过使用var
而不是let
无济于事.我是否彻底误解了解构任务的重点或遗漏了一些微妙的东西?或者这是一个错误?
这不是解构分配的问题,而是ASI(自动分号插入).这两行:
q = Math.floor(rdash / r)
[r, rdash] = [rdash - q * r, r]
Run Code Online (Sandbox Code Playgroud)
在实践中意味着:
q = Math.floor(rdash / r)[r, rdash] = [rdash - q * r, r]
Run Code Online (Sandbox Code Playgroud)
这显然不是你的意思.要解决此问题,请在前面添加分号[
:
function gcdWithDestructuredAssignment(x, y) {
let [r, rdash] = [x, y]
while (r != 0) {
q = Math.floor(rdash / r)
;[r, rdash] = [rdash - q * r, r]
}
return(rdash)
}
console.log(gcdWithDestructuredAssignment(97, 34))
Run Code Online (Sandbox Code Playgroud)
当然你可以在前一行的末尾添加缺少的分号(q = Math.floor(rdash / r);
),但由于你通常不使用分号,我假设你使用的是npm编码风格.
归档时间: |
|
查看次数: |
281 次 |
最近记录: |