以下の処理において変数a
と変数b
は同じ振る舞いをするように思えマス。
var a={__proto__:null}, b={}, c={};
b.__proto__=null
しかし実際の所、propertyを読み書きする速度に差が出る可能性がありマス。それは環境次第。browser次第。何とも恐ろしい話デス。
__proto__
が健在なc
が最低速かと思いきや、最速なんて事もざらにあって欲しいわけがありません。
などといったどうでもいい前置きはこの辺にして、本題の存在判定とやらの話にすり替えていきます。
let n=1e5, A=[], H={}, M=new Map;
for(;n;)M.set(H[A[--n]=n]=n);
console.time("includes");
for(n=1e6;n--;)A.includes(n);
console.timeEnd("includes");
console.time("indexOf");
for(n=1e6;n--;)A.indexOf(n);
console.timeEnd("indexOf");
console.time("void");
for(n=1e6;n--;)H[n]!==void 0;
console.timeEnd("void");
console.time("in");
for(n=1e6;n--;)n in H;
console.timeEnd("in");
console.time("hasOwnProperty");
for(n=1e6;n--;)H.hasOwnProperty(n);
console.timeEnd("hasOwnProperty");
console.time("has");
for(n=1e6;n--;)M.has(n);
console.timeEnd("has");
要素数が多ければincludes
やindexOf
はぶっちぎりで遅いです。速度関係的に以下のような感じになるかもしれません
includes == indexOf <<<< has < hasOwnProperty <<< in < void
ただし互いに等価な処理ではない点に注意。それから実行環境で結果が変わります。
ついでなのでArray
にまつわる怪談を少々。
length設定
var size=9, a=[], b=[], c=Array(size);
a.length=size;
b[size-1]=void 0;
この中で変数b
へのホドコシがぶっちぎりで高速なのです。そんな時代もありました。時は流れ現在、どうなっているかは是非ご自身でご確認下さい