2012-08-27 20 views
10

this MDN pageによると、deleteキーワード`delete`の戻り値の本当の意味は何ですか?

は、プロパティが存在し、削除することができない場合にのみ、falseを返します。それ以外の場合は がtrueを返します。

プロパティが削除されていないにも関わらず、しかし、私は、delete戻りtrue例を参照してください。実際には

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

deleteとの真のwindowリターンのほぼすべてのプロパティを、実行することで分かるように、 about:blankで次のスクリプト:

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

しかし、windowのほとんどのプロパティを行います実際には削除されません。戻り値deleteの真の意味は何ですか?なぜそれは削除されないプロパティのためにtrueを返しますか?その後、

+0

その行は私のためにかなりの名前を出力し、jQueryを無効にしたので、私はそう言いませんでした。意図したとおりに動作しているようです。 –

+0

'Delete Window'などの例を試しましたか? – Randomblue

答えて

8

ウィンドウはhost objectであり、そのセマンティクスはホスト環境によって定義されます。ブラウザ。 deleteをホストオブジェクトのプロパティに適用すると、ネイティブオブジェクトに適用した場合よりも複雑になります。

ホストオブジェクトは、このドキュメントに記載されている特定のホストオブジェクトの制限と一致する限り、実装に依存する動作でこれらの内部プロパティをサポートできます。

Section 11.4.1 - The delete operator

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

を言うホストオブジェクトは、プロパティの削除や変更をサポートしていませんときに、それは削除するふりを解決できない参照または参照を返します。どちらの方法でも、非厳密モードではtrueが返されます。

1

、あなたのプログラムの中で、低レベルのオブジェクトに作用している、属性が実際に削除されることができることを考えると:

(私はdeleteの動作を説明するクロムコードへの参照に興味がある注意してください。)すぐに再追加されましたが、私はあなたがこの振る舞いについてどのようにテストできるか分かりません。

1

このMDNページでは、最初の使用例としてdelete objectが含まれていない構文を指定しています。 2番目の例のように、構文delete object[property]を指定します。しかし、DOM(ホスト)オブジェクトで何が起こるかは指定されていません。 this article for more informationを参照してください。

0

基本的に、ブラウザはテスト時にブラウザの実行環境を保護しています。

むかしむかし、ケースされていない可能性があります、しかし、これまでのテストが行​​くように、これはWindowsのコマンドシェルを開き、実行することができない理由を尋ねるに似ている:

> cd/
> deltree *.* 

環境を実際に実行し続け、その後、ブラウザ全体を停止せず、潜在的にOSのインスタンスを停止させることが期待されるときには、あなたが現在実行しているか、または基本的にリアルタイムで自分自身を消去するように頼むときに他の楽しいエラーが発生する可能性がありますが、現在GPU /サウンドカード/入力デバイスに低レベルでアクセスしています。

削除すると、varを削除しようとすると失敗します。グローバルプロパティの面では、ブラウザは機能する必要があり、そのほとんどはプロパティ(例:window.location)のように定義されていますが、低レベルで行われます(つまり、アクセス権がありません)。だから理論的には、それらは削除可能なオブジェクトです。しかし、彼らは保護されているのでできませんが、deleteの予想される動作が変更されるため、返信文はdeleteに変更されません。

ので:ブラウザで使用

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

javascriptの実装は、常にルールを曲げてきました。 javascript DOM APIの一部は、純粋なjavascriptでは使用できません。たとえば、イベントをトリガーするdom innerHTML = "something"などです。これはEcmaScript5で修正されましたが、ブラウザオブジェクトモデルは100%正当なJavaScriptに頼ることはできません。 AFAIK、あなたがDOMとBOMに足を入れない限り、あなたはecmascript標準に完全に頼ることができます。

関連する問題