delete 与 vm.$delete的区别

1、删除对象结果一样

两者相同,都会把键名(属性/字段)和键值删除。

2、删除数组不同

delete,只是将要删除的变为undefined或者empty,不改变数组的键值名以及数组长度;

vm.$delete是直接将值完全删除掉,会改变数组的键值名以及数组长度

3、vm.$delete源码解析(下面是vue的一段源码)

Vue.prototype.$delete = del;

/**
 * Delete a property and trigger change if necessary.
 * 删除属性并在必要时触发更改
 */
function del (target, key) {
  if (isUndef(target) || isPrimitive(target)
  ) {
    warn(("Cannot delete reactive property on undefined, null, or primitive value: " + ((target))));
  }
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    target.splice(key, 1);
    return
  }
  var ob = (target).__ob__;
  if (target._isVue || (ob && ob.vmCount)) {
    warn(
      'Avoid deleting properties on a Vue instance or its root $data ' +
      '- just set it to null.'
    );
    return
  }
  if (!hasOwn(target, key)) {
    return
  }
  delete target[key];
  if (!ob) {
    return
  }
  ob.dep.notify();
}

源码分析总结:

(1)从第二个if语句可以看出,如果操作的数据为数组,会使用splice删除对应数组元素,并返回一个新数组(这就是为什么会改变数组长度)。

(2)vm.$delete的作用是删除数据中的某个属性。如果对象是响应式的,需要确保删除能触发更新视图,这个方法主要是用于避开vue.js不能检测到属性被删除的限制。

(3)从倒数第六行可以看出为什么两个api删除对象时,结果是一样的(实际应用情况还是不一样的,毕竟vm.$delete是分装过的api,专门用于处理数据相应问题的)。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值