typeof
ECMAScript には、未定義、Null、Boolean、Number、String の 5 つのプリミティブ型があります。 typeof 演算子を使用して変数の型を検索できることは誰もが知っていますが、参照型変数の場合は <a href="http://www.php.cn/" wiki target="_blank">object<code><a href="http://www.php.cn/wiki/60.html" target="_blank">object</a>
,也就是说typeof只能正确识别基本类型值变量。
var a = "abc"; console.log(typeof a); // "string"var b = 123; console.log(typeof b); // "number"var c = true; console.log(typeof c); // "boolean"var d = null; console.log(typeof d); // "object"var f = undefined; console.log(typeof f); // "undefined"var g; console.log(typeof g); // "undefined"console.log(typeof x); // "undefined"
您也许会问,为什么 typeof 运算符对于 null 值会返回 "object"。这实际上是 JavaScript 最初实现中的一个错误,然后被 ECMAScript 沿用了。现在,null 被认为是对象的占位符,从而解释了这一矛盾,但从技术上来说,它仍然是原始值。
最后一个比较奇怪,typeof一个不存在的变量x
居然返回了"object"而不是"undefined"。
我们在来如下代码:
var a = function() { }; console.log(typeof a); // "function"var b = [1,2,3]; console.log(typeof b); // "object"var c = { }; console.log(typeof c); // "object"
对于数组和对象都返回"object",因此我们日常开发中一个常见需求就是如何判断变量是数组还是对象。
类型判断
类型判断,一般就是判断是否是数组,是否是空对象。这是针对这个需求,我日常用过或见过的判断方法
判断是否是数组
有数组:var a = [1,2,3,4,5];
方法一:
toString.call(a); // "[object Array]"
方法二:
a instanceof Array; //true
方法三:
a.constructor == Array; //true
第一种方法比较通用,也就是Object.prototype.toString.call(a)
的简写。
instanceof
和constructor
判断的变量,必须在当前页面声明的,比如,一个页面(父页面)有一个框架,框架中引用了一个页面(子页面),在子页面中声明了一个a,并将其赋值给父页面的一个变量,这时判断该变量,Array == object.constructor
会返回false
;
var a = [1,2,3,4,5]; console.log(toString.call(a)); // "[object Array]" console.log(a instanceof Array); //trueconsole.log(a.constructor == Array); //true
判断是否是空对象
有变量:var obj = {};
。これは、typeof が基本的な型値変数のみを正しく識別できることを意味します。
JSON.stringify(obj); // "{}"
なぜ typeof 演算子が null 値に対して「object」を返すのか疑問に思われるかもしれません。これは実際には、JavaScript
の元の実装のバグであり、その後 ECMAScript に採用されました。現在、null は オブジェクトのプレースホルダーとみなされ、この矛盾を説明していますが、技術的にはまだ元の値です。 。
最後のものは奇妙で、存在しない変数 x
の type は実際には "unknown" ではなく "object" を返します。
次のコードに到達します:
if(obj.id){ //如果属性id存在....}
配列とオブジェクトの両方に対して「オブジェクト」を返すため、日常の開発でよく必要になるのは、変数が配列であるかオブジェクトであるかを判断する方法です。
型判定
🎜型判定とは、一般的に配列か空のオブジェクトかを判定することです。この要件に対して私が毎日使ったり見たりしてきた判定方法です🎜🎜配列かどうかを判定するには🎜🎜配列があります:var a = [1,2,3,4,5];< /code>🎜 🎜方法 1: 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">function isEmptyObject(e) { var t; for (t in e) return !1; return !0 } //trueisEmptyObject(obj); //falseisEmptyObject({ "a":1, "b":2});</pre><div class="contentsignin">ログイン後にコピー</div></div>🎜 方法 2: 🎜rrreee🎜 方法 3: 🎜rrreee🎜 最初の方法はより一般的で、<code>Object.prototype.toString.call(a) の略称です。コード>。 🎜🎜 <code>instanceof
と constructor
によって判断される変数は、現在のページで宣言されている必要があります。たとえば、ページ (親ページ) には フレームワーク🎜、フレームはページ (サブページ) を参照し、サブページ内で a を宣言し、親 A に割り当てます。ページ上の変数を判定する場合、Array == object.constructor
は false
を返します 🎜rrreee🎜変数が空かどうかを判定します: var obj = {};
🎜🎜方法 1: 🎜rrreee🎜 JSON オブジェクトに変換して空の中括弧かどうかを判断します🎜🎜方法 2: 🎜rrreee🎜このメソッドは比較的単純です。ほとんどの人がそれを考えることができますが、その前提は、オブジェクトに特定の属性があることを知っていることです。 🎜🎜メソッド 3: 🎜rrreee🎜このメソッドは、jQuery の isEmptyObject() メソッドの実装です。 🎜以上がJavaScriptにおけるtypeofと型判定の解析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。