奇怪的js对象在Chrome中的字段行为

时间:2017-11-23 22:03:01

标签: javascript json reactjs

我尝试使用从String转换为Number的变量重新分配targetRow的字段,但Chrome的控制台给了我一些奇怪的输出:

  targetRow[fieldName] = Number(value);
  console.log(targetRow[fieldName]);                  // => 12
  console.log(targetRow[fieldName]===Number(value));  // => true
  console.log(targetRow);

enter image description here

当此对象传递给状态时,其行为类似于字段的值undefined

let execPlanTmp = this.state.execPlan.slice();
execPlanTmp[rowIdx] = targetRow;
this.setState({execPlan: execPlanTmp});
console.log(this.state.execPlan);

enter image description here

UPD:    JSON.stringify(targetRow)返回正确的字符串,该字符串将传递给服务器,但js对象的字段仍被React和Chrome视为未定义。

更新2 这是整个功能:

onCellEdit = (row, fieldName, value) => {
    let rowId = this.state.execPlan.indexOf(row);

    if (rowId >= 0) {
        let execPlanTmp = this.state.execPlan.slice();
        execPlanTmp[rowId][fieldName] = Number(value);
        this.setState({execPlan: execPlanTmp});

        fetch("http://localhost:8080/api", {
            method: "PUT",
            headers: {
                "Content-Type": "application/json"
            },
            body: JSON.stringify(execPlanTmp[rowId]),
            mode: "cors"
        });
    }
};

1 个答案:

答案 0 :(得分:1)

我曾经遇到过这个问题。这是因为当你执行console.log(someVar)时,它不是字面意思是“从someVar中创建文本并打印它”,它会向您显示单击折叠时存储在内存中的值({...})数组,所以如果在您单击之前值已更改但在console.log()之后它在控制台中更改。

在控制台中运行下一个代码,您将理解:

var arr = [];
for (var i = 0; i < 1000; i++) {
    arr.push({a: i, b: 0});
}
console.log(arr);
console.log(JSON.stringify(arr).substr(0, 700));
for (var j in arr){
  arr[j].b=Math.random();
}

输出: the result