目录
目录
使用Object.prototype.toString.call()判断
使用typeof判断
- 第一种方式typeof,这种方式对于非object类型可以判断但是不够细分,但是有一些特殊的比如正则表达式,null也被判断为object(这是JavaScript之前一直遗留的问题),包括Array也是object,因此使用typeof可以粗略的判断数据类型,但是不够精确
console.log(typeof 1);//number
console.log(typeof "1");//string
console.log(typeof 123n);//bigint
console.log(typeof true);//boolean
console.log(typeof function () { });//function
console.log(typeof Symbol());//symbol
console.log(typeof undefined);//undefined
// ---------------------
console.log(typeof {});//object
console.log(typeof /a/);//object
console.log(typeof new Date);//object
console.log(typeof new Set);//object
console.log(typeof null);//object
使用Object.prototype.toString.call()判断
采用这种方式可以很好的来区分各种类型:
console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call({}));//[object Object]
console.log(Object.prototype.toString.call(/a/));//[object RegExp]
console.log(Object.prototype.toString.call(new Date));//[object Date]
console.log(Object.prototype.toString.call(new Set));//[object Set]
console.log(Object.prototype.toString.call(null));//[object Null]
由此可见,使用这种方法可以细致的将object中的不同类型分出来
那么我们为什么不直接去调用toString方法,而是要在Object上调用toString方法呢?
那是因为像Array,function这些作为Object的实例,他们都重写了toString方法。,重写之后的方法就变成了返回这个对象的字符串,而不是像Object上的toString方法是返回对象类型
蓝桥杯真题
数据类型检测
介绍
在前端开发中,js 有各种各样的数据类型,数据类型检测是每个开发者都必须掌握基础知识。数据类型检测的方法也有很多种,本题将封装一个通用的数据类型检测函数。
准备
本题已经内置了初始代码,打开实验环境,目录结构如下:
.
└── main.js
其中:
main.js
是待补充代码的 js 文件。
在 main.js
文件中封装好方法以后,可以尝试在该文件中手动调用已经封装好的方法,通过命令 node main.js
来执行文件,打印对应的日志。
目标
完善 main.js
中 getType
函数中的 TODO 部分,返回传入值的对应数据类型。
传入值以及 getType
函数返回值(大小写可忽略)按照如下方式对应:
传入值 | 返回值 |
---|---|
's' | string |
0 | number |
false | boolean |
undefined | undefined |
Symbol() | symbol |
function fn(){} | function |
123n | bigint |
null | null |
{} | object |
[] | array |
new Date | date |
new Map | map |
new Set | set |
/a/ | regexp |
测试用例
// 示例
const testArr = [
"s",
0,
false,
undefined,
Symbol(),
function () {},
123n,
null,
{},
[],
new Date(),
new Map(),
new Set(),
/a/,
];
const result = testArr.map((item) => getType(item));
console.log("得到的结果:", result);
/*
得到的结果:
[
'string', 'number',
'boolean', 'undefined',
'symbol', 'function',
'bigint', 'null',
'object', 'array',
'date', 'map',
'set', 'regExp'
]
*/
规定
- 请勿修改文件路径,文件名,对象名和函数名。
- 只能在规定区域进行代码编写。
判分标准
- 本题完全实现题目目标得满分,否则得 0 分。
/**
* @description: 数据类型检测
* @param {*} data 传入的待检测数据
* @return {*} 返回数据类型
*/
function getType(data) {
// TODO:待补充代码
// if (typeof data != "object") return typeof data;
// if (!data) return "null";
// return data.__proto__.constructor
// .toString()
// .split(" ")[1]
// .replace("()", "")
// .toLowerCase();
}
module.exports = {
getType
}
使用 Object.prototype.toString.call()这种方法来判断
let str = reg.exec(Object.prototype.toString.call(data))[1]
// [object Null]获取的数据都是这种类型的,我们只要Null这一部分,而且开头字母为小写
let reg = /\[object (.+)\]/gi //使用正则表达式来处理数据
str = str.replace(str[0], str[0].toLowerCase())
使用typeof这种方法来判断,逻辑性强一点
// TODO:待补充代码
if (typeof data != "object") return typeof data;
//首先判断是否是object类型,如果不是,就直接返回
if (!data) return "null";//判断是否是null类型
//利用构造函数判断,并且对数据进行处理
return data.__proto__.constructor
.toString()
.split(" ")[1]
.replace("()", "")
.toLowerCase();
这两种方法哪一种都行
以上就是全部内容,如果觉得有用,麻烦点赞收藏