一、編寫(xiě)一個(gè)函數(shù)判斷所有數(shù)據(jù)類(lèi)型的通用方法
1、typeof
在 JavaScript 里使用 typeof 來(lái)判斷數(shù)據(jù)類(lèi)型,只能區(qū)分基本類(lèi)型,即 “number”,”string”,”undefined”,”boolean”,”object” 五種。
對(duì)于數(shù)組、對(duì)象來(lái)說(shuō),其關(guān)系錯(cuò)綜復(fù)雜,使用 typeof 都會(huì)統(tǒng)一返回 “object” 字符串。
typeof {} //object
typeof [] //object
要想?yún)^(qū)別對(duì)象、數(shù)組單純使用 typeof 是不行的。或者你會(huì)想到 instanceof 方法。
2、instanceof
instanceof是javaScript中的一種運(yùn)算符,用于判斷某個(gè)對(duì)象是否屬于某個(gè)類(lèi)(或其父類(lèi))的實(shí)例,
console.log({} instanceof Object) //true
console.log([] instanceof Object) //true
console.log(function () {} instanceof Object) //true
上面代碼發(fā)現(xiàn)都是 Object 的實(shí)例
所以要判斷復(fù)合數(shù)據(jù)類(lèi)型,要如下判斷:
//對(duì)象
({} instanceof Object) && !({} instanceof Function) && !({} instanceof Function)
//數(shù)組
([] instanceof Object) && ([] instanceof Array)
//函數(shù)
(function () {} instanceof Object) && (function () {} instanceof Function)
雖然 instanceof 運(yùn)算符在某些情況下可以很方便地判斷對(duì)象所屬的類(lèi),但是在實(shí)際開(kāi)發(fā)中需要注意其局限性,并結(jié)合其他方法和技巧來(lái)進(jìn)行類(lèi)型判斷。
3、Object.prototype.toString.call()
更簡(jiǎn)便的方式,即是使用 Object.prototype.toString.call() 來(lái)確定類(lèi)型。
由于 JavaScript 中一切都是對(duì)象,任何都不例外,對(duì)所有值類(lèi)型應(yīng)用 Object.prototype.toString.call() 方法
對(duì)于 Object.prototype.toString() 方法,會(huì)返回一個(gè)形如 “[object XXX]” 的字符串。
如果對(duì)象的 toString() 方法未被重寫(xiě),就會(huì)返回如上面形式的字符串。
toString()為Object的原型方法,而Array,function等類(lèi)型作為Object的實(shí)例,都重寫(xiě)了toString方法。不同的對(duì)象類(lèi)型調(diào)用toString方法時(shí),根據(jù)原型鏈的知識(shí),調(diào)用的是對(duì)應(yīng)的重寫(xiě)之后的toString方法。
Call是一個(gè)允許您更改另一個(gè)函數(shù)上下文的函數(shù)。
對(duì)于 Object.prototype.toString.call(arg),若參數(shù)為 null 或 undefined,直接返回結(jié)果。
若參數(shù)不為 null 或 undefined,則將參數(shù)轉(zhuǎn)為對(duì)象,再作判斷。
4、編寫(xiě)一個(gè)函數(shù)判斷所有數(shù)據(jù)類(lèi)型
//編寫(xiě)一個(gè)函數(shù)判斷所有數(shù)據(jù)類(lèi)型
function _typeof(item) {
let res = Object.prototype.toString.call(item);
res = res.split(" ")[1];
res = res.substr(0, res.length - 1);
return res;
}
效果如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-737685.html
console.log(_typeof(123));//Number
console.log(_typeof("abc"));//String
console.log(_typeof(true));//Boolean
console.log(_typeof(null));//Null
console.log(_typeof(undefined));//Undefined
var fun = function () {}
console.log(_typeof(fun));//Function
var arr = [1, 2, 3]
console.log(_typeof(arr));//Array
var obj = {
name: 'jack',
age: 20
}
console.log(_typeof(obj));//Object
二、編寫(xiě)一個(gè)判斷兩個(gè)數(shù)組是否相等的方法
1、將兩個(gè)數(shù)組轉(zhuǎn)成字符串比較, 但是發(fā)現(xiàn)他們只是順序不相等也被當(dāng)做不相等
[1, 2, 3].toString() == [3, 2, 1].toString();
// -- --false
2、我們可以先把數(shù)組排序按照從小到大的順序sort() 函數(shù)
[1, 2, 3].sort().toString() == [3, 2, 1].sort().toString();
// -- --true
這樣的就是 “1,2,3” == "1,2,3"結(jié)果是相等的文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-737685.html
3、如果數(shù)組里的元素是標(biāo)量, 非object類(lèi)型, 可以使用 == 比較數(shù)組里的元素:
scalarArrayEquals(array1, array2) {
return array1.length == array2.length && array1.every(function (v, i) {
return v === array2[i]
});
}
到了這里,關(guān)于js編寫(xiě)一個(gè)函數(shù)判斷所有數(shù)據(jù)類(lèi)型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!