未定義の変数のチェックを少し簡単にするために、小さなヘルパー メソッドをすぐに作成しました。
Object.prototype.is = function() {
for(var i in arguments) {
if(this === arguments[i]) {
return true;
}
}
return false;
};
次のように使用するように設計されています: foo.is(undefined, false)
foo が未定義か false かをチェックします。私が使用したテストケースは次のとおりです。
var a = false;
a.is(false);
> false
少し混乱したので、もう少しいじってみました。一部の console.logging は、比較されている 2 つのオブジェクトが同じではないため、同等性チェックが失敗していることを明らかにしました。
Boolean {is: function} === false
> false
そのため、曽祖父の Object.prototype からメソッドをa
継承していましたが、比較内では継承していませんでした。is
false
オブジェクトの新しいインスタンスを確実に作成するusing を使用して継承を強制できると考えましnew Boolean(false)
た (オブジェクトのプロトタイプが拡張される前に作成されたオブジェクトへの参照で発生する可能性のあるリスクを回避できることを願っています)。結果:
Boolean {is: function} === Boolean {is: function}
> false
等価性チェックが失敗するのはなぜですか?
ここで何が起こっているのかを解明するプロセスの一環として、単一のブール値を引数として関数が呼び出された後に引数配列を調べたところ、長さが 2 であり、余分な引数が次のis
関数であることがわかりました。 Object.prototype 内で宣言されました。
a.is(false);
arguments -> [false, is: function]
それはどうやってそこに行き着いたのですか?
参考までに、このようなサルパッチは悪い考えだと私は知っています! これは製品コードではありません。興味があるだけです。