摘要:本文將講解我目前所知道的判斷數據類型的方法。數據類型一共有種除了之外的種屬于原始數據類型。等價于問題四的返回值是什么答案。
本文將講解我目前所知道的判斷JavaScript數據類型的方法。
JavaScript數據類型一共有7種:
Undefined
Null
Boolean
String
Symbol
Number
Object
除了Object之外的6種屬于原始數據類型。有時,我們還會細分Object的類型,比如Array,Function,Date,RegExp等。
typeoftypeof可以用來區分除了Null類型以外的原始數據類型,對象類型的可以從普通對象里面識別出函數:
typeof undefined // "undefined" typeof null // "object" typeof 1 // "number" typeof "1" // "string" typeof Symbol() // "symbol" typeof function() {} // "function" typeof {} // "object"
問題一:typeof不能識別null,如何識別null?
答案:如果想要判斷是否為null,可以直接使用===全等運算符來判斷(或者使用下面的Object.prototype.toString方法):
let a = null a === null // true
問題二:typeof作用于未定義的變量,會報錯嗎?
答案:不會報錯,返回"undefined"。
typeof randomVariable // "undefined"
問題三:typeof Number(1)的返回值是什么?
答案:"number"。注意Number和String作為普通函數調用的時候,是把參數轉化為相應的原始數據類型,也就是類似于做一個強制類型轉換的操作,而不是默認當做構造函數調用。注意和Array區分,Array(...)等價于new Array(...)。
typeof Number(1) // "number" typeof String("1") // "string" Array(1, 2, 3) // 等價于 new Array(1, 2, 3)
問題四:typeof new Number(1)的返回值是什么?
答案:"object"。
typeof new Number(1) // "object" typeof new String(1) // "object"instanceof
instanceof不能用于判斷原始數據類型的數據:
3 instanceof Number // false "3" instanceof String // false true instanceof Boolean // false
instanceof可以用來判斷對象的類型:
var date = new Date() date instanceof Date // true var number = new Number() number instanceof Number // true var string = new String() string instanceof String // true
需要注意的是,instanceof的結果并不一定是可靠的,因為在ECMAScript7規范中可以通過自定義Symbol.hasInstance方法來覆蓋默認行為。詳情參見ECMAScript7規范中的instanceof操作符。
Object.prototype.toStringObject.prototype.toString.call(undefined).slice(8, -1) // "Undefined" Object.prototype.toString.call(null).slice(8, -1) // "Null" Object.prototype.toString.call(3).slice(8, -1) // "Number" Object.prototype.toString.call(new Number(3)).slice(8, -1) // "Number" Object.prototype.toString.call(true).slice(8, -1) // "Boolean" Object.prototype.toString.call("3").slice(8, -1) // "String" Object.prototype.toString.call(Symbol()).slice(8, -1) // "Symbol"
由上面的示例可知,該方法沒有辦法區分數字類型和數字對象類型,同理還有字符串類型和字符串對象類型、布爾類型和布爾對象類型。
另外,ECMAScript7規范定義了符號Symbol.toStringTag,你可以通過這個符號自定義Object.prototype.toString方法的行為:
"use strict" var number = new Number(3) number[Symbol.toStringTag] = "Custom" Object.prototype.toString.call(number).slice(8, -1) // "Custom" function a () {} a[Symbol.toStringTag] = "Custom" Object.prototype.toString.call(a).slice(8, -1) // "Custom" var array = [] array[Symbol.toStringTag] = "Custom" Object.prototype.toString.call(array).slice(8, -1) // "Custom"
因為Object.prototype.toString方法可以通過Symbol.toStringTag屬性來覆蓋默認行為,所以使用這個方法來判斷數據類型也不一定是可靠的。
Array.isArrayArray.isArray(value)可以用來判斷value是否是數組:
Array.isArray([]) // true Array.isArray({}) // false (function () {console.log(Array.isArray(arguments))}()) // false總結
本文講解了我目前所知道的判斷JavaScript數據類型的方法,希望大家能有所收獲。如果本文有什么錯誤或者不嚴謹的地方,歡迎在評論區留言。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/98080.html
摘要:專題系列共計篇,主要研究日常開發中一些功能點的實現,比如防抖節流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點是研究專題之函數組合專題系列第十六篇,講解函數組合,并且使用柯里化和函數組合實現模式需求我們需要寫一個函數,輸入,返回。 JavaScript 專題之從零實現 jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實現一個 jQuery 的 ext...
摘要:除和外,所有的數據類型都是可以轉化為對象,而如果是對象,就肯定有構造函數。特性因為和沒有構造函數,因此不能用此方法來判斷。由于同一條原型繼承鏈上的各個對象的構造函數都不一樣,因此,此方法可以區分開繼承鏈上的各個自定義數據類型。 typeof 用法示例 var arr = []; typeof arr; //object typeof(arr); //object typeo...
摘要:比如我們今天要討論的,在當中如何判斷一個數組是數組。在數組的原型鏈上也能找到構造函數由上面的幾行代碼可以看出,使用運算符可以分辨數組和對象,可以判斷數組是數組。用判斷實例化的數組擁有一個屬性,這個屬性指向生成這個數組的方法。 如果你沒有注意過這個問題,那么這個標題應該會讓你感到困惑,判斷數據類型這么基礎的問題能有什么坑呢? 少年,你不能太天真了,我們朝夕面對的這門語言,可是JavaSc...
摘要:對于復雜類型它的每個實例都有屬性。當檢測實例時優于因為能檢測這段代碼是從的。補充以下結果,發現第三種方法也能正確判斷出。我們知道結果是那如何判斷兩個變量呢比較兩個變量,使用的即可。 Javascript中數據類型分為兩種: 簡單數據類型:Undefined, NULL, Boolean, Number, String 復雜數據類型:Object 接下來我們就來看看怎么做數據類型判別...
摘要:基本數據類型在中,基本數據類型有種,即數值字符串布爾值。兩個布爾值轉為數值進行比較。對于對象和布爾值,調用它們的方法得到對應的字符串值,然后進行字符串相加。減法對于字符串布爾值或者,自動調用,轉換結果若為,那么最終結果為。 這篇文章,來聊聊 JS 中的數據類型與變量。這是在學習 JS 時最基礎的一類問題,但卻很重要。希望我的分享有幫助到你。 文章開頭,我先提幾個面試中遇到的問題: 比如...
閱讀 2430·2021-10-11 10:57
閱讀 1279·2021-10-09 09:59
閱讀 1998·2019-08-30 15:53
閱讀 3212·2019-08-30 15:53
閱讀 1008·2019-08-30 15:45
閱讀 738·2019-08-30 15:44
閱讀 3446·2019-08-30 14:24
閱讀 954·2019-08-30 14:21