对于a.x=a={n:1} 的个人理解

第一次给了掘金,没经验,写的不好的地方请理解^-^。
对于 a.x=a={n:1} 这种面试题,个人理解主要考察js两点知识:js中的引用类型和赋值表达式的运算顺序。

完整的题目是这样的:

var a = {n: 1};

var b = a; 

a.x = a = {n: 2};

请输出

 a.x  //undefined

b.x  //{n:2})

个人理解:

1、赋值运算顺序:

由于js中“.”操作符的优先级要高于赋值,所以在执行a.x = a = {n: 2}的时候,首先确定a.x是谁,再给a.x赋值,然后运算a={n:2},最终为再为a.x赋值;

2、引用关系:

a和b指向同一块内存地址,也就是对{n: 1}的引用,即a===b;

 表象是a.x,其实是{n:1}的属性x,由于运算顺序的原因,首先确定a.x其实是{n:1}的属性x,也为b的属性x。a和b还保持着对{n:1}的引用。当运行道a={n:2}的时候,由于a重新的重新赋值,a不在引用{n:1};最后给a.x赋值的时候,其实是为{n:1}的属性x赋值,此时b还对{n:1}保持引用,所以最终输出的时候:

a.x即{n:2}属性x的就等于undefined;

b.x即{n:1}的x就等于a({n:2});

描述不到之处,请指正;

——end——








转载于:https://juejin.im/post/5a69412d5188257342171399

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据你的描述,我理解你需要一个Java程序来处理这个问题。以下是一个可能的实现: ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); // n个人 int m = scanner.nextInt(); // m条消息 // 检查n和m是否超出范围 if (n < 1 || n > 100000 || m < 1 || m > 100000) { System.out.println("Null"); return; } int[] parent = new int[n + 1]; for (int i = 1; i <= n; i++) { parent[i] = i; // 初始化每个人的团队为自己 } for (int i = 0; i < m; i++) { int a = scanner.nextInt(); // 第一个人的标号 int b = scanner.nextInt(); // 第二个人的标号 int c = scanner.nextInt(); // 指令 // 检查a和b的标号是否超出范围 if (a < 1 || a > n || b < 1 || b > n) { System.out.println("da pian zi"); continue; } // 查找a和b所在的团队的根节点 int rootA = findRoot(parent, a); int rootB = findRoot(parent, b); if (c == 0) { // 判断a和b是否在一个团队 if (rootA == rootB) { System.out.println("we are a team"); } else { System.out.println("we are not a team"); } } else if (c == 1) { // 输出a和b所在的团队关系 if (rootA == rootB) { System.out.println("we are a team"); } else { System.out.println("we are not a team"); } } else { System.out.println("da pian zi"); } } } // 查找节点x所在团队的根节点 private static int findRoot(int[] parent, int x) { if (parent[x] != x) { parent[x] = findRoot(parent, parent[x]); } return parent[x]; } } ``` 在上述实现,我们使用并查集数据结构来管理每个人所在的团队。每个人初始时都是一个独立的团队,通过 `findRoot` 方法找到每个人所在的团队的根节点。然后,我们根据指令进行相应的操作和输出。 希望这可以帮助到你!如果有任何进一步的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值