将对象赋值给变量,修改变量为什么对象没有被改变?

写发布订阅的时候遇到了个问题。
我在调用crop.remove()的时候清空了fns 但是打印fns还是有数据的。fns.length = 0;这样是可以清除的。fns不是也指向了this.list[key]吗?
下方有打印结果

let crop = {
      list: {},
      on(key, fn) {
        if(!this.list[key]) {
          this.list[key] = [];
        }
        this.list[key].push(fn);
      },
      emit(key, ...payload) {
        let fns = this.list[key];
        if(!fns || fns.length === 0) return;
        fns.forEach(fn => {
          fn.apply(this, payload);
        })
      },
      remove(key, fn) {
        let fns = this.list[key];
        console.log(key);
        fns = [];
       
      }
    }

图片描述

阅读 3.1k
4 个回答
let fns = this.list[key];
console.log(key);
fns = [];

fns指向this.list[key],但是fns = []等同于将fns指向了一个新的数组。
类似于,

let fns = objA; // fns指向objA
fns = objB; // fns指向objB,之后对fns的操作就相当于对objB的操作,与objA无关。

有种
var a=[1];
var b=a;
b=[]
a??的感觉
同理 fns = [] 并不会使 this.list[key] 为[]

fns = []只是把fns指向了新的[]

fns.length = 0 ; 之所以可以清空 是因为 你的fns = this.list[key];
fns = []; 这样不会清空this.list[key] 你可以理解成 fns = 1 一个道理 ;你是在给fns这个变量重新赋值 跟this.list[key];没关系。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题