销毁分配无法正常工作

时间:2019-12-07 22:09:25

标签: javascript variable-assignment destructuring

我有一些简单的代码,如下所示。不幸的是,它在第​​二次破坏性任务上失败了,我无法弄清原因。

代码:

let prev, curr

[prev, curr] = setPreviousAndCurrent(1, prev, curr)
console.log(`Previous: ${prev}`)
console.log(`Current ${curr}\n`)

[prev, curr] = setPreviousAndCurrent(2, prev, curr) // fails on this assignment
console.log(`Previous: ${prev}`)
console.log(`Current ${curr}\n`)

[prev, curr] = setPreviousAndCurrent(3, prev, curr)
console.log(`Previous: ${prev}`)
console.log(`Current ${curr}\n`)

function setPreviousAndCurrent(data, previous, current) {
    // We cannot use the ! operator for checking against values of previous and current since value can be 0, which will give a false positive
    if (previous === undefined) {
        previous = data
    } else if (previous && current === undefined) {
        current = data
    } else {
        previous = current
        current = data
    }

    return [previous, current]
}

输出:

❯ node js_test.js       
Previous: 1
Current undefined

/js_test.js:7
[prev, curr] = setPreviousAndCurrent(2, prev, curr)
             ^

TypeError: Cannot set property 'undefined' of undefined
    at Object.<anonymous> (/js_test.js:7:14)
    at Module._compile (internal/modules/cjs/loader.js:971:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1011:10)
    at Module.load (internal/modules/cjs/loader.js:822:32)
    at Function.Module._load (internal/modules/cjs/loader.js:730:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1051:12)
    at internal/main/run_main_module.js:16:11

如果我将代码更改为(如下所示),则它将按预期工作。

代码:

let prev, curr

[prev, curr] = setPreviousAndCurrent(1, prev, curr)
console.log(`Previous: ${prev}`)
console.log(`Current ${curr}\n`)

let temp = setPreviousAndCurrent(2, prev, curr)
prev = temp[0]
curr = temp[1]
// [prev, curr] = setPreviousAndCurrent(2, prev, curr)
console.log(`Previous: ${prev}`)
console.log(`Current ${curr}\n`)

temp = setPreviousAndCurrent(3, prev, curr)
prev = temp[0]
curr = temp[1]
// [prev, curr] = setPreviousAndCurrent(3, prev, curr)
console.log(`Previous: ${prev}`)
console.log(`Current ${curr}\n`)

function setPreviousAndCurrent(data, previous, current) {
    // We cannot use the ! operator for checking against values of previous and current since value can be 0, which will give a false positive
    if (previous === undefined) {
        previous = data
    } else if (previous && current === undefined) {
        current = data
    } else {
        previous = current
        current = data
    }

    return [previous, current]
}
// Works as expected

输出:

❯ node js_test.js
Previous: 1
Current undefined

Previous: 1
Current 2

Previous: 2
Current 3

我无法弄清楚为什么会发生这种情况,因为很明显该函数正在运行并返回期望值,但无法通过销毁第二次调用它的变量prev和curr来将其赋值。

感谢您的回应!谢谢! :)

0 个答案:

没有答案