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,专门用于处理数据相应问题的)。