Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 循环内的值不变_Javascript - Fatal编程技术网

Javascript 循环内的值不变

Javascript 循环内的值不变,javascript,Javascript,有人能告诉我如何更改template.portNumber值吗 预期: 很抱歉这个愚蠢的问题,但我真的坚持了下来。同样的代码在python中运行良好。 谢谢。您的数组最终有三个对同一对象的引用,因此每次对其进行变异时,所有数组元素中的更改都是可见的 写入端口[0]。端口=99也将更改端口[1]。端口,因为端口[0]和端口[1]是同一个对象 您需要创建对象的副本…模板对象通过引用传递,因此所有项都引用同一对象。它最终看起来有点像这样: template = {portNumber: 3, stuf

有人能告诉我如何更改template.portNumber值吗

预期:

很抱歉这个愚蠢的问题,但我真的坚持了下来。同样的代码在python中运行良好。
谢谢。

您的数组最终有三个对同一对象的引用,因此每次对其进行变异时,所有数组元素中的更改都是可见的

写入端口[0]。端口=99也将更改端口[1]。端口,因为端口[0]和端口[1]是同一个对象

您需要创建对象的副本…

模板对象通过引用传递,因此所有项都引用同一对象。它最终看起来有点像这样:

template = {portNumber: 3, stuff: ""};
return {ports: {1:template, 2: template, 3: template}}
你需要,然后设置它

var template = {
  portNumber: null,
  stuff: ""
}

myfunc(template, 3);

function myfunc(template, count) {
  var ports = {}
  for (var i = 0; i < count; i++) {
    var portNumber = i + 1;
    ports[portNumber] = JSON.parse(JSON.stringify(template));
    ports[portNumber].portNumber = portNumber;
  }
  console.debug(JSON.stringify(ports, null, 4));
  return ports;
}

另外,您不需要手动对数字键进行字符串化,它是自动完成的。

所有数组对象都是引用类型,因此只指向一个实例

尝试像这样使用构造函数

var template = function(portno, stf){
  this.portNumber = portno;
  this.stuff = stf;
}

myfunc(template, 3);

function myfunc(template, count) {
  var ports = {}
  for (var i = 0; i < count; i++) {
    var portNumber = i + 1;
    ports[portNumber.toString()] = new template(portNumber , template.stuff);
  }
  console.debug(JSON.stringify(ports, null, 4));
  return ports;
}

这是一个参考问题

console.logmyFunctemplate,3; 函数myFunctemplate,count{ 变量端口={} 对于变量i=0;i} 这是因为函数中的模板变量包含函数外部模板对象的引用。 试试这个:

 function myFunc (template, count) {
var ports = {};
for(var i = 0; i < count; i++) {
    var portNumber = i + 1;
    var tmplt = JSON.parse(JSON.stringify(template));
    tmplt.portNumber = portNumber;
    ports[portNumber + ''] = tmplt;
}
return ports;
    }

这里已经回答了您的问题:请阅读中的闭包JS@PaulD“安布拉,这不是一个结束的问题。啊,模糊的晨脑。。。你完全正确@Juhananew templateportno,template.stuff;应为new templateportNumber,template.stuff;。另外,由于您将端口号传递给模板,所以可以删除行ports[portNumber.toString].portNumber=portNumber。
var template = {
  portNumber: null,
  stuff: ""
}

myfunc(template, 3);

function myfunc(template, count) {
  var ports = {}
  for (var i = 0; i < count; i++) {
    var portNumber = i + 1;
    ports[portNumber] = JSON.parse(JSON.stringify(template));
    ports[portNumber].portNumber = portNumber;
  }
  console.debug(JSON.stringify(ports, null, 4));
  return ports;
}
var template = function(portno, stf){
  this.portNumber = portno;
  this.stuff = stf;
}

myfunc(template, 3);

function myfunc(template, count) {
  var ports = {}
  for (var i = 0; i < count; i++) {
    var portNumber = i + 1;
    ports[portNumber.toString()] = new template(portNumber , template.stuff);
  }
  console.debug(JSON.stringify(ports, null, 4));
  return ports;
}
 function myFunc (template, count) {
var ports = {};
for(var i = 0; i < count; i++) {
    var portNumber = i + 1;
    var tmplt = JSON.parse(JSON.stringify(template));
    tmplt.portNumber = portNumber;
    ports[portNumber + ''] = tmplt;
}
return ports;
    }