2016-01-05 123 views
3

我有以下代碼片斷中最後一個'刪除'用法返回一個意外的值。意外'刪除'返回值

function Shape() { 
 
    this.a = 10; 
 
} 
 
Shape.prototype.a = 20; 
 
var s = new Shape(); 
 
console.log(s.a); // 10 
 
delete s.a; //true 
 
console.log(s.a) // 20 
 
delete s.a; //true 
 
console.log(s.a); // 20

即使最終「刪除山」返回true,「山」的值仍然返回20

如果我們不能通過從參考刪除原型對象對象(在本例中是's'),爲什麼delete關鍵字返回true?

其次,

delete Shape.prototype.a; // true

給出了真實的財產的確是從Shape.prototype刪除。但是有沒有辦法通過對象引用's'來刪除'Shape.prototype.a'?

+1

你是什麼意思'delete'返回TRUE? 'delete'是一個聲明,而不是一個表達式。 – thefourtheye

+0

您可以在控制檯中檢查'刪除'的返回值。如果項目被刪除,它在評估語句後返回'真'。 –

+0

請在投票回答問題前檢查'刪除'的用法。 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/delete –

回答

3

delete關鍵字的返回值確實是而不是指示刪除操作是否確實刪除了一個字段。從MDN article about delete keyword

返回值

拋出嚴格模式中,如果屬性是自己不可配置 屬性(返回非嚴格假)。在所有其他 個案中返回true。

在你的情況s.a不是自己的財產,所以delete總是返回true。如果在原型鏈中找到該屬性,則無關緊要。例如:

delete {}.xyz; // also returns `true`. 

你不應該發生變異的原型,因爲它會打破所有的JavaScript引擎爲您做以提高性能的優化。但是,如果你真的想,你可以使用這個功能:

function deepDelete(o,key) { 
    while (o) { 
    delete o[key]; 
    o = Object.getPrototypeOf(o); 
    } 
} 

例子:

function S(){} 
S.prototype.a = 8; 
var s = new S(); 
s.a = 9; 
console.log(s.a); // 9 
delete s.a; 
console.log(s.a); // 8 
deepDelete(s, 'a'); 
console.log(s.a); // undefined 
+0

我想知道什麼'deepDelete'爲宿主對象(比如,在舊的IE中的DOM元素)... ;-) –

+0

@JanDvorak嗯,說實話,我不知道(誰有?:)) –

+0

我的最好的猜測是它崩潰了代碼。要麼是空指針異常,要麼是奇怪的,不可搜索的。 –

1

function Shape() { 
 
    //this.a = 10; 
 
} 
 

 
Shape.prototype.a = 20; 
 
var s = new Shape(); 
 

 
console.log(s.a); 
 

 
delete Shape.prototype.a; 
 
console.log(s.a);

以及由MDN報價,也是在答覆中提到by hege_hegedus,

返回值

拋出嚴格模式中,如果屬性是自己不可配置 屬性(在非嚴格返回false)。在所有其他 個案中返回true。

底線是刪除是一個運營商,而不是一個方法,它只是去除對象的屬性,aShape.prototype的財產,而不是類Shape的對象,所以你需要刪除,而不是delete s.a

0

'delete'方法只能刪除對象的屬性而不是原型的屬性。當你刪除一個不存在於對象中的屬性時,它將返回true;然而,在下列情況將返回false:

delete Object.prototype; //renturn false; property can't set 
 
var x=1; 
 
delete this.x; //return flase;can not delete a global var 
 
function f(){} 
 
delete this.f; //return false; can not delete a global function

+0

你也可以用'in'運算符,hasOwnProperty()或propertyIsEnumerable()來測試屬性是否屬於一個對象。還有一個簡單的方法可以做到這一點:o.x!== undefined; – Jaycee