javascript如何在object中刪除屬性
在js中,可以使用delete關鍵字在object中刪除屬性,語法格式為「delete object.屬性」。 delete操作符用於刪除物件的某個屬性,當delete操作符傳回true時表示可以刪除,回傳false表示不能刪除。
本教學操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。
從物件上刪除屬性的語義正確方法是使用delete關鍵字。
給定物件
const car = { color: 'blue', brand: 'Ford' }
您可以使用以下命令從此物件中刪除屬性
delete car.brand
它的工作方式還表示為:
delete car['brand'] delete car.brand delete newCar['brand']
將屬性設為undefined
如果您需要以非常最佳化的方式執行此操作,例如在循環中對大量物件進行操作時,另一種選擇是將屬性設為undefined 。
由於其性質, delete的性能要比簡單地重新分配給undefined 慢很多 ,比慢得多50倍。
但是,請記住,該屬性不會從物件中刪除。它的值被擦除了,但是如果您迭代該對象,它仍然存在:
使用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) // undefined
4. 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); // undefined
Object.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
【推薦學習:javascript高階教學】
以上是javascript如何在object中刪除屬性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

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

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

JavaScript是一種廣泛應用於Web開發的程式語言,而WebSocket則是一種用於即時通訊的網路協定。結合二者的強大功能,我們可以打造一個高效率的即時影像處理系統。本文將介紹如何利用JavaScript和WebSocket來實作這個系統,並提供具體的程式碼範例。首先,我們需要明確指出即時影像處理系統的需求和目標。假設我們有一個攝影機設備,可以擷取即時的影像數
