为什么append到父节点后的子节点发生修改,父节点打印出来的也会变化

今天走查前端代码,发现历史代码写出来的不规范,但是他还是在生产运行了很久的代码,仔细思量后发现,其实原理是对的,只是看起来不美观,不易读而已。

废话不说,先上demo代码


<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
  <title>appendTest</title>

  <script>
    function init(){
      var BatteryCapacityDiv = document.createElement("div");//创建Element对象
      BatteryCapacityDiv.className = 'popTowCol2';//className属性赋值
      var parentNode =  document.getElementById("pano_holder");
      parentNode.appendChild(BatteryCapacityDiv);
      console.log( parentNode)
      BatteryCapacityDiv.appendChild(getSecondHtml());
      console.log( parentNode)
    }
    function getSecondHtml(){
      var batteryCapacity_div = document.createElement("div");
      batteryCapacity_div.className = 'popLine';
      batteryCapacity_div.innerText = "testSecondHtml";
      return batteryCapacity_div;
    }

  </script>
</head>
<body onload="init()">
<div id="pano_holder"></div>
</body>
</html>

怎么样?你觉得init方法里边打印的两个console一样吗?答案是一样的;

来,上图

看出来没,一模一样,怎么理解呢?

实际上需要对象的一些基础知识来解答


1) 实例化 Element 对象BatteryCapacityDiv时 开辟出一块内存空间, 并在内存地址对应的内存中写入数据

2)使 parentNode 指向 BatteryCapacityDiv 对象, parentNode也对应 BatteryCapacityDiv 的内存地址

3)通过BatteryCapacityDiv对象修改值内存中的值改变,但是BatteryCapacityDiv对象、parentNode中的key对应的内存地址并没有改变
因此 parentNode取值改变
 

参考链接:修改对象的值,集合中的值也被改变? 一句话看懂 内存空间 内存地址 与 引用对象_使用java对象池为什么会把之前存到集合中的数据改变呢?-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,如果您需要一个接口来添加节点并返回节点,可以考虑使用类似以下的RESTful API设计: ``` POST /nodes Request Body: { "parent_id": 123, "value": "new node value" } Response Body: { "id": 456, "value": "new node value" } ``` 在上面的API中,我们使用了HTTP POST方法来创建一个新的节点。请求体(Request Body)中包含一个`parent_id`属性和一个`value`属性,分别表示节点的ID和新节点的值。在成功创建节点后,返回一个包含新节点的ID和值的JSON对象作为响应体(Response Body)。 下面是一个简单的Python代码示例,实现了上述API: ```python from flask import Flask, request, jsonify app = Flask(__name__) class Node: def __init__(self, id, value, parent_id): self.id = id self.value = value self.parent_id = parent_id self.children = [] nodes = [] next_id = 1 def find_node_by_id(id): for node in nodes: if node.id == id: return node return None @app.route('/nodes', methods=['POST']) def create_node(): global next_id parent_id = request.json['parent_id'] value = request.json['value'] parent = find_node_by_id(parent_id) if parent is None: return jsonify({'error': 'Parent node not found'}), 404 node = Node(next_id, value, parent_id) parent.children.append(node) nodes.append(node) next_id += 1 return jsonify({'id': node.id, 'value': node.value}), 201 if __name__ == '__main__': app.run() ``` 在上述代码中,我们首先定义了一个`Node`类,它包含一个ID、一个值、一个节点ID和一个节点列表。然后,我们定义了一个`nodes`列表来存储所有创建的节点,以及一个`next_id`变量来跟踪下一个可用的节点ID。 接下来,我们定义了一个`find_node_by_id`函数,用于查找具有给定ID的节点。 最后,我们定义了一个`create_node`函数,用于处理POST请求并创建新节点。我们首先从请求体中获取节点ID和新节点的值。然后,我们使用`find_node_by_id`函数查找节点。如果节点不存在,我们返回一个404响应。否则,我们创建一个新节点,将其添加到节点节点列表中,将其添加到`nodes`列表中,并将其ID和值作为响应返回。 注意,上述代码仅为示例,您需要根据自己的具体需求进行调整。例如,您可能需要添加身份验证、错误处理和其他功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值