一、變數
說到javascript中的delete操作符,還是先搞清楚javascript中的變數和屬性之間的關係。
javascript中,變數和對象屬性關係非常微妙,甚至可以很多時候會被等同起來,因為javascript 在執行腳本之前會創建一個global對象,在瀏覽器中就是window對象,所有的全域變數都是這個global物件的屬性,執行函數時也會建立一個activation對象,所有的局部變數都是這個activation物件的屬性。這些可以大家可以去了解javascript作用域和閉包。
//原型中宣告的屬性無法刪除>
var global = 1;
this.global; // 1, 可以透過this來存取global物件
this.global2 = 2;
global2; // 12
function foo( ) {
var local = 36;
// 不過無法直接存取activation,
// 因此無法透過foo.local 的方式來存取local變數
}
二、delete運算符
delete操作符是用來刪除物件屬性的。對於引用類型的值,它也是刪除物件屬性的本身,不會刪除屬性指向的物件。如果有疑問可以看看基本類型和引用類型的值,或測試下面的程式碼:var a = { x: 10 };
o.a = a;
delete o.a; // o.a屬性刪除
console.log(a.x); // 10, 因為{ x: 10 } 物件仍被a 引用,所以不會被回收
透過var宣告的變數和透過function宣告的函數擁有dontdelete特性,是不能被刪除。未透過var宣告的全域變數(全域物件的屬性)
a: 123,
b: {
c: 1345
}
obj = {
a: 123
};
delete obj; // 刪除obj全域變量,window物件的obj屬性
console.log(obj); /obj is not defined
原型prototype中宣告的屬性和物件自帶的屬性(其實這些屬性也是在原型prototype中的)可以認為是帶有dontdelete的特性的,無法被刪除。例如
複製程式碼
}
obj.prototype.x = 2;
var o = new obj();
console.log(o.x); // 1, 建構子中定義的o.x
delete o.x;
console.log(o.x); // 2, prototype中定義的o.x,即使再次執行delete o.x也不會被刪除
//物件自帶的屬性無法被刪除
var strings = "123456";
console.log(strings.length);// 6
delete strings.length;
console.log(strings.length);//依然6
五、eval語句下的幾個例外
eval執行的程式碼中,透過var宣告的變數雖然與正常的var宣告變數同屬於global對象,但它們不具有dontdelete特性,且能被刪除。但是eval的程式碼中的函數內透過var定義的變數具有dontdelete,不能被刪除。
複製程式碼
x; // => 42
delete x;
x; // => referenceerror: x is not defined
eval( "function f() { return 12; }");
f(); // => 12
delete f;
f(); // => referenceerror: f is not defined
//eval執行的程式碼中,透過var宣告的變數雖然與正常的var宣告變數同屬於global對象,
// 但它們不具有dontdelete特性,但能被刪除。
eval("(function () {"
" var x = 42;"
" delete x;"
" return x;"
);") "// => 42
// eval的程式碼中的函數內透過var定義的變數具有dontdelete,不能被刪除。
六、delete的回傳值
delete是普通運算符,會回傳true或false。當被delete的物件的屬性存在並且擁有dontdelete時 傳回false,否則傳回true。 這裡的一個特點就是,物件屬性不存在時也會回傳true,所以回傳值並非完全等同於刪除成功與否。function c() {
this . 42;
}
c.prototype.y = 12;
var o = new c();
delete o.x; // true
o.x; // undefined
"x" in o; // false
// o.x存在且沒有dontdelete,回傳true
delete o.y; // true
o.y; // 12
// o自身沒有o.y屬性,所以回傳true
// 從這裡也可以看到prototype鏈的存在,物件本身屬性和prototype屬性是不同的
delete o; // false
// global .o擁有dontdelete特性所以回傳false
delete undefinedproperty; // true
// global沒有名為undefinedproperty的屬性因此回傳true
delete 42; // 42不是屬性所以回傳true。有的實作會拋出異常(違反ecmascript標準)
var x = 24;
delete x ; // true
x; // 25

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

記事本++7.3.1
好用且免費的程式碼編輯器