在js中对数据类型进行判断(蓝桥杯web组模拟赛题目)

目录

目录

目录

 使用typeof判断

 使用Object.prototype.toString.call()判断

蓝桥杯真题

数据类型检测

介绍

准备

目标

测试用例

规定

判分标准


 使用typeof判断

  1. 第一种方式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
0number
falseboolean
undefinedundefined
Symbol()symbol
function fn(){}function
123nbigint
nullnull
{}object
[]array
new Datedate
new Mapmap
new Setset
/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'
  ]
*/

规定

  1. 请勿修改文件路径,文件名,对象名和函数名。
  2. 只能在规定区域进行代码编写

判分标准

  • 本题完全实现题目目标得满分,否则得 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();

这两种方法哪一种都行 

以上就是全部内容,如果觉得有用,麻烦点赞收藏

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古风残影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值