10

この MDN ページによると、deleteキーワードは

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

ただし、プロパティが削除されていないにもかかわらず、 をdelete返すケースが見られます。true

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

実際、で次のスクリプトを実行すると、 のほとんどすべてのプロパティがwindowtrue を返します。deleteabout:blank

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

ただし、 のほとんどのプロパティはwindow実際には削除されません。の戻り値の本当の意味は何deleteですか? true削除されないプロパティが返されるのはなぜですか?

(注: の動作を説明する Chromium コードへの参照に興味がありdeleteます。)

4

5 に答える 5

8

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

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

セクション 11.4.1 -deleteオペレーターは言う

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

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

于 2012-08-27T16:48:16.307 に答える
2

ブラウザーで使用される JavaScript の実装は、常に規則を曲げてきました。イベントをトリガーする dom innerHTML="something" など、javascript DOM API の一部は、純粋な javascript では使用できません。これは EcmaScript5 で修正されましたが、Browser Object Model が 100% 正当な JavaScript であることに依存することはできません。私の知る限り、DOM と BOM に足を踏み入れない限り、ecmascript 標準に完全に依存できます。

于 2012-09-07T11:00:42.803 に答える
1

delete objectその MDN ページでは、最初の一連の例が使用するものとして含まれていない構文を指定します。delete object[property]2番目の例が示すように、構文を指定します。ただし、DOM (ホスト) オブジェクトで何が起こるかは指定されていません。詳細については、この記事を参照してください

于 2012-08-27T16:45:21.307 に答える
1

プログラムで低レベルのオブジェクトを操作していることを考えると、実際には属性が削除され、すぐに再追加される可能性がありますが、この動作をテストする方法はわかりません。

于 2012-08-27T16:36:50.363 に答える
0

基本的に、ブラウザはテストでブラウザのランタイム環境を保護しています。

むかしむかし、そうではなかったかもしれませんが、テストに関する限り、これは Windows がコマンド シェルを開いて実行することを許可しない理由を尋ねることに似ています。

> cd /
> deltree *.*

もう。

そのようなことを実行できる正当な理由は本当にないため、その後、環境が実際に実行され続け、ブラウザ全体と、潜在的に現在使用している OS のインスタンスを停止しないことを期待している場合GPU /サウンドカード/入力デバイスへの低レベルアクセスを現在行っているときに、基本的にプログラムにリアルタイムで自分自身を消去するように要求すると、実行中、またはその他の楽しいエラーが発生する可能性があります。

var を削除しようとすると、Delete は失敗を返します。ブラウザーが機能するために必要なグローバル プロパティに関しては、それらのほとんどはプロパティのように定義されますが (つまり: window.location)、低レベルで定義されます (つまり、アクセス権がありません)。理論的には、それらは削除できるオブジェクトです。しかし、それらは保護されているのでできませんが、それによって の return ステートメントが変更されることはありませdeletedelete

そう:

function () {
    var obj = { prop : true };
    delete obj; /* fail */
    delete object.prop; /* succeed */
}
于 2012-08-27T16:49:34.580 に答える