javascriptはどのように変数が配列であるかを判断しますか?
1386 ワード
以前はstrongで大神に会いに行きましたが、どのように変数が配列であるかを判断しますか?少なくとも3つの方法を使います.
前端大全からの記事参照リンクはここにあります.
isAray()
この方法は一番簡単な方法です.
typeof()
配列は特殊なオブジェクトなので、配列のtypeofはobjectとなります.しかし、nullのtypeofも結局はobjectです.だからtypeofを使うなら書かなければなりません.
ウェブページまたはグローバルスコープにとって.この方法は有効です.
では
特性チェック
一番頼りになる方法は?
前端大全からの記事参照リンクはここにあります.
isAray()
この方法は一番簡単な方法です.
if(Array.isArray(value)){}
しかし、この方法はIE 9以下のブラウザではサポートされていません.typeof()
配列は特殊なオブジェクトなので、配列のtypeofはobjectとなります.しかし、nullのtypeofも結局はobjectです.だからtypeofを使うなら書かなければなりません.
var a = [1,2,3];
// object null
console.log(
(typeof a === 'object' && a !== null && Object.prototype.toString.call(a) !== '[object Object]')); //true
instance of()ウェブページまたはグローバルスコープにとって.この方法は有効です.
if(a instanceof Array){//...}
しかし、このページにframeがはまったらとりあえずa.htmlといいます.このframeではwindow.a=[1,3,5]を定義しています.では
window.onload = function(){
var a = window.frames[0].a;
console.log(a instanceof Array); //false
console.log(a.constructor === Array); //false
}
これは各frameには自分の実行環境があり、frameにまたがって実装されたオブジェクトは互いにプロトタイプチェーンを共有しないからです.a instance of window.frames[0].Arayを印刷すれば、結果はtrueです.特性チェック
var b = [3,4,5];
if(b.sort){//.....}
このように、ある対象がソトに値するキーを持っていると、問題があります.たとえば:var b = {sort:'aaa'};
これでb.sortもtrueですので、使えません.一番頼りになる方法は?
Object.prototype.toString.call(value)
この方法の原理は、各オブジェクトにはクラスという内部属性があり、またコールに合わせて、どのオブジェクトの内部属性も取得できます.そして、タイプ検出を文字列出力に変換します.