摘要:和這三種基本的數(shù)據(jù)類型,都有對(duì)應(yīng)的引用包裝類型和。應(yīng)用于引用類型的判斷,所以對(duì)于這三類基本類型沒有什么意義。
JS 中的類型判斷 js中的數(shù)據(jù)類型
基本數(shù)據(jù)類型
undefined、number、string、boolean
引用數(shù)據(jù)類型
null、Object、Number、String、Boolean、Function、Array、Date、RegExp、Error、Arguments
typeoftypeof操作符可能返回下面幾種字符串
"undefined" 如果這個(gè)值未定義
"boolean" 如果這個(gè)值是布爾值
"string" 如果這個(gè)值是字符串
"number" 如果這個(gè)值是數(shù)值,注意其中NaN 返回的也是"number"
"function" 如果這個(gè)值是函數(shù)
"object" 如果這個(gè)值是對(duì)象或者是null
undefined boolean string number 都是基本的數(shù)據(jù)類型
function 和 object是引用類型,變量指向的是對(duì)象的地址,
對(duì)于引用類型的變量,typeof只可以區(qū)分出function,其他類型的統(tǒng)一識(shí)別成object。
boolean string 和number這三種基本的數(shù)據(jù)類型,都有對(duì)應(yīng)的引用包裝類型
Boolean String 和Number。
對(duì)于這些包裝類型的變量,typeof統(tǒng)一識(shí)別成object
var a = new String("hello"); typeof a // object var b = "hello"; a === b // false a ==b //true a 實(shí)際變成了一個(gè)String類型的引用變量 所以a === b 是false,但是用== 比較的時(shí)候 b隱式調(diào)用了toString的方法 所以是true
多說一句,其實(shí)我們?cè)谡{(diào)用基本類型的方法的時(shí)候,都是隱式的轉(zhuǎn)為包裝對(duì)象以后才能調(diào)用。
instanceof 應(yīng)用于引用類型的判斷,所以對(duì)于string number boolean 這三類基本類型沒有什么意義。
instanceof 支持繼承 因?yàn)樗械囊妙愋投祭^承自O(shè)bject,所以所有引用變量都是Object的實(shí)例
var a = new String("hello"); a instanceof String //true a instanceof Object //true var b = "hello"; b instanceof String // false
我開始以為instanceof是通過判斷a的__proto__ 上的constructor 屬性來判斷構(gòu)造函數(shù)的類型,但是改變a.__proto__.constructor = Number 之后
a instanceof String 仍然為true
var a = new String("hello"); a.__proto__.constructor = Number; a instanceof String //true a instanceof Number //falseObject.prototype.toString.call()
這個(gè)是通過調(diào)用Object原型上的toString方法來判斷變量的類型
這個(gè)方法不會(huì)區(qū)分是基本類型還是包裝的引用類型,其實(shí)大多數(shù)情況下我們真不不需要區(qū)分。
var a = new String("hello") var b = "hello"; Object.prototype.toString.call(a) //"[object String]" Object.prototype.toString.call(b) //"[object String]"
該方法還能夠區(qū)分null和undefined
Object.prototype.toString.call(null) //"[object Null]" Object.prototype.toString.call(undefined) //"[object Undefined]"
所以判斷數(shù)據(jù)類型最靠譜的方法就是這個(gè)了。
underscore 中的實(shí)現(xiàn)//代碼中的toString 方法 就是Object.prototype.toString // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError. _.each(["Arguments","Function", "String", "Number", "Date", "RegExp", "Error"], function(name) { _["is" + name] = function(obj) { return toString.call(obj) === "[object " + name + "]"; }; }); _.isBoolean = function(obj) { return obj === true || obj === false || toString.call(obj) === "[object Boolean]"; }; 雖然這個(gè)方法很好但是沒有辦法區(qū)分基本類型和引用類型,采用typeof可以判斷: // 判斷是否是引用類型 _.isObject = function(obj) { var type = typeof obj; return type === "function" || type === "object" && !!obj; }; //通過instanceof Object 應(yīng)該也可以判斷 是不是引用類型 并且不是null和undefined // 判斷是否為數(shù)組 _.isArray = nativeIsArray || function(obj) { return toString.call(obj) === "[object Array]"; }; //nativeIsArray 是ES5原生的Array.isArray //判斷是否是NaN,利用NaN是唯一一個(gè)不等于自己的Number類型 _.isNaN = function(obj) { return _.isNumber(obj) && obj !== +obj; }; _.isUndefined = function(obj) { return obj === void 0; }; _.isNull = function(obj) { return obj === null; }; _.isFinite = function(obj) { return isFinite(obj) && !isNaN(parseFloat(obj)); }; //在 IE < 9 下對(duì) arguments 調(diào)用 Object.prototype.toString.call,結(jié)果是 [object Object],所以利用他的callee屬性來判斷 if (!_.isArguments(arguments)) { _.isArguments = function(obj) { return _.has(obj, "callee"); }; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80891.html
摘要:定義運(yùn)算符用來判斷一個(gè)構(gòu)造函數(shù)的屬性所指向的對(duì)象是否存在另外一個(gè)要檢測(cè)對(duì)象的原型鏈上,用于引用類型。但其實(shí),實(shí)例的來自于構(gòu)造函數(shù)的。 一、關(guān)于css 樣式優(yōu)先級(jí): 行內(nèi)樣式>id選擇器樣式>類選擇器樣式>標(biāo)簽選擇器樣式>通配符選擇器的樣式>繼承樣式>默認(rèn)樣式 二、關(guān)于js 關(guān)于問題:**JavaScript中的所有事物都是對(duì)象??** 從typeof和instanceo...
摘要:摘要這篇文章講述運(yùn)算符判斷基本類型和引用類型的區(qū)別,以及怎么判斷數(shù)組類型和空對(duì)象有種原始類型,即和。類型判斷類型判斷,一般就是判斷是否是數(shù)組,是否是空對(duì)象。方法四使用語法,返回一個(gè)數(shù)組,只需要判斷數(shù)組長(zhǎng)度是否大于即可。 摘要 這篇文章講述typeof運(yùn)算符判斷基本類型和引用類型的區(qū)別,以及怎么判斷數(shù)組類型和空對(duì)象 typeof ECMAScript 有 5 種原始類型(primitiv...
摘要:所以我們又可以得出一個(gè)結(jié)論原型的屬性指向構(gòu)造函數(shù),構(gòu)造函數(shù)又通過屬性指回原型,但是并不是所有函數(shù)都具有這個(gè)屬性,就沒有這個(gè)屬性。 1.原始類型 boolean number string null undefined symbol原始類型儲(chǔ)存的都是值,是沒有函數(shù)可以調(diào)用的,undefined.toString() 顯示報(bào)錯(cuò),但是1.toString() // 1 ; 是因?yàn)?被強(qiáng)制轉(zhuǎn)...
摘要:如果項(xiàng)目中需要頻繁的進(jìn)行數(shù)據(jù)類型的判斷與獲取可以考慮進(jìn)行封裝,簡(jiǎn)單的處理與已足夠。 前言 在js中數(shù)據(jù)我們經(jīng)常需要判斷或者獲取數(shù)據(jù)類型,大部分時(shí)候我們都是通過type加instanceof來組合判斷數(shù)據(jù)類型來實(shí)現(xiàn),大部分代碼中對(duì)于數(shù)據(jù)類型的獲取處理都比較丑陋,前段時(shí)間看了一下Q的源代碼中對(duì)數(shù)據(jù)類型的判斷與獲取處理,看起來相當(dāng)簡(jiǎn)潔也比較好用,這篇文章來進(jìn)行一下發(fā)散。 typeof 在js...
摘要:基本數(shù)據(jù)類型在中,基本數(shù)據(jù)類型有種,即數(shù)值字符串布爾值。兩個(gè)布爾值轉(zhuǎn)為數(shù)值進(jìn)行比較。對(duì)于對(duì)象和布爾值,調(diào)用它們的方法得到對(duì)應(yīng)的字符串值,然后進(jìn)行字符串相加。減法對(duì)于字符串布爾值或者,自動(dòng)調(diào)用,轉(zhuǎn)換結(jié)果若為,那么最終結(jié)果為。 這篇文章,來聊聊 JS 中的數(shù)據(jù)類型與變量。這是在學(xué)習(xí) JS 時(shí)最基礎(chǔ)的一類問題,但卻很重要。希望我的分享有幫助到你。 文章開頭,我先提幾個(gè)面試中遇到的問題: 比如...
閱讀 955·2021-11-22 13:54
閱讀 2900·2021-09-28 09:36
閱讀 3012·2019-08-30 15:55
閱讀 1974·2019-08-30 15:44
閱讀 573·2019-08-29 12:31
閱讀 2592·2019-08-28 18:18
閱讀 1232·2019-08-26 13:58
閱讀 1424·2019-08-26 13:44