javascript - 对象引用未按预期引用

标签 javascript

所以我有以下代码:

async function runQuery(input)
{
  return input
}

async function createAccounts()
{
  return [1, 2]
}



(async function ()
{
  var
    creator1_ids =
        {},
    creator2_ids =
        {}

  let all_accounts =
    await createAccounts(2)

  const tables =
    [
      "list",
      "display_list",
      "map"
    ]

  for (let index in all_accounts)
  {
    let req =
      {
        session:
        {
          account:
            null
        }
      }
    req.session.account =
      all_accounts[index]
    let the_ids =
        index === 0
            ? creator1_ids
            : creator2_ids

    // Create item
    let result =
      await runQuery()

    the_ids.item = 
      1

    for (let table of tables)
    {
      result =
          await runQuery(table)
      the_ids[table] = 
          result
    }
  }
  
  console.log(creator1_ids)
  console.log(creator2_ids)  
})()

现在 javascript 使用对象作为引用(因此,如果您将另一个变量分配给一个对象,则更改任一变量都会更改整个对象),但这里的情况似乎并非如此。

creator1_ids 保持为空,而仅填充 creator2_ids。我希望 creator1_ids 能够以类似方式填充。

但这可行。

async function runQuery(input)
{
  return input
}

async function createAccounts()
{
  return [1, 2]
}



(async function ()
{

    var
      creator1_ids =
          {},
      creator2_ids =
          {}
    let all_accounts =
        await createAccounts(2)

    const tables =
        [
            "list",
            "display_list",
            "map"
        ]

    async function generate(the_ids, account)
    {
       let req =
        {
          session:
          {
            account:
              null
          }
        }

      // Create item
      let result =
        await runQuery()

      the_ids.item = 
        1

      for (let table of tables)
      {
        result =
            await runQuery(table)
        the_ids[table] = 
            result + account
      }
    }

    await generate(creator1_ids, all_accounts[0])
    await generate(creator2_ids, all_accounts[1])

    console.log(creator1_ids)
    console.log(creator2_ids)
})()

最佳答案

由于调试有缺陷,结论无效。在调试器中仔细查看,特别是这一行:

let the_ids =
  index === 0 ?
  creator1_ids :
  creator2_ids

index 从不等于0。它确实等于'0'。所以 === 永远不会是 true

更改比较,您将得到您期望的结果:

let the_ids =
  index == 0 ? // compare values regardless of type
  creator1_ids :
  creator2_ids

然后你的循环将首先修改creator1_ids,然后修改creator2_ids。演示:

async function runQuery(input) {
  return input
}

async function createAccounts() {
  return [1, 2]
}



(async function() {
  var creator1_ids = {},
    creator2_ids = {}

  let all_accounts = await createAccounts(2)

  const tables = [
    "list",
    "display_list",
    "map"
  ]

  for (let index in all_accounts) {
    let req = {
      session: {
        account: null
      }
    }
    req.session.account = all_accounts[index]
    let the_ids =
      index == 0 ?
      creator1_ids :
      creator2_ids

    // Create item
    let result = await runQuery()

    the_ids.item = 1

    for (let table of tables) {
      result = await runQuery(table)
      the_ids[table] = result
    }
  }

  console.log(creator1_ids)
  console.log(creator2_ids)
})()

关于javascript - 对象引用未按预期引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54726824/

相关文章:

javascript - 如何获取鼠标经过的元素的左上角?

javascript - 如何根据 HTML 页面中的用户输入编辑列表

javascript - 如何自定义 Angular/Bootstrap 模式转换

javascript - 外行对为什么 JavaScript 有奇怪的 float 数学的解释——IEEE 754 标准

c# - Asp.net mvc fileupload 通过 ajax

javascript - 如何使用链接触发 php 查询

javascript - JSON数据存入变量后获取

javascript - 在 D3.js 中创建自定义折线图

javascript - 如何集成SVG文件?

javascript - Zendesk:从 jquery block 内发出请求