0

私が参照しているコードは、この回答から来ています:

Array.prototype.getUnique = function(){
   var u = {}, a = [];
   for(var i = 0, l = this.length; i < l; ++i){
      if(u.hasOwnProperty(this[i])) {
         continue;
      }
      a.push(this[i]);
      u[this[i]] = 1;
   }
   return a;
}

hasOwnPropertyここの目的は何ですか?それを使用しないバージョンのメソッドを実行しましたが、まったく同じように機能します。

Array.prototype.getUnique = function(){
   var u = {}, a = [];
   for(var i = 0, l = this.length; i < l; ++i){
      if(u[this[i]] !== undefined) {
         continue;
      }
      a.push(this[i]);
      u[this[i]] = 1;
   }
   return a;
}
4

2 に答える 2

4

この.hasOwnProperty()テストにより、コードはプロトタイプ チェーンから継承されたプロパティを除外できます。

コード例で、配列に文字列「toString」が含まれていた場合、改訂されたコードは、その値を既に認識していると思い込んでしまいます。すべてのオブジェクトは Object プロトタイプから「toString」関数を継承します。

于 2013-05-29T18:02:53.657 に答える
3

オブジェクトにプロパティがあり、そのプロパティに値undefinedがあるか、そのプロパティを持つ祖先オブジェクトがある場合はどうなるでしょうか?

それが主な違いです。

例えば:

var a = {b:undefined};
a.b !== undefined; //false
a.hasOwnProperty("b");//true

何かを持っていないことと、未定義の値を持つ何かを自分で持っていることは、2 つの異なることです。

hasOwnProperty(name)オブジェクトに直接宣言された「name」という名前のプロパティがあるかどうかを確認します。

obj.propertyName === undefined - プロトタイプ チェーンのどこか (オブジェクト内、またはそのプロトタイプ内など) で、オブジェクトに「propertyName」という名前のプロパティがあり、そのが定義されていないかどうか、またはオブジェクトとそのチェーンにそのようなプロパティがないかどうかを確認します。

以下に、2 つの違いを示す例をいくつか示します。

var a={b:undefined};
a.hasOwnProperty(b);//true
a.b!==undefined;//false

//Create a new object, with b being the prototype
var c = Object.create(b);
c.hasOwnProperty("b");//false
c.b;//undefined;
b in c;// true
c.b!==undefined;//false
于 2013-05-29T18:02:52.097 に答える