本文通过具体代码示例解析JavaScript中delete操作符的行为。测试表明,当删除包含引用类型属性的对象时,delete仅切断当前对象对该引用对象的指针指向,而不会删除引用对象本身。其他持有相同引用的变量仍可查看原数据,深入理解指针机制有助于避免内存泄漏和逻辑错误。
JavaScript delete操作符对引用类型的影响
以下示例展示了相关现象:
代码实现如下:
var testVar = {
a : {
test : 1
}
},
test1 = {},
test2 = {};
test1.a = testVar.a;
test2.a = testVar.a;
/*
delete test1.a;
console.log(test1.a); // undefined
console.log(test2.a); // Object {test: 1}
console.log(testVar.a); // Object {test: 1}
*/
delete testVar.a;
console.log(test1.a); // Object {test: 1}
console.log(test2.a); // Object {test: 1}
console.log(testVar.a); // undefined
通过上述测试可以得出,在JavaScript中,若使用delete删除的属性值为引用类型,该操作实际上移除的是当前对象指向该引用对象的指针,而非引用对象本身。因此,即使执行了delete testVar.a,test1.a所指向的对象依然存在于内存中且未被删除。 关于JavaScript中delete关键字的底层原理,推荐阅读:
http://perfectionkills.com/understanding-delete/
该文章的中文翻译版本:
http://www.ituring.com.cn/article/7620