摘要:如果你想讓一個數組元素的值變為而不是刪除它,可以使用給其賦值而不是使用操作符。此時數組元素是在數組中的操作符與直接釋放內存只能通過解除引用來間接釋放沒有關系。
delete 操作符用來刪除一個對象的屬性 語法EDIT
delete expression
expression 應該是一個對象的屬性引用,例如:
delete object.property
delete object["property"]
如果 expression 的計算結果不是一個對象的屬性引用,那么,delete不會起任何作用。
參數objectName 對象名. property 需要刪除的屬性. 返回值
【注意】在嚴格模式中,如果屬性是一個不可配置(non-configurable)屬性,刪除時會拋出異常,非嚴格模式下返回 false。其他情況都返回 true。
描述EDITdelete 操作符與直接釋放內存(只能通過解除引用來間接釋放)沒有關系。可查看內存管理頁面。
【注意】你可以使用 delete 操作符來刪除一個隱式聲明的全局變量,也就是沒有使用 var 定義的全局變量.全局變量其實是global對象(window)的屬性.
如果 delete 操作符刪除成功,則被刪除的屬性將從所屬的對象上徹底消失。然后,如果該對象的原型鏈上有一個同名屬性,則該對象會從原型鏈上繼承該同名屬性。
Temporal dead zone在ECMAScript 6中,通過 const 或 let 聲明指定的 "temporal dead zone" (TDZ) 對 delete 操作符也會起作用。因此,下面的代碼將會拋出 ReferenceError。
function foo(){
delete x;
let x;
}
function bar() {
delete y;
const y;
}
一些對象的屬性不能被delete. ECMA 262 規范中把這些屬性標記為 DontDelete.
x = 42; // 隱式聲明的全局變量
var y = 43; // 顯式聲明的全局變量
myobj = {
h: 4,
k: 5
}
// 隱式聲明的全局變量可以被刪除
delete x; // 返回 true
// 顯式聲明的全局變量不能被刪除,該屬性不可配置(not configurable)
delete y; // 返回 false
//內置對象的內置屬性不能被刪除
delete Math.PI; // 返回 false
//用戶定義的屬性可以被刪除
delete myobj.h; // 返回 true
// myobj 是全局對象(window)的屬性,而不是變量,因此可以被刪除
delete myobj; // 返回 true
function f() {
var z = 44;
// delete doesn"t affect local variable names
delete z; // returns false
}
你不能刪除一個對象從原型繼承而來的屬性(不過你可以從原型上直接刪掉它).
function Foo(){}
Foo.prototype.bar = 42;
var foo = new Foo();
// 無效的操作
delete foo.bar;
// logs 42,繼承的屬性
console.log(foo.bar);
// 直接刪除原型上的屬性
delete Foo.prototype.bar;
// logs "undefined",已經沒有繼承的屬性
console.log(foo.bar);
刪除數組元素
當你刪除一個數組元素時,數組的 length 屬性并不會變小。
例如,如果你刪除了a[3], a[4]仍然是a[4], a[3]成為undefined. 即便你刪除了最后一個元素也是如此 (delete a[a.length-1]).
當用 delete 操作符刪除一個數組元素時,被刪除的元素已經完全不屬于該數組。下面的例子中, trees[3] 被使用delete徹底刪除。
var trees = ["redwood","bay","cedar","oak","maple"];
delete trees[3];
if (3 in trees) {
// 這里不會被執行
}
如果你想讓一個數組元素的值變為 undefined 而不是刪除它,可以使用 undefined 給其賦值而不是使用 delete 操作符。下面的例子中,trees[3] 被賦值為undefined,但該元素仍然存在。
var trees = ["redwood","bay","cedar","oak","maple"];
trees[3]=undefined;
if (3 in trees) {
// 這里會被執行
}
1.delete使用原則:delete 操作符用來刪除一個對象的屬性。
2.delete在刪除一個不可配置的屬性時在嚴格模式和非嚴格模式下的區別:
在嚴格模式中,如果屬性是一個不可配置(non-configurable)屬性,刪除時會拋出異常;
非嚴格模式下返回 false。
3.delete能刪除隱式聲明的全局變量:這個全局變量其實是global對象(window)的屬性
4.delete能刪除的:
(1)可配置對象的屬性(2)隱式聲明的全局變量 (3)用戶定義的屬性 (4)在ECMAScript 6中,通過 const 或 let 聲明指定的 "temporal dead zone" (TDZ) 對 delete 操作符也會起作用
delete不能刪除的:
(1)顯式聲明的全局變量 (2)內置對象的內置屬性 (3)一個對象從原型繼承而來的屬性
5.delete刪除數組元素:
(1)當你刪除一個數組元素時,數組的 length 屬性并不會變小,數組元素變成undefined
(2)當用 delete 操作符刪除一個數組元素時,被刪除的元素已經完全不屬于該數組。
(3)如果你想讓一個數組元素的值變為 undefined 而不是刪除它,可以使用 undefined 給其賦值而不是使用 delete 操作符。此時數組元素是在數組中的
6.delete 操作符與直接釋放內存(只能通過解除引用來間接釋放)沒有關系。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/81536.html
摘要:將指定的數字索引值轉換成字符串索引值變成,然后將其作為屬性名來用。返回一個由刪除元素組成的數組。該方法返回的數組元素是調用的數組的一個子集。使用的函數有四個參數初始值積累值數組元素元素索引數組本身。 前言 很多人在學習原生JS的過程中會遇到一些疑惑,比如在學習array時,就很容易搞不清哪些方法會改變原來數組,哪些方法不會改變原來數組?再比如很多人會使用new Date()獲取時間,卻...
摘要:反之亦然非嚴格合并嚴格看起來是非嚴格的。在普通的里面給一個拼寫錯誤的變量名賦值會使全局對象新增一個屬性并繼續工作盡管后面可能出錯在現在的中有可能。第三嚴格模式禁止刪除聲明變量。 文章整理自MSDN:https://developer.mozilla.org... 1.逐步使用嚴格模式 ECMAScript 5的嚴格模式是JavaScript中的一種限制性更強的變種方式。嚴格模式不是一個...
摘要:閉包能用來實現私有化和創建工廠函數等作用。關于閉包的常見面試題是這樣的寫一個函數,循環一個整數數組,延遲秒打印這個數組中每個元素的索引。 文章來源:http://mp.weixin.qq.com/s/vs0... 前言 在公眾號上看到了這篇文章,覺得很有用,有助于理解JS學習中的一些重點難點。決定把它整理下發布出來。該文章主要介紹了JS中的三個問題。在以后的幾篇文章里,我會詳細介紹這三...
摘要:讓你收獲滿滿碼個蛋從年月日推送第篇文章一年過去了已累積推文近篇文章,本文為年度精選,共計篇,按照類別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術文章,為了讓大家在家也能好好學習,特此花了幾個小時整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個蛋從2017年02月20...
閱讀 3654·2021-11-23 09:51
閱讀 1996·2021-11-16 11:42
閱讀 3245·2021-11-08 13:20
閱讀 1101·2019-08-30 15:55
閱讀 2210·2019-08-30 10:59
閱讀 1245·2019-08-29 14:04
閱讀 1030·2019-08-29 12:41
閱讀 2031·2019-08-26 12:22