0

「変数が定義されていないか、初期化されていない場合は、宣言して初期化する」ための信頼できる演算子を選択しようとしています。

例を考えてみましょう (セマンティクスはそれほど重要ではありません)。

window.test ?= 123

location.origin ||= location.protocol + "//" + location.host

これは、次の Javascript に変換されます。

var _ref;

if ((_ref = window.test) == null) {
  window.test = 123;
}

location.origin || (location.origin = location.protocol + "//" + location.host);

これを行うためのより良い方法はどれですか? 「未定義」も考慮しているため、||=オペレーターの方が信頼性が高いように思えますが、なぜCoffeeScriptは?=代わりにの使用を促進するのですか? 何か不足していますか?

4

2 に答える 2

7

JavaScript ではundefined == null1なので、 を説明しますundefined。orで||=ない場合でも、偽の値を上書きするため、通常は望ましくありません。たとえば、ゼロまたは false です。nullundefined

1 JavaScript では、==暗黙的に値を強制することがnullありundefinedます。(仕様のセクション 11.9.3の項目 2 と 3 を参照してください)。

于 2013-03-07T02:05:08.417 に答える
0

「変数が定義されていないか、初期化されていない場合は、宣言して初期化する」ための信頼できる演算子を選択しようとしています。

ECMA-262 に準拠したホストで変数を条件付きで宣言することはできません。グローバル変数はグローバル (ウィンドウ) オブジェクトのプロパティになるため、グローバル変数の存在をテストすることができます (ただし、それらがグローバル変数として作成されたのか、プロパティとして作成されたのかはわかりません)。グローバルをテストするには:

// In global scope:
var global = this;

// Wherever:
if (global.hasOwnProperty('foo')) { // throws an error in IE
  // foo is a property of the global object
} 

変数オブジェクトまたは実行コンテキスト オブジェクトにアクセスしてテストすることはできないため、ローカル変数 (関数内など) をテストすることはできません。実行できるのは、テストundefinedまたは使用try..catch(醜い) だけです。しかし、それを行う必要があるのは、非常に貧弱な設計です。

グローバル オブジェクトのプロパティを条件付きで作成することを意図している場合、上記の結果は次のようになります。

if (!global.hasOwnProperty('foo')) { // throws an error in IE
  global.foo = 'whatever';
}

ただし、プロパティに値が割り当てられているかどうかもテストする場合は、次のようにします。

if (typeof global.foo == 'undefined') { // works everywhere

上記が true を返した場合、宣言されていないか、値が割り当てられていないか、または の値が割り当てられているかのように、より適切に思われますundefined。どのような場合でも、値を割り当てたいと思うでしょう。

その値を持つ唯一の方法は、明示的に割り当てられた場合 (つまり、プロパティが存在し、値が割り当てられていることを意味します) であるため、テストnullは賢明ではないようです。

于 2013-03-07T02:46:05.537 に答える