摘要:作用操作符用于刪除對象的某個屬性。但和內存并無關聯,內存管理并不是操作符可以操作的,而且一點關系也沒有。
文章同步到github
在JavaScript中,delete操作符用的比較少,但是還是比較重要的,我本人面試的時候就遇到過關于delete的問題,下面總結一下delete的具體用法。作用:
delete 操作符用于刪除對象的某個屬性。
語法:直接使用delete操作符
delete object.property 或 delete object["property"]
例如:
var person = { name: "abc" age: 18 } delete person.name console.log(person) // {age: 18}返回值:
delete操作符具有返回值,返回值為布爾值,對于所有情況都是true,即使是刪除不存在的屬性也會返回true,還是如上代碼,不防打印一下返回值看看
console.log(delete person.name) //true console.log(delete person.job) //即使刪除對象不存在的屬性依然返回true
但是也有例外的情況(返回false),如果屬性是不可配置屬性(對于不可配置屬性的概念,可以參考Object. defineProperty,我第一次聽說這個概念的時候也有點蒙圈), 在非嚴格模式下,返回false,在嚴格模式下則會拋出語法錯誤的異常。
具體使用 1. 對象屬性不存在如上所述,如果刪除對象不存在的屬性,delete無效,但是返回值仍然為true
2. 原型鏈上存在該同名屬性如果delete操作符刪除屬性成功,則該屬性將永遠不存在,但是該對象原型鏈上存在該同名屬性,則該對象會從原型鏈上繼承該同名屬性。但和內存并無關聯,內存管理并不是delete操作符可以操作的,而且一點關系也沒有。內存管理推薦MDN這篇文章
// 構造函數 function Person() { this.name = "張三", this.job = "工程師" } Person.prototype.name = "李四" // 創建實例對象 var p = new Person(); // 只刪除p實例的name屬性 delete p.name; console.log(p) => // 通過打印如下圖,name屬性成功刪除
接下來看: console.log(p.name) => // "張三" 依然可以訪問到
所以可以看出delete操作只會在自身的屬性上起作用,這里能console出來"張三",是作用域鏈的原因,當實例本身無該屬性的時候,就會去找它的protype身上有無該同名屬性。
3. 使用var聲明使用var聲明的屬性(包括函數),不能從全局作用域或函數作用域中刪除
在全局作用域中聲明屬性:
// 聲明屬性 var a = 1; // 等同于window.a delete a // 嚴格模式下拋出語法異常 SyntaxError console.log(a); // 1 非嚴格模式下 console.log(delete a); // 非嚴格模式下false
// 聲明函數 var fn = function () { console.log(1); } delete fn // 嚴格模式下拋出語法異常 SyntaxError fn() // 1 非嚴格模式下delete失效, 函數依然存在 // 另外, 除字面量定義外,匿名函數定義函數效果也是一樣
在函數作用域中聲明屬性(效果和在全局作用域中一樣):
// 局部作用域聲明屬性 funtion fn() { var a = 1; delete a; // 嚴格模式下拋出語法異常 SyntaxError console.log(a); // 1 console.log(delete a); // 非嚴格模式下false } fn();
// 局部作用域聲明函數 var fn = function() { var fn2 = function() { console.log(1); }; delete fn2 // 嚴格模式下拋出語法異常 SyntaxError console.log(delete fn2); // false 非嚴格模式下 fn2(); // 1 } fn();
另外, 需要注意的是,在對象中定義的函數是可以刪除的,和屬性一樣,比如
var person = { name: "張三", showName: function () { console.log(this.name); } } delete person.showName console.log(person.showName) // undefined4. let和const聲明的屬性
任何用let或const聲明的屬性不能夠從它被聲明的作用域中刪除,我試了下,和var的效果是一樣的,目前只能理解到這,如果知道的大神請指點下
5. 不可設置的屬性 Math, Array, Object等內置對象的屬性不可刪除console.log(Array.length); // 1 delete Array.length console.log(Array.from); 0
delete Array.prototype //嚴格模式下拋出異常 console.log(Array.prototype) // 非嚴格模式下,prototype依然存在, 可以自己試試了,自己動手,豐衣足食 console.log(Array.prototype.join); // 非嚴格模式下,join方法依然存在
需要注意的是,只是這些內置對象的屬性不可刪除,內置對象的方法是可以刪除的,比如:
console.log(Array.forEach); // 內置函數 delete Array.forEach // 不用區分嚴格模式與否 console.log(Array.forEach); // undefinedObject.defineProperty()設置為不可設置的屬性,不可刪除
var person = {}; Object.defineProperty(person, "name", { value: "張三", configurable: false }) delete person.name // 嚴格模式下,拋出異常 console.log(person.name); // 張三 console.log(delete person.name); // 非嚴格模式false
var, let以及const創建的不可設置的屬性不能被delete操作刪除
var a = "abc"; // 屬于window 等同于window.a var aVal = Object.getOwnPropertyDescriptor(window, "a"); console.log(aVal); // aVal輸入如下 // { // value: 2, // writable: true, // enumerable: true, // configurable: false // 由于是var聲明的屬性,所以為false // }
var a = "abc"; // 屬于window 等同于window.a delete a // 嚴格模式下拋出異常 var aVal = Object.getOwnPropertyDescriptor(window, "a"); console.log(aVal); console.log(delete a); //false // 非嚴格模式下,aVal輸入如下 // { // value: 2, // writable: true, // enumerable: true, // configurable: false // 由于是var聲明的屬性,所以為false // }
如果開始沒有閱讀,再去看看吧Object. defineProperty。如果了解,可以直接略過。
6. 刪除數組使用delete操作符刪除數組總某項元素時,被刪除的元素會從該數組中刪除,但是數組的length并不會改變
var arr = [1, 2, 3]; delete arr[1] console.log(arr); // [1, undefined × 1, 2] console.log(delete arr[1]) // true console.log(arr[1]); // undefined
但是這里存在一個問題
console.log(1 in arr) // false
所以如果想把數組中某一項賦值成undefined時,不應該使用delete操作符,而是直接使用下邊賦值
arr[1] = undefined; // 這樣就可以解決上面的問題 console.log(1 in arr) // true
今天花了點時間,把關于delete的問題總結了一下, 方便自己查閱, 也希望能幫助需要的人, 歡迎大神指點與補充,如果你閱讀完,感覺也還有收藏價值,那還等什么,趕快收藏吧!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87155.html
摘要:所有在控制臺中的調試文本似乎是以來編譯和執行的,而不是在全局或函數代碼中執行。所以要小心普通的全局代碼和控制臺中代碼的區別。 原文:Understanding delete 譯文:javascript 中的 delete 譯者:@justjavac 在這篇文章中作者從《JavaScript面向對象編程指南》一書中關于 delete 的錯誤講起,詳細講述了關于 delete 操...
摘要:你覺得下列代碼中,哪些操作能成功人肉判斷一下,不要放進瀏覽器里執行。故對于解析而言,得到的為上述所有的屬性在下均為。那么又有什么玄機呢的操作可理解為對于,調用其內部的方法。幾乎所有的都是不可刪除的。 你覺得下列代碼中,哪些delete操作能成功?人肉判斷一下,不要放進瀏覽器里執行。 // #1 a = hello world; delete a; // #2 var b = hel...
摘要:數據屬性數據屬性指包含一個數據值的位置,可在該位置讀取或寫入值,該屬性有個供述其行為的特性表示能否使用操作符刪除從而重新定義,或能否修改為訪問器屬性。如中的屬性通過我們能夠獲取到個內部屬性,控制著變量或屬性是否可被刪除。 本文正式地址:http://www.xiabingbao.com/javascript/2015/08/03/javascript-delete-conf... 在...
摘要:的這種實現方式導致了一些尷尬問題,比如刪除元素元素遍歷。后面的參數被忽略掉了,表示并沒有要插入的元素。其實,的本質是跟蹤中的,并始終保持值是。這時候,雖然不大可能,可能會在中間某個中被用戶重新定義。但是在上進行這種操作是很糟糕的。 在Javascript中,array是一個類數組的object。顧名思義,它能夠在一個變量上存儲多個值。 數組是值的有序集合。每個值叫做一個元素,而每個元素...
摘要:但是,使用并不會產生異常,會直接返回。操作符是將的屬性刪去的操作。所以操作符的作用是無效的。因為操作符并不是影響數組的長度。面試題參考自本文給出的面試題答案只是很多合理答案中的幾個,可能會不全面,歡迎大家補充。 問題1:JavaScript 中 undefined 和 not defined 的區別 JavaScript 未聲明變量直接使用會拋出異常:var name is not d...
閱讀 1432·2021-11-25 09:43
閱讀 2029·2021-07-26 23:38
閱讀 741·2019-08-30 15:53
閱讀 2281·2019-08-30 15:43
閱讀 1169·2019-08-29 18:40
閱讀 1970·2019-08-26 13:28
閱讀 1975·2019-08-23 18:20
閱讀 544·2019-08-23 15:07