ifs 的顺序改变最终结果

Order of ifs altering final result

这两段看似相同的代码给了我截然不同的结果。 第一个获取计时器以匹配 sessionUserInput:

handleSession(event){
    const id= event.target.id;
    let breakvar= this.state.breakSession;
    let sessionvar= this.state.session;
    let isPaused=this.state.isPaused;
    let intervalBegan=this.state.intervalBegan;
    let sessionUserInput=this.state.session;



    if(isPaused && id==="break-increment" && breakvar<=59){
        this.setState((state) => ({
            breakSession: this.state.breakSession +1,
            breakValue:this.state.breakValue + 60}))}

    else if (isPaused && id==="break-decrement" && breakvar>1){
        this.setState((state) => ({
            breakSession: this.state.breakSession -1,
            breakValue:this.state.breakValue - 60}))}

    else if(isPaused && id==="session-increment" && sessionvar <=59){
        this.setState((state) => ({
            session: this.state.session +1,
            timer: this.state.timer + 60}))}

    else if (isPaused && id==="session-decrement" && sessionvar>1){
        this.setState((state) => ({
            session: this.state.session -1,
            timer:this.state.timer - 60}))}


    if(isPaused && intervalBegan && id==="session-decrement"){
        this.setState((state) => ({
            timer: (sessionUserInput * 60) - 60,
            intervalBegan: false}))}


    else if(isPaused && intervalBegan && id==="session-increment"){
        this.setState((state) => ({
            timer: (sessionUserInput * 60) + 60,
            intervalBegan: false}))}



    else if(id === "reset"){
        clearInterval(this.Interval);
        this.setState((state) => ({
            session: 25,
            timer: 1500,
            breakSession: 5,
            breakValue:300,
            isPaused: true
        }))
    }}

虽然这个更整洁,但它使计时器比计时器小了一分钟:

handleSession(event){
    const id= event.target.id;
    let breakvar= this.state.breakSession;
    let sessionvar= this.state.session;
    let isPaused=this.state.isPaused;
    let intervalBegan=this.state.intervalBegan;
    let sessionUserInput=this.state.session;

    if(isPaused && intervalBegan && id==="session-increment"){
        this.setState((state) => ({
            timer: (sessionUserInput * 60) + 60,
            intervalBegan: false}))}

    else if(isPaused && intervalBegan && id==="session-decrement"){
        this.setState((state) => ({
            timer: (sessionUserInput * 60) - 60,
            intervalBegan: false}))}


    else if(isPaused && intervalBegan && id==="session-increment"){
        this.setState((state) => ({
            timer: (sessionUserInput * 60) + 60,
            intervalBegan: false}))}


    else if(isPaused && id==="break-increment" && breakvar<=59){
        this.setState((state) => ({
            breakSession: this.state.breakSession +1,
            breakValue:this.state.breakValue + 60}))}

    else if (isPaused && id==="break-decrement" && breakvar>1){
        this.setState((state) => ({
            breakSession: this.state.breakSession -1,
            breakValue:this.state.breakValue - 60}))}

    else if(isPaused && id==="session-increment" && sessionvar <=59){
        this.setState((state) => ({
            session: this.state.session +1,
            timer: this.state.timer + 60}))}

    else if (isPaused && id==="session-decrement" && sessionvar>1){
        this.setState((state) => ({
            session: this.state.session -1,
            timer:this.state.timer - 60}))}


    else if(id === "reset"){
        clearInterval(this.Interval);
        this.setState((state) => ({
            session: 25,
            timer: 1500,
            breakSession: 5,
            breakValue:300,
            isPaused: true
        }))
    }}

我真的看不出两者之间的区别:支票的顺序和质量对我来说似乎是一样的。关于造成这种差异的原因有什么想法吗?合乎逻辑吗?

由于这里的变数太多,所以很难说出结果差异的确切原因。但是这里有一些需要注意的地方。

1. 首先是两个代码示例中的条件顺序不同。由于各种条件并非都是相互排斥的,至少据我对您的应用程序的有限了解而言,使用 else if 语句时更改条件的顺序可能会改变结果。这是因为只有第一个条件下的计算结果为 true 的代码会被执行,所以如果两个都为真并且交换顺序,结果会改变。

例如:

const a = true;
const b = false;

// 1.
if (a) {
    console.log("a only");
} else if (a || b) {
    console.log("a or b");
}

// 2.
if (a || b) {
    console.log("a or b");
} else if (a) {
    console.log("a only");
}

在这些示例中的第一个中,记录了 "a only",但在第二个中记录了 "a or b",结果的差异仅是由于翻转了条件的顺序。

2. 其次,第一个示例使用了两个单独的 if/else 语句,而第二个示例仅使用了一个。因此,在前两个条件中可以计算为真并执行它们的代码,而在第二个示例中,只有一个条件为真的代码将永远被执行。

例如:

const a = true;
const b = false;

// 1.
if (a) {
    console.log("a only");
} else if (a || b) {
    console.log("a or b");
}

// 2.
if (a) {
    console.log("a only");
}
if (a || b) {
    console.log("a or b");
}

在第一个示例中,仅记录了 "a only",而在第二个示例中,同时记录了 "a only""a or b"