ホームページ  >  記事  >  ウェブフロントエンド  >  Javascript はデータ型と配列型をどのように判断するのでしょうか?

Javascript はデータ型と配列型をどのように判断するのでしょうか?

高洛峰
高洛峰オリジナル
2017-01-14 10:05:231113ブラウズ

こんな基本的なことはもう記録すべきではありませんが、過去を振り返って新しいことを学びましょう~データ型から始めましょう

JS の 6 つの主要なデータ型: 数値、文字列、オブジェクト、ブール型、ヌル、未定義

文字列: 一重引用符で囲むか、「文字列」のように二重引用符で囲みます

数値: 整数と浮動小数点数はすべて数値と呼ばれます~

ブール: true と false です

未定義: 未定義、つまり、変数を作成した後ですが、値は割り当てられていません~

null: したがって、Sijiu という名前です。null は何も意味せず、何も意味しません

オブジェクト: これを説明するのは難しいです。つまり、上記5種類以外の種類です

-----上は全て浮雲、下は神です----- -- -----------------------

データ型判定 typeof

typeof はほとんどのデータ型判定を解決できます。これは単項演算であり、 a 演算値の前に、戻り値はオペランドの型を表す文字列であるため、オペランドが String 型であるかどうかを判断するには、直接 if(typeof(your value) == "string"){}

以下は、さまざまなデータ型の戻り結果です:

var a="string"; console.log(a); //string
var a=1; console.log(a); //number
var a=false; console.log(a); //boolean
var a; console.log(typeof a); //undfined
 
var a = null; console.log(typeof a); //object
var a = document; console.log(typeof a); //object
var a = []; console.log(a); //object
 
var a = function(){}; console.log(typeof a) //function 除了可以判断数据类型还可以判断function类型

最初の 4 つの型を除いて、null、オブジェクト、および配列はオブジェクト型を返すことは明らかです。

関数型の場合は、関数が返されます。 typeof(Date)、typeof(eval) などです。

それでは、これはもう 1 つの非常に一般的な問題につながりますが、その解決策は、データが配列型であるかどうかをどのように判断するかということになります。

------------------------------------------実はこれが私の目的なのです、え~---------------------------------------------- -

js 配列の型を判定するメソッドの一つ

instanceof

instanceは、その名の通り、instance、exampleなので、変数がオブジェクトのインスタンスかどうかを判定するためにinstanceofが使われます。算術式 --- typeof に最も似ています 実質的な違い

ainstanceof b?alert("true"):alert("false") // b の値は文字列ではなく、判断したいデータ型であることに注意してください、Array

など、例: Chestnut:

var a=[];
console.log(a instanceof Array) //返回true


メソッド 2 コンストラクター

は W3C 定義で定義されています。コンストラクター属性は、このオブジェクトを作成した配列関数への参照を返します

は、に対応するコンストラクター関数です返されたオブジェクト。定義は、instanceof と一致しませんが、効果は同じです

例: (instanceof Array) // は Array のインスタンスですか? true or false

(a.constructor == Array) // インスタンスに対応するコンストラクタは Array ですか? true か false

例:

function employee(name,job,born){
 this.name=name;
 this.job=job;
 this.born=born;
}
 
var bill=new employee("Bill Gates","Engineer",1985);
console.log(bill.constructor); //输出function employee(name, jobtitle, born){this.name = name; this.jobtitle = job; this.born = born;}


次に、さまざまな型を判断する方法は次のとおりです:

console.log([].constructor == Array);
console.log({}.constructor == Object);
console.log("string".constructor == String);
console.log((123).constructor == Number);
console.log(true.constructor == Boolean);


-----------------------------------------------------以下はそうではありませんオリジナル -- -----------------------------------

より厳密で普遍的な方法:

function isArray(object){
 return object && typeof object==='object' &&
   Array == object.constructor;
}


! !注:

instanceof と construcor を使用する場合、判定される配列は現在のページで宣言する必要があります。例えば、ページ(親ページ)にはフレームがあり、そのフレーム内でページ(子ページ)が参照されます。このとき、子ページ内で配列が宣言され、親ページの変数に代入されます。 Array == object.constructor; は false を返します。

理由: 1. 配列は参照アドレスの転送のみです。
2. 各ページの Array ネイティブ オブジェクトによって参照されるアドレスは異なります。サブページで宣言された配列の対応するコンストラクターは、親ページが判断し、使用される Array になります。はサブページの配列と等しくないことを覚えておいてください。そうしないと、問題を追跡するのが難しくなります。

方法 3: 特性を判断する方法

上記の方法にはすべて一定の欠陥がありますが、人々の知恵は全能であると信じなければなりません。その特性のいくつかに基づいて配列の型を判断することができます

function isArray(object){
 return object && typeof object==='object' &&
   typeof object.length==='number' &&
   typeof object.splice==='function' &&
    //判断length属性是否是可枚举的 对于数组 将得到false
   !(object.propertyIsEnumerable('length'));
}

はい、オブジェクトに属性を追加できるため、長さとスプライスは必ずしも配列である必要はありませんが、最も重要な判断要素である長さ属性を列挙することはできません。

ps: ここで propertyIsEnumerable メソッドを普及させてください:

object.propertyIsEnumerable(proName)

指定されたプロパティが列挙可能かどうかを判断します

注: proName がオブジェクト内に存在し、For...In ループを使用して網羅的に列挙できる場合、その後、propertyIsEnumerable プロパティは true を返します。 propertyIsEnumerable プロパティは、オブジェクトに指定されたプロパティがない場合、または指定されたプロパティが列挙可能でない場合に false を返します。

propertyIsEnumerable プロパティは、プロトタイプ チェーン内のオブジェクトを考慮しません。

例:

var a = new Array("apple", "banana", "cactus");
document.write(a.propertyIsEnumerable(1));

方法 4 最も簡単な方法

function isArray(o) {
 return Object.prototype.toString.call(o) === ‘[object Array]‘;
}

JavaScript がデータ型と配列型を決定する方法に関するその他の記事については、PHP 中国語 Web サイトに注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。