代码之家  ›  专栏  ›  技术社区  ›  William

对象赋值产生未定义的变量

  •  1
  • William  · 技术社区  · 7 年前

    所以我用过 Object.assign() 以前,取得了一些成功。不过,我现在确实有问题。我有个目标:

    let stats = {
          rounds: 0,
          userHits: 0,
          userDmgDelt: 0,
          userDmgTaken: 0,
          userCrits: 0,
          userMiss: 0,
          userDodge: 0,
          mobHits: 0,
          mobDmgDelt: 0,
          mobDmgTaken: 0,
          mobCrits: 0,
          mobMiss: 0,
          mobDodge: 0,
        };
    

    stats = Object.assign(stats, {
        userMiss: userMiss++,
    });
    

    我认为在函数内部使用对象可以从它的旧值(即0)定义它。我想避免使用长块的 stats.Stat += 1 什么都不是。

    4 回复  |  直到 7 年前
        1
  •  1
  •   Dinesh undefined    7 年前

    你应该用 ++stats.userMiss 更新 userMiss 价值

    let stats = {
          rounds: 0,
          userHits: 0,
          userDmgDelt: 0,
          userDmgTaken: 0,
          userCrits: 0,
          userMiss: 0,
          userDodge: 0,
          mobHits: 0,
          mobDmgDelt: 0,
          mobDmgTaken: 0,
          mobCrits: 0,
          mobMiss: 0,
          mobDodge: 0,
        };
    
    stats = Object.assign(stats, {
        userMiss: ++stats.userMiss
    });
    
    console.log(stats)
        2
  •  1
  •   Nikhil Koul    7 年前

    userMiss 是在对象中定义的键 stats . 所以,要访问该属性,您需要编写 stats.userMiss .

    stats = Object.assign(stats, {
    userMiss: stats.userMiss++,
    

        3
  •  1
  •   CertainPerformance    7 年前

    userMiss 不是独立变量,因此表达式 userMiss++ 不会有用的。如果你想用对象.分配,你必须使用

    let stats = {
      rounds: 0,
      userHits: 0,
      userDmgDelt: 0,
      userDmgTaken: 0,
      userCrits: 0,
      userMiss: 0,
      userDodge: 0,
      mobHits: 0,
      mobDmgDelt: 0,
      mobDmgTaken: 0,
      mobCrits: 0,
      mobMiss: 0,
      mobDodge: 0,
    };
    stats = Object.assign(stats, {
      userMiss: stats.userMiss + 1,
    });
    console.log(stats);

    但为什么不简单地增加财产,避免 Object.assign 总共?

    let stats = {
      rounds: 0,
      userHits: 0,
      userDmgDelt: 0,
      userDmgTaken: 0,
      userCrits: 0,
      userMiss: 0,
      userDodge: 0,
      mobHits: 0,
      mobDmgDelt: 0,
      mobDmgTaken: 0,
      mobCrits: 0,
      mobMiss: 0,
      mobDodge: 0,
    };
    stats.userMiss++;
    console.log(stats);
        4
  •  1
  •   BlackBeard    7 年前

    IMHO,这就是你要做的:

    let stats = {
      rounds: 0, userHits: 0, userDmgDelt: 0, userDmgTaken: 0, userCrits: 0, userMiss: 0, userDodge: 0, mobHits: 0, mobDmgDelt: 0, mobDmgTaken: 0, mobCrits: 0, mobMiss: 0, mobDodge: 0,
    };
    
    stats = Object.assign(stats, {
        userMiss: ++stats.userMiss
    });
    
    console.log(stats)

    immutable 方法:

    let stats = {
          rounds: 0, userHits: 0, userDmgDelt: 0, userDmgTaken: 0, userCrits: 0, userMiss: 0, userDodge: 0, mobHits: 0, mobDmgDelt: 0, mobDmgTaken: 0, mobCrits: 0, mobMiss: 0, mobDodge: 0,
        };
    
    let newStats = Object.assign({}, stats, {
        userMiss: ++stats.userMiss
    });
    
    console.log(newStats)

    最新ES6 object destructuring

    let stats = {
      rounds: 0, userHits: 0, userDmgDelt: 0, userDmgTaken: 0, userCrits: 0, userMiss: 0, userDodge: 0, mobHits: 0, mobDmgDelt: 0, mobDmgTaken: 0, mobCrits: 0, mobMiss: 0, mobDodge: 0,
    };
    
        let newStats = { ...stats, userMiss: ++stats.userMiss };
    
        console.log(newStats)