javascript - 为什么在 React js 中初始化一维数组和二维数组的行为不同
问题描述
示例 1
const arr = ["a","b","c","d"]
class Alphabate extends React.Component{
constructor(props){
super(props)
this.state = {alpha:[...arr]}
this.state.alpha[0] = "Changed"
console.log(`inside consructor arr = ${arr}`)
}
render(){
return <div>
{this.state.alpha.map(
x=><h3>{x}</h3>
)}
</div>
}
}
ReactDOM.render(<Alphabate />,
document.getElementById("root"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.0.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.0.0/umd/react-dom.production.min.js"></script>
<div id="root"></div>
在此示例中,1 浏览器显示 Changed b c d 和控制台日志“inside consructor arr = a,b,c,d”
const arr = [["a","b"],
["c","d"]]
class Alphabate extends React.Component{
constructor(props){
super(props)
this.state = {alpha:[...arr]}
this.state.alpha[0][0] = "Changed"
console.log(`inside consructor arr = ${arr}`)
}
render(){
return <div>
{this.state.alpha.map(
x=>x.map(
y=><h3>{y}</h3>
))}
</div>
}
}
ReactDOM.render(<Alphabate />,
document.getElementById("root"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.0.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.0.0/umd/react-dom.production.min.js"></script>
<div id="root"></div>
在此示例中,浏览器显示 Changed b c d 和控制台日志“inside consructor arr = Changed,b,c,d”
所以我的问题是:为什么一维数组按值传递,二维数组按引用传递,尽管我传递了数组 [...arr] 的副本而不是数组
解决方案
JavaScript 没有“二维”数组。它有数组数组。当你这样做时:
this.state = {alpha:[...arr]}
...您只是在制作外部数组的副本;它仍然包含对原始内部数组的引用arr
。因此,当您更改这些内部数组的内容时,无论您查看哪个外部数组以到达内部数组,都会看到这种变化。
推荐阅读
- c++ - 为任何 STL 容器创建别名模板
- r - 计算每个选定列的字符串出现次数
- python - 将季节性分解趋势应用于 dask DataFrame,Python 的每一列
- javascript - !解决了!如何使用 xmlHttpRequest 从 JavaScript 中的 .json 文件打印表格
- ssis - 使用 SSIS 将单个存储过程中的多个结果导出到 Excel 工作表的多个选项卡中
- python - Pymongo 将子文档嵌入到 Json
- flutter - 在 Flutter App 上收集感应传感器数据
- amazon-ec2 - 从 196.254.169.254 获取 EC2 元数据
- python - 如何在 Python 中替换全局变量
- tensorflow - 在简单的前馈网络中展平