2012-08-27 28 views
10

Secondo this MDN page, la parola chiave deleteQual è il vero significato del valore restituito di `delete`?

restituisce false solo se la proprietà esiste e non può essere eliminato. It restituisce true in tutti gli altri casi.

Tuttavia, vedo casi in cui delete rendimenti true, nonostante la proprietà non essere eliminati:

delete Window 
delete alert 
delete dir 
delete console 
delete 2 
delete null 
delete {}.x 
... 

Infatti, quasi tutte le proprietà di window ritorno vero con delete, come si può vedere dalla corsa il seguente script in about:blank:

for(a in window) { if(delete window[a]) { console.log(a); } } 

Tuttavia, la maggior parte delle proprietà di window do in realtà non vengono cancellati. Qual è il vero significato del valore restituito di delete? Perché restituisce true per le proprietà che non elimina?

(Nota:. Sarei interessato a riferimenti al codice di Chromium che spiegano il comportamento di delete)

+0

Quella linea ha emesso un bel po 'di nomi per me, quindi ho disabilitato jQuery, quindi non ho potuto dirlo. Sembra che funzioni come previsto. –

+0

Hai provato gli esempi come 'cancella finestra', ecc.? – Randomblue

risposta

8

La finestra è un host object, uno la cui semantica è definita dall'ambiente host, ad es. il browser. delete quando applicato a proprietà di oggetti host è più complicato rispetto a quando applicato a oggetti nativi.

Gli oggetti host possono supportare queste proprietà interne con qualsiasi comportamento dipendente dall'implementazione, purché sia ​​coerente con le restrizioni dell'oggetto specifico specificato in questo documento.

Section 11.4.1 - The delete operator dice

If IsUnresolvableReference(ref) then, 
    If IsStrictReference(ref) is true, throw a SyntaxError exception. 
    Else, return true. 

in modo che quando un oggetto host non supporta la cancellazione o la modifica di una proprietà, allora restituisce un riferimento non risolvibile o un riferimento, che finge di essere cancellati. Entrambi gli approcci causano la restituzione di true in modalità non rigida.

1

Dato che si agisce sugli oggetti di basso livello nel programma, gli attributi possono essere infatti essere eliminati e poi immediatamente riaggiunto, anche se non ho idea di come testare questo comportamento.

1

Sulla pagina MDN specifica la sintassi, che non include delete object come la prima serie di esempi utilizzati. Specifica la sintassi delete object[property] come mostra il tuo secondo esempio. Tuttavia, ciò che accade con gli oggetti DOM (host) non è specificato. Vedi this article for more information.

0

Fondamentalmente, i browser proteggono l'ambiente di runtime del browser, nel test.

C'era una volta, non avrebbe potuto essere il caso, ma per quanto riguarda le prove andare, questo è simile a chiedere il motivo per cui Windows non consente di aprire la shell dei comandi e si esegue:

> cd/
> deltree *.* 

più.

Perché non c'è davvero alcuna buona ragione per essere in grado di fare una cosa del genere, quando ci si aspetta che l'ambiente continui effettivamente a funzionare, in seguito, e non a distruggere l'intero browser, e potenzialmente l'istanza del proprio SO stai correndo, o qualunque altro errore divertente potrebbe verificarsi quando fondamentalmente chiedi a un programma di cancellarsi in tempo reale, mentre al momento ha accesso a basso livello alla tua GPU/scheda audio/dispositivi di input.

Delete restituirà un errore nel caso in cui si tenti di eliminare una var. In termini di proprietà globali, il browser deve funzionare, la maggior parte di esse è definita come una proprietà (ad esempio: window.location) ma viene eseguita a un livello basso (ad esempio: non si ha accesso). Quindi, in teoria, sono oggetti che possono essere cancellati. Ma sono protetti, quindi non è possibile, ma questo non cambierà la dichiarazione di ritorno di delete, perché ciò potrebbe alterare il comportamento previsto di delete.

Quindi:

function() { 
    var obj = { prop : true }; 
    delete obj; /* fail */ 
    delete object.prop; /* succeed */ 
} 
2

L'implementazione JavaScript utilizzato dai browser è sempre stato piegare le regole. Una parte dell'API javascript DOM non è nemmeno possibile in puro javascript, ad esempio dom innerHTML = "qualcosa" che attiva un evento. Questo problema è stato risolto in EcmaScript5, ma non è possibile fare affidamento sul fatto che il modello di oggetti del browser sia javascript al 100% legittimo. AFAIK, finché non metti un piede nel DOM e nel BOM, puoi contare completamente sullo standard ecmascript.

Problemi correlati