40

次のコードがあるとします。

function One() {}
One.prototype.x = undefined;

function Two() {}

var o = new One();
var t = new Two();

o.xt.xは両方とも に評価されundefinedます。どちらも false を返しますo.hasOwnProperty('x')t.hasOwnProperty('x')についても同様ですpropertyIsEnumerable。2 つの質問:

  • ox が定義され、 に設定されていることを伝える方法はありますundefinedか?
  • する理由はありますか?(2つは意味的に同等である必要がありますか?)

小さな注意点: (for propName in o) ループを実行すると、文字列の 1 つとして 'x' が生成されますが、t で実行すると生成されません。したがって、それらが内部で (少なくとも Chrome で) 表現される方法に違いがあります。

4

7 に答える 7

70

メソッドよりも少し簡単な方法は、Javascript in 演算子を使用することです

alert('x' in o); // true
alert('x' in t); // false
于 2008-12-22T10:50:09.853 に答える
8

object.hasOwnProperty(name) は、同じオブジェクト内にあるオブジェクトに対してのみ true を返し、プロトタイプ内のプロパティを含む他のすべてに対して false を返します。

function x() {
  this.another=undefined;
};

x.prototype.something=1;
x.prototype.nothing=undefined;
y = new x;

y.hasOwnProperty("something"); //false
y.hasOwnProperty("nothing"); //false
y.hasOwnProperty("another"); //true

"someting" in y; //true
"another" in y; //true

さらに、プロパティを削除する唯一の方法は、delete を使用することです。undefined に設定しても削除されません。

それを行う適切な方法は、roborgが言ったように使用することです。

更新: undefinedはプリミティブ値です。ECMAScript言語仕様セクション 4.3.2 および 4.3.9 を参照してください。

于 2008-12-22T10:57:46.497 に答える
4

ああ、そこのアンチパターン スレッドの 1 つです。

undefinedはキーワードではありません。

writeを割り当てると、定義していないvar foo = undefined;シンボルの値が割り当てられるため、取得する値は です。またはまたはを割り当てた場合、まったく同じ結果が得られますundefined"undefined"UnDeFiNeDNotFineAtAll_qwertyuiop

なぜこれがひどいのですか?何が起こっているのかについての誤った理解につながるという事実は別として、たまたまライブラリをロードしたり、書いている開発者を雇ったりするとどうなりますかvar undefined = true;

于 2008-12-22T11:24:40.187 に答える
1

このようなもの?

function isDefined(var){
   return (typeof(window[var]) == 'undefined') ? false : true;
}

また..

function isDefined(var){
   return (window.var === undefined) ? false : true;
}
于 2008-12-22T10:40:50.493 に答える
1

undefinedいいえ。変数 equal toは「定義済み」と認識されるべきではないと思います。

直接に等しいと設定するのは、キーワードundefinedを使用するのと同じように、それを削除する怠惰な方法です。deleteこれは、ガベージ コレクションが変数/プロパティに影響を与えていないことを意味していると思います。


[編集]

hasOwnPropertyandに関するコメントについてpropertyIsEnumerableは、プロトタイプのメソッド/プロパティはオブジェクト自体でも列挙可能でもありません。

Object.prototype.foo = 'something';

var o = {bar: 'anything'};
o.hasOwnProperty('foo');  //=> false
o.hasOwnProperty('bar');  //=> true

Object.prototype.hasOwnProperty('foo');  //=> true
于 2008-12-22T10:45:22.827 に答える
0

それを行う1つの方法は次のとおりです。

var definedProperties = [];
for (var prop in o) definedProperties.push(prop);

if (o.x === undefined && contains(prop, 'x')) {
    //x is defined, but set to undefined
}

wherecontainsは、配列内の要素が であるかどうかを確認するだけです'x'。これが唯一の方法ですか?

于 2008-12-22T10:39:20.060 に答える
0

One.x に時計を付けてみることもできますが、未定義になった時点でしかわかりません。

于 2008-12-22T10:39:23.743 に答える