使用js编写一个函数判断所有数据类型的通用方法

文章目录

一、编写一个函数判断所有数据类型的通用方法

1、typeof

在 JavaScript 里使用 typeof 来判断数据类型,只能区分基本类型,即 "number","string","undefined","boolean","object" 五种。

对于数组、对象来说,其关系错综复杂,使用 typeof 都会统一返回 "object" 字符串。

复制代码
typeof {} //object

typeof [] //object

要想区别对象、数组单纯使用 typeof 是不行的。或者你会想到 instanceof 方法。

2、instanceof

instanceof是javaScript中的一种运算符,用于判断某个对象是否属于某个类(或其父类)的实例,

复制代码
console.log({} instanceof Object) //true

console.log([] instanceof Object) //true

console.log(function () {} instanceof Object) //true

上面代码发现都是 Object 的实例

所以要判断复合数据类型,要如下判断:

复制代码
//对象
({} instanceof Object) && !({} instanceof Function) && !({} instanceof Function)

//数组
([] instanceof Object) && ([] instanceof Array)

//函数
(function () {} instanceof Object) && (function () {} instanceof Function)

虽然 instanceof 运算符在某些情况下可以很方便地判断对象所属的类,但是在实际开发中需要注意其局限性,并结合其他方法和技巧来进行类型判断。

3、Object.prototype.toString.call()

更简便的方式,即是使用 Object.prototype.toString.call() 来确定类型。

由于 JavaScript 中一切都是对象,任何都不例外,对所有值类型应用 Object.prototype.toString.call() 方法

对于 Object.prototype.toString() 方法,会返回一个形如 "[object XXX]" 的字符串。

如果对象的 toString() 方法未被重写,就会返回如上面形式的字符串。

toString()为Object的原型方法,而Array,function等类型作为Object的实例,都重写了toString方法。不同的对象类型调用toString方法时,根据原型链的知识,调用的是对应的重写之后的toString方法。

Call是一个允许您更改另一个函数上下文的函数。

对于 Object.prototype.toString.call(arg),若参数为 null 或 undefined,直接返回结果。

若参数不为 null 或 undefined,则将参数转为对象,再作判断。

4、编写一个函数判断所有数据类型
复制代码
//编写一个函数判断所有数据类型
function _typeof(item) {
    let res = Object.prototype.toString.call(item);
    res = res.split(" ")[1];
    res = res.substr(0, res.length - 1);
    return res;
}

效果如下:

复制代码
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

二、编写一个判断两个数组是否相等的方法

1、将两个数组转成字符串比较, 但是发现他们只是顺序不相等也被当做不相等
复制代码
[1, 2, 3].toString() == [3, 2, 1].toString();
//  -- --false
2、我们可以先把数组排序按照从小到大的顺序sort() 函数
复制代码
[1, 2, 3].sort().toString() == [3, 2, 1].sort().toString();
//  -- --true

这样的就是 "1,2,3" == "1,2,3"结果是相等的

3、如果数组里的元素是标量, 非object类型, 可以使用 == 比较数组里的元素:
复制代码
scalarArrayEquals(array1, array2) {
    return array1.length == array2.length && array1.every(function (v, i) {
        return v === array2[i]
    });
}
相关推荐
暮乘白帝过重山18 小时前
Singleton和Prototype的作用域与饿汉式/懒汉式的初始化方式
spring·原型模式·prototype·饿汉式·singleton·懒汉式
矜辰所致6 天前
CAT1模块 EC800M HTTP 使用后续记录
http·数据类型·ec8000m
大小胖虎11 天前
专业课笔记——(第一章:C、C++基础知识)
c++·笔记·算法·c·数据类型·操作类型
大模型铲屎官17 天前
C#入门:从变量与数据类型开始你的游戏开发之旅
开发语言·c#·游戏开发·数据类型·变量与数据类型·unity基础·c#变量
Trouvaille ~25 天前
【Java篇】数据类型与变量:窥见程序的天地万象
java·开发语言·青少年编程·面向对象·数据类型·基础知识·入门必看
星迹日25 天前
MySQL : 数据库和表操作
数据库·mysql·数据类型··
Pandaconda1 个月前
【新人系列】Golang 入门(二):基本数据类型
开发语言·笔记·后端·golang·go·字符串·数据类型
明月看潮生2 个月前
青少年编程与数学 02-008 Pyhon语言编程基础 05课题、数据类型
开发语言·python·青少年编程·数据类型·编程与数学
zfj3212 个月前
学技术学英文:elasticsearch 的数据类型
elasticsearch·数据类型·复杂数据类型
加勒比之杰克3 个月前
【数据库初阶】MySQL数据类型
linux·数据库·mysql·数据类型·varchar