为什么我的随机函数两次返回相同的值

时间:2019-05-24 14:45:00

标签: javascript

上下文:我正在创建一个带有一些虚拟图的虚拟网站。我需要在类似这样的js对象中添加一些随机值:

object = {
  x: static,
  y: static,
  ...

  data: random
}

所以我想出了这样的东西:

async function getOption() {
  return getRandom();
}

async function setup() {
  let template = {
    static1: "xx",
    static2: "xx",
    option: 1
  }

  let v1 = template;
  v1.option = await getOption();

  let v2 = template;
  v2.option = await getOption();

  console.log(await getOption(), await getOption())
  console.log(v1.option, v2.option)

}

function getRandom() {
  return Math.floor(Math.random() * 100);
}

setup()

但是我注意到一些我不理解的奇怪现象。如果我想分配一个新的数字,我每次都会得到两次相同的“随机”值。此外,如果我在console.log()中调用它,它会按预期工作。

现在我的问题:

第1条:如何创建许多具有相同属性(除了1以外)的大型对象?

N°2:为什么我两次获得相同的值?这对我来说真的没有意义。我想念什么吗?

2 个答案:

答案 0 :(得分:1)

您有v1=template;v2=template;,因此v1和v2是同一对象。

如果要复制模板,请使用

v1 = {...template};
v2 = {...template};

答案 1 :(得分:1)

v1和v2只是对模板对象的引用。本质上,v1和v2是相同的。在这里查看控制台。 v1是一个随机值,v2也是随机值,但被v2覆盖:

async function getOption() {
  return getRandom();
}

async function setup() {
  let template = {
    static1: "xx",
    static2: "xx",
    option: 1
  }

  let v1 = template;
  v1.option = await getOption();
  
  console.log('v1:', v1.option)
  console.log('template:', template.option)


  let v2 = template;
  v2.option = await getOption();
  
  console.log('v2:', v2.option)
  console.log('template:', template.option)


  console.log(v1.option, v2.option)

}

function getRandom() {
  return Math.floor(Math.random() * 100);
}

setup()

编辑:如果要复制,可以使用assign()

let template = {
  static1: "xx",
  static2: "xx",
  option: 1
}


var obj = Object.assign({}, template);

template.option = "100"
obj.option = "200"

console.log(template.option, obj.option)