天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

JavaScript delete操作符應用實例

今天在看prototype代碼時發現了delete這個操作符
復制代碼 代碼如下:
unset: function(key) {
var value = this._object[key];
delete this._object[key];
return value;
}

查了一下手冊,
delete 運算符
從對象中刪除一個屬性,或從數組中刪除一個元素。
delete expression
expression 參數是一個有效的 JScript 表達式,通常是一個屬性名或數組元素。
說明
如果 expression 的結果是一個對象,且在 expression 中指定的屬性存在,而該對象又不允許它被刪除,則返回 false。
在所有其他情況下,返回 true。
看到“從數組中刪除一個元素”感覺不錯,可ff里試了一下,似乎只能刪除那個元素的值,而不是元素本身。不過從對象中刪除一個屬性是可以的。
又google了一下,發現有一篇文章講得很詳細,轉載過來以免忘記:
Javascript的變量
實際上Javascript中,變量 = 對象屬性,這是因為 Javascript 在執行腳本之前會創建一個Global對象,所有的全局變量都是這個Global對象的屬性,執行函數時也會創建一個Activation對象,所有的局部變量都是這個Activation對象的屬性。如下例:
復制代碼 代碼如下:
var global = 42;
this.global; // 42, 可以通過this來訪問Global對象
this.global2 = 12;
global2; // 12
function foo() {
var local = 36;
// 不過無法直接訪問Activation,
// 因此無法通過 foo.local 的方式來訪問local變量
}

delete操作符刪除的對象
C++中也有delete操作符,它刪除的是指針所指向的對象。例如:
復制代碼 代碼如下:
// C++
class Object {
public:
Object *x;
}
Object o;
o.x = new Object();
delete o.x; // 上一行new的Object對象將被釋放

Javascript的delete與C++不同,它不會刪除o.x指向的對象,而是刪除o.x屬性本身。
復制代碼 代碼如下:
// Javascript
var o = {};
o.x = new Object();
delete o.x; // 上一行new的Object對象依然存在
o.x; // undefined,o的名為x的屬性被刪除了

在實際的Javascript中,delete o.x之后,Object對象會由于失去了引用而被垃圾回收,所以delete o.x也就“相當于”刪除了o.x所指向的對象,但這個動作并不是ECMAScript標準,也就是說,即使某個實現完全不刪除Object對象,也不算是違反ECMAScript標準。
“刪除屬性而不是刪除對象”這一點,可以通過以下的代碼來確認。
復制代碼 代碼如下:
var o = {};
var a = { x: 10 };
o.a = a;
delete o.a; // o.a屬性被刪除
o.a; // undefined
a.x; // 10, 因為{ x: 10 } 對象依然被 a 引用,所以不會被回收

另外,delete o.x 也可以寫作 delete o["x"],兩者效果相同。
對變量執行delete的情況
由于變量也是 Global 或者是 Activation 對象的屬性,所以對變量的delete操作也是同樣的結果。
復制代碼 代碼如下:
var global = 42;
delete global; // 刪除Global.global
function foo() {
var local = 36;
delete local; // 刪除Activation.local
}

能刪除的屬性和不能刪除的屬性
并不是所有的屬性都能被delete。例如,prototype中聲明的屬性就無法被delete:
復制代碼 代碼如下:
function C() { this.x = 42; }
C.prototype.x = 12;
var o = new C();
o.x; // 42, 構造函數中定義的o.x
delete o.x;
o.x; // 12, prototype中定義的o.x,即使再次執行delete o.x也不會被刪除

對象的預定義屬性也無法刪除。 可以認為這類屬性帶有DontDelete的特性。
復制代碼 代碼如下:
var re = /abc/i;
delete re.ignoreCase;
re.ignoreCase; // true, ignoreCase無法刪除

能刪除的變量和不能刪除的變量
通過var聲明的變量和通過function聲明的函數擁有DontDelete特性,無法被刪除。
復制代碼 代碼如下:
var x = 36;
delete x;
x; // 36, x沒有被刪除
y = 12;
delete y;
y; // undefined
function foo() { return 42; }
delete foo;
foo(); // 42

但是有一點例外,就是通過 eval 執行的代碼中,通過var聲明的變量雖然與正常的var聲明變量同屬于Global對象,但它們不具有DontDelete特性,能被刪除。
復制代碼 代碼如下:
eval("var x = 36;");
x; // 42
delete x;
x; // undefined

但是這也有一點例外,eval的代碼中的函數內通過var定義的變量具有DontDelete,不能被刪除。
復制代碼 代碼如下:
eval("(function() { var x = 42; delete x; return x; })();");
// 返回 42

delete的返回值
delete是普通運算符,會返回true或false。規則為:當被delete的對象的屬性存在并且擁有DontDelete時返回false,否則返回true。這里的一個特點就是,對象屬性不存在時也返回true,所以返回值并非完全等同于刪除成功與否。
復制代碼 代碼如下:
function C() { this.x = 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; // true
// 42不是屬性所以返回true。有的實現會拋出異常(違反ECMAScript標準)
var x = 24;
delete x++; // true
x; // 25
// 被刪除的是x++的返回值(24),不是屬性,所以返回true

JavaScript技術JavaScript delete操作符應用實例,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 成年人视频免费在线观看 | 高清欧美videos sexo | 久久这里只有精品国产99 | 香蕉久久夜色精品国产小优 | jizz女学| 亚洲精品久久久久无码AV片软件 | 伊人久久大香线蕉综合色啪 | 日久精品不卡一区二区 | MELODY在线播放无删减 | 伊人角狠狠狠狠 | 美美哒高清在线播放8 | 东京热百度影音 | 97超级碰碰人妻中文字幕 | 国产高清免费视频免费观看 | 内射气质御姐视频在线播放 | 在线免费观看成年人视频 | 9亚洲欧洲免费无码在线 | 久久精品国产欧美成人 | 最新无码二区日本专区 | 蜜芽tv在线www | 鞋奴的视频VK | 日本久久久久久久做爰片日本 | 国产东北男同志videos网站 | 小草视频免费观看在线 | 娇妻归来在线观看免费完整版电影 | 韩国电影久久 | 国产成人8x视频一区二区 | 在线色av | 国产麻豆精品久久一二三 | 87影院午夜福利 | 99热国产这里只有精品免费 | 97资源总站(中文字幕) | 校花的奶好大好浪 | www色视频在线观看 WWW色视频片内射 | 嗯好大好猛皇上好深用力 | JLZZJLZZJLZ老师好多的水 jk制服喷水 | 日日夜夜噜噜 | 日韩 无码 手机 在线 | 亚洲免费高清视频 | 两百磅美女 | 国产产一区二区三区久久毛片国语 |