配列であるかどうかを判断する js 関数: isArray()_javascript 手法

WBOY
リリース: 2016-05-16 18:00:03
オリジナル
1115 人が閲覧しました

今日はたまたま Alipay JS フレームワークの Base.js を学習していました。確認すると、実装は次のようになります:

コードをコピーします コードは次のとおりです:

if (配列の値インスタンス ||
(!(オブジェクトの値インスタンス) &&
(Object.prototype.toString.call((値)) == '[オブジェクト配列]') ||
値のタイプ.長さ = = '数値' &&
値のタイプ.スプライス != '未定義' &&
値のタイプ.propertyIsEnumerable != '未定義' &&
!値.propertyIsEnumerable('splice')) ) {
return 'array';
}

なんというか、カオスです。もちろん、「史上最も完成度が高い」とも言えますが、最も主流の手法を使用していますが、それらをまとめて書いているだけです。


ご存知のとおり、instanceof とコンストラクターを使用するのが最も直接的で簡単な方法です:
コードをコピー コードは次のとおりです:

var arr = [];
arr instanceof Array; // true
arr.constructor == Array; >
しかし、
異なる iframe で作成された配列はプロトタイプを共有しません

。こんな風に使えば。トラブルが始まります。したがって、フレームワークに適用したい場合、この方法は間違いなく機能しません。逆に、この問題は、Douglas Crockford の詰め込みメソッド (「JavaScript 言語のエッセンス」P61) を使用して解決できます。

var is_array = function(value) {
戻り値 &&
typeof value === 'object' &&
typeof value.length === ' number' &&
typeof value.splice === 'function' &&
!(value.propertyIsEnumerable('length'));


;もう簡単な方法はどうでしょうか?実はそれ、私たちが使っているものと同じではないでしょうか?


コードをコピー コードは次のとおりです。Object.prototype.toString.call(value) == '[object Array]'
上記の書き方はjQueryが使用しているものです。現在タオバオのkissyもこの方法を採用しています。これが現状で一番簡単で効果的な方法ではないでしょうか?個人的には、内部フレームワークを書くのが少し面倒だと感じています。ルーチンの概要、最終的な解決策:


コードをコピー コードは次のとおりです: var isArray = function( obj) {
return Object.prototype.toString.call(obj) === '[オブジェクト配列]';
}
=============


UPDATE: 2010.12.31 00:01 (出典)
タイプ判断、かっこいい。具体的には、上記と同じです:



コードをコピーします コードは次のとおりです: var is = function (obj,type) {
return (type === "Null" && obj === null) ||
(type === "Unknown" && obj === void 0 ) ||
(type === "Number" && isFinite(obj)) ||
Object.prototype.toString.call(obj).slice(8,-1) === タイプ; 🎜>}


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート