3

の存在に応じて、2 つのケースで驚くほど異なる動作をする非常に単純なアルゴリズムがあり"use strict"ます。

ケース 1 :

func()宣言が厳密モード内の場合、コンソール ログプリミティブよりも

"use strict";

// strict mode is on
Object.prototype.func = function() { return this; } // do nothing with the object

console.log( (4).func() ); // 4; primitive

ケース 2 :

func()宣言が厳密モード外の場合、コンソールよりも同じ値のオブジェクトがログに記録されます

// strict mode is off
Object.prototype.func = function() { return this; } // do nothing with the object

"use strict";

console.log( (4).func() ); // Number {[[PrimitiveValue]]: 4}; object

そのような違いの源は何ですか?この変換の理由は何ですか?
厳密モードのさまざまな状態で、このような単純なアクションがどのように異なるのでしょうか?

4

2 に答える 2

3

この特定の例では、オブジェクト、関数、または配列以外のものはすべてプリミティブです。(関数と配列は技術的にはオブジェクトです。) プリミティブ値の問題は、メソッドを持つことができないことです。したがって、次のようなことはできませんでし"hello world".toUpperCase()た。一般的に言えば、プログラマーは、たとえば、大量のグローバルに利用可能な関数 ( などparseInt) よりも、作業しているオブジェクトの型に関係するメソッドを持つことを好みます。

したがって、JavaScript にはString、 、および、Number、 などのメソッドを持つ他のオブジェクトがあります。文字列または数値に対してこれらのメソッドのいずれかを呼び出すと、JavaScript は対応するオブジェクトにラップし、メソッドを呼び出してプリミティブな結果を返します。これはすべて内部で行われ、通常は心配する必要はありません。toUpperCasetoLowerCasetoString

あなたの例のように、うまくいかない場合を除いて。JavaScript の初期のバージョンではいくつかの誤りがありましたが、下位互換性のために、それらを実際に変更することはできません。1995 年に JavaScript を使用して Web サイトを作成し、その後 1997 年にルールが変更された場合、私のサイトは突然機能しなくなります。

とはいえ、これらの間違いの多くには合理的な解決策があり、追加の安全対策を選択できるとよいでしょう。古いブラウザーでは、"use strict" という孤独な文字列が表示され、無視されます。新しいブラウザではこれが表示され、ここで概説されている新しい一連のルールにオプトインします。

于 2016-05-01T19:10:18.567 に答える
0

thisボックス化されていないことは、strict モードの意図的な変更の 1 つです。これにより、JavaScript コードがプリミティブにアクセスできなくなり、単純化して JavaScript スニペットが無害であることを証明できます。また、わずかな速度の向上も伴うと思います。

詳細については、MDNを参照してください。

于 2016-05-01T19:09:14.533 に答える