七大基本判断问题,你都get到了吗

news2024/11/18 20:22:25
  • Hello,这里是mouche,当然你也可以叫我某车,反正大家都爱这么叫😁
  • 最近看到一些判断就想记下来,这一篇算附带自己的思考和整理的整理型的博客吧,接下去如果有想到新的也会在这一篇进行整理
  • 如果有错误的可以在评论区提醒我,互相学习😊

 

 前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

一、判断属性来源于对象本身还是原型链

思路:先判断属性是否在对象上,然后再判断是否在其本身上

👉使用in操作符 + obj.hasOwnProperty

  • in操作符: 会在通过对象能够访问给定属性时返回true,无论该属性存在于对象本身还是其原型链上

  • hasOwnProperty: 会返回一个布尔值,指示对象自身属性中是否具有指定的属性

  • 使用:返回true则说明在原型链上

   function isPropertyFromPrototype(obj, prop) {
     //属性在对象本身或原型链上,但是不在对象本身-----属性在原型链上
     return (prop in obj) && ! obj.hasOwnProperty(prop)
   }
  • 测试:
function test() {
  this.name = '某车';
  this.said = '想工作';
}
test.prototype.expect = '前端';
const obj = new test()
console.log(isPropertyFromPrototype(obj, 'name'));  //对象本身
console.log(isPropertyFromPrototype(obj, 'expect')); //原型链上

image.png

👉使用for..in + obj.hasOwnProperty

  • 这里涉及遍历对象属性的五大方法,来自阮一峰老师的ES6入门
  • for...in:循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。
  • Object.keys:返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名
  • Object.getOwnPropertyNames:返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名
  • Object.getOwnPropertySymbols:返回一个数组,包含对象自身的所有 Symbol 属性的键名
  • Reflect.ownKeys:返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举
  • for...in会遍历自身和原型链上的,辣么也是一样的道理,就遍历对象的属性,然后依次判断是否在对象本身上
  • 使用: 遍历对象,如果有该属性即判断是否来源其本身,来源其本身则返回false
function isPropertyFromPrototype(obj, prop) {
  for(let i in obj) {
    if(i === prop) return !obj.hasOwnProperty(prop)
  }
}
  • 测试: 测试代码如上,打印输出如下

image.png

二、对象判空方法

  • 这个要结合上面的五大方法,同时你也会发现Symbol在这个过程中是个怪烦人的存在(Bushi

🤜for..in

  • 上面已经说过它可以循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)
  • 如果能够进入for..in循环则说明对象不为空(不考虑symbol属性)
    • 初步使用
    const isEmpty = function(obj){
      for(let i in obj){
        return false
      }
      return true
    }
    
    • 测试
    const objEmpty = {}  //空对象
    function test() {}
    test.prototype.except = '前端'; 
    const obj = new test(); //有原型属性的对象
    const objSym = {};
    const sym = Symbol.for('symbol属性')
    objSym[sym] = 'symbol属性' //有symbol属性的对象
    
    console.log(isEmpty(objEmpty)) //空对象---true
    console.log(isEmpty(obj)) //有原型属性的对象 -- false
    console.log(isEmpty(objSym)) //有symbol属性的对象 -- true --- 显然不怎么合我们意
    
  • 那么如果考虑symbol属性的话--上面Object.getOwnPropertySymbols说了可以返回一个数组,包含对象自身的所有 Symbol 属性的键名,那么结合一下即可、
    • 使用:
    const isEmpty = function(obj){
       //长度不为0则说明含有Symbol属性,直接返回false
      if(Object.getOwnPropertySymbols(obj).length != 0) return false 
      for(let i in obj){
        return false
      }
      return true
    }
    
    • 测试(和上面一样的代码)

      image.png

🤜JSON.stringify

  • 使用:
const isEmpty = function(obj) {
  return JSON.stringify(obj) === '{}'
}
  • 测试(和上面一样代码)

image.png

  • 你看着true,true,true,就知道问题大啦😬
  • JSON.stringify算是这一系列缺陷最大的吧,本来人家也只是一个序列化的方法。不愿再爱(开发中因为不够了解然后踩坑的我😵‍💫)
  • undefined函数Symbol作为属性值,以symbol为属性键 的时候经过JSON.stringify()转换后会丢失, 也就是说他们会被忽略,虽然它也不仅这点问题。。。🤯
const symKey = Symbol.for('symbol属性')
const test = {
  objMethod: function(){
    console.log('属性值为方法')
  },
  objUndefined: undefined,
  objSym: Symbol.for('属性值为symbol')
}
test[symKey] = '键为symbol'
console.log(JSON.stringify(test))

image.png

🤜Object.keys()

  • 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名
  • so,和for...in...一样不含Symbol属性
const isEmpty = function(obj) {
  return Object.keys(obj).length === 0 && Object.getOwnPropertySymbols(obj).length === 0
}

还有Object.getOwnPropertyNames()Object.prototype.hasOwnProperty.call(obj, prop)我觉得都差不多,就不多列举了

说是这样说,但是具体还是得看你所需要的到底是需要怎么个“”法再对症下药🥸

三、判断数组成员

🙌indexof

  • indexOf(): 返回在数组中可以找到给定元素的第一个索引,如果不存在,则返回 -1
  • 语法:indexOf(searchElement, fromIndex)
    • searchElement: 寻找的元素
    • fromIndex:开始寻找的下标
  • indexOf 使用全等运算(===)

最近我遇到它的场所应该是在数组去重

🙌includes

  • includes(): 用来判断一个数组(也可以是类数组)是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回 false
  • 语法和indexof一样
  • includes() 使用零值相等
  • 拓展:Map里面判断键是否相等也是用的零值相等
  • 零值相等: 跟===的区别为对于===而言NaN !== NaN, 而对于零值运算而言两者是相等

🙌find

  • find():返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined
  • 语法:find(function(element, index, array) { /* … */ }, thisArg)
    • element: 当前遍历到的元素
    • index: 当前遍历到的索引
    • array:数组本身
    • thisArg: 执行回调时用作this的对象
    • 回调函数必须返回一个真值

🙌findIndex

  • findIndex(): 返回数组中满足提供的测试函数的第一个元素的索引。若没有找到对应元素则返回-1
  • 其他跟find差不多

🙌some

  • some(): 测试数组中是不是至少有 1 个元素通过了被提供的函数测试。它返回的是一个 Boolean 类型的值

🙌every

  • every(): 测试一个数组内的所有元素是否都能通过某个指定函数的测试。它返回一个布尔值

这些根据需求然后选择就好了,用法都差不多长一个样,忘了咋用的可以查查MDN

四、类型判断

这个已经算是最经典的问题了吧,

🤝typeof

  • 能够判断基本类型(除了null),引用类型除了function返回function类型之外其他都返回object
  • NaN的数据类型为number
  • null的数据类型为Object(转换为二进制后前三位都是000)

    image.png

注意都是小写开头

🤝instancof

  • instanceof 是用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上
  • 只能判断引用类型
  • 具体实现可以看:instanceof的实现

🤝construtor

  • constructor属性返回Object的构造函数的引用

    image.png

  • 不能判断undefinednull,并且使用它是不安全的,因为contructor的指向是可以改变的

🤝Array.prototype.toString.call()

  • 咧个嘞就是最好的方案了,啥都能咔咔咔一顿判断
  • toString() 返回 "[object type]",其中 type 是对象的类型

    image.png

  • 可以使用Array.prototype.toString.call().slice(8,-1)

    image.png

五、判断是否为数组

除了上面的instanceof,construtor,Array.prototype.toString.call()之外

🙏 Array.isArray

  • Array.isArray() 用于确定传递的值是否是一个 Array
    • 图源MDN(我不会说是我懒得写了)

      image.png

  • 最好用的方法是 Array.isArray,只是不支持 IE8 及以下。
  • 如果要考虑兼容性,则可以使用 Object.prototype.toString
  • so,看到的比较好的一种写法(underscore.js
(obj) => return Array.isArray ? Array.isArray(obj) : Object.prototype.toString.call(obj) === '[object Array]';

六、判断是否为数字

除了上述的方法之外

✍Number.isFinite()

  • Number.isFinite(): 用来检测传入的参数是否是一个有穷数, 只有数值类型的值,且是有穷的,才返回 true
  • 对于NaNInfinity-Infinity的数字,它返回false

    image.png

个人感觉是比较符合平时业务的需求的

✍正则表达式

  • 正则表达式则更加灵活了,可以判断整数呀,正数呀,反正就是能咔咔咔一顿改满足需求
var reg=/^[-\\+]?([0-9]+\\.?)?[0-9]+$/; 

七、判断是否是通过new运算符

你可以使用寻找原型链的方法去判断(像instanceof呀,constructor呀),但是不够准确,new.target是目前最适合的方法了吧

//例如这种场景
var p = new Person('mouche','某车'); // 先new一个对象
p.fn = Person; // 把函数/类 Person 赋值给自身对象p的fn属性
p.fn(); // 这句调用时会把它判断为new调用

💪new.target

  • new.target返回一个指向构造方法或函数的引用。在普通的函数调用中,new.target 的值是undefined

这个最近的运用场景是在手写bind函数里面,需要判断是否使用了new: bind的实现

 

前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/956144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

圆圈加数字的css

方式一 .circle { width: 50px; height: 50px; border-radius: 50%; background-color: #f00; color: #fff; text-align: center; line-height: 50px; } .circle::before { content: attr(data-number); display: block; } <div class"circle" data-number"…

Hibernate(Spring Data)抓取策略

文章目录 示例代码放到最后&#xff0c;使用的是Springboot 项目1. 简介2. Hibernate抓取策略分类2.1 即时加载&#xff08;Eager Loading&#xff09;2.2 延迟加载&#xff08;Lazy Loading&#xff09;2.3 子查询加载&#xff08;Subselect Loading&#xff09;2.4 基于批处理…

【100天精通python】Day48:python Web开发_WSGI接口与使用

目录 1 WSGI接口 1.1 CGI 简介 1.2 WSGI 简介 1.3 定义 WSGI 接口 1.3.1 应用程序&#xff08;Application&#xff09; 1.3.2 服务器&#xff08;Server&#xff09; 1.4 WSGI 接口的使用示例 1.5 WSGI接口的优势 1 WSGI接口 上一节实现了静态服务器&#xff0c;但是当…

Cell子刊:肠道菌菌株之间的“明争暗斗”

抗生素耐药性质粒可以在肠道中不同肠杆菌科之间传播。本期经典文献解读&#xff0c;为大家带来发表在Cell Host and Microbe上的研究成果&#xff0c;探索具有相似营养需求的肠杆菌科沙门氏菌群如何在同一肠道中共同繁殖及质粒转移。 期刊&#xff1a;Cell Host Microbe …

八、MySQL(DML)如何修改表中的数据?

1、修改表数据 &#xff08;1&#xff09;基础语法&#xff1a; update 表名 SET 字段名1数值1,字段名2数值2&#xff0c;…… [where 条件]; &#xff08;2&#xff09; 操作实例&#xff1a; 第一步&#xff1a; 先准备一张表 insert into things values (10086,18,0x12…

spark支持深度学习批量推理

背景 在数据量较大的业务场景中&#xff0c;spark在数据处理、传统机器学习训练、 深度学习相关业务&#xff0c;能取得较明显的效率提升。 本篇围绕spark大数据背景下的推理&#xff0c;介绍一些优雅的使用方式。 spark适用场景 大数据量自定义方法处理、类sql处理传统机器…

掌握Kubernetes API:释放容器编排的潜力

Kubernetes API使用 1、 API是什么&#xff1f; API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;&#xff1a; 是一些预先定义的接口&#xff08;如函数、HTTP接口&#xff09;&#xff0c;或指软件系统不同组成部分衔接的约定。 用来…

分类算法系列③:模型选择与调优 (Facebook签到位置预测)

目录 模型选择与调优 1、介绍 模型选择&#xff08;Model Selection&#xff09;&#xff1a; 调优&#xff08;Hyperparameter Tuning&#xff09;&#xff1a; 本章重点 2、交叉验证 介绍 为什么需要交叉验证 数据处理 3、⭐超参数搜索-网格搜索(Grid Search) 介绍…

合宙Air724UG LuatOS-Air LVGL API控件--图表 (Chart)

图表 (Chart) 一幅图胜过一千个字&#xff0c;通过图表展示出的数据内容能让用户更快速有效的了解数据特征。 代码示例 – 创建图表 chart lvgl.chart_create(lvgl.scr_act(), nil) lvgl.obj_set_size(chart, 200, 150) lvgl.obj_align(chart, nil, lvgl.ALIGN_CENTER, 0, …

聊聊Http服务化改造实践

在微服务架构体系中远程RPC调用主要包括Dubbo与Http调用两个大类&#xff0c;由于Dubbo拥有服务注册中心&#xff0c;并且起服务的命名非常规范&#xff0c;使用包名.类名.方法名进行描述。 而http调用通常都是使用httpclient等相关类库&#xff0c;这些在使用上并没有问题&am…

常见问题。

警告&#xff1a;There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene. 解决&#xff1a;两个摄像机两个audio listeners组件&#xff0c;禁用一个就好了。 错误&#xff1a;Scene ‘xxxxx’ couldn’t be loa…

在 Amazon 搭建无代码可视化的数据分析和建模平台

现代企业常常会有利用数据分析和机器学习帮助解决业务痛点的需求。如制造业中&#xff0c;利用设备采集上来的数据做预测性维护&#xff0c;质量控制&#xff1b;在零售业中&#xff0c;利用客户端端采集的数据做渠道转化率分析&#xff0c;个性化推荐等。 亚马逊云科技开发者…

能直接运营的发接任务平台小程序搭建开发演示

有个项目估计做过互联网的小伙伴都听说过——发接任务平台。 基本每年都有发接任务平台关站&#xff0c;但又有新的平台出来&#xff0c;往复循环&#xff0c;无比热闹。这在互联网圈不常见&#xff0c;互联网项目很多都是风头过去了就结束了&#xff0c;但发接任务年年似乎都…

HTML 播放器效果

效果图 实现代码 <!DOCTYPE HTML> <html><head><title>爱看动漫社区 | 首页 </title><link href"css/bootstrap.css" relstylesheet typetext/css /><!-- jQuery --><script src"js/jquery-1.11.0.min.js"…

进程间通信-Binder

Binder Binder框架概述服务端Binder驱动客户端 设计服务端和客户端设计服务端客户端设计 Binder与ServiceServiceAIDL 保证包裹内参数顺序IMusicPlayerServiceProxyStub 系统服务中的Binder对象ServiceManger管理的服务理解Manger功能快捷键合理的创建标题&#xff0c;有助于目…

19 Linux之Python定制篇-apt软件管理和远程登录

19 Linux之Python定制篇-apt软件管理和远程登录 文章目录 19 Linux之Python定制篇-apt软件管理和远程登录19.1 apt软件管理19.1.1 apt介绍19.1.2 更新软件下载地址-阿里源19.1.3 使用apt完成安装和卸载vim 19.2 远程登录Ubuntu 学习视频来自于B站【小白入门 通俗易懂】2021韩顺…

两个pdf文件合并为一个怎么操作?分享pdf合并操作步骤

不管是初入职场的小白&#xff0c;还是久经职场的高手&#xff0c;都必须深入了解pdf&#xff0c;特别是关于pdf的各种操作&#xff0c;如编辑、合并、压缩等操作&#xff0c;其中合并是这么多操作里面必需懂的技能之一&#xff0c;但是很多人还是不知道两个pdf文件合并为一个怎…

基于材料生成算法优化的BP神经网络(预测应用) - 附代码

基于材料生成算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于材料生成算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.材料生成优化BP神经网络2.1 BP神经网络参数设置2.2 材料生成算法应用 4.测试结果&#xff1a;5…

【Tkinter系列09/15】小部件(Scrollbar

22. 小部件Scrollbar 许多小部件&#xff08;如列表框和画布&#xff09;可以 就像将窗口滑动到更大的虚拟区域一样。你 可以将滚动条小部件连接到它们&#xff0c;为用户提供 相对于内容滑动视图的方式。 下面是带有关联条目小部件的屏幕截图 滚动条小部件&#xff1a; 滚动条…

CSS学习笔记03

CSS笔记03 盒子模型 什么是盒子模型 概念&#xff1a; CSS 盒子模型就是在网页设计中经常用到的一种思维模型&#xff0c;是 CSS 布局的基石&#xff0c;主要规定了元素是如何显示的以及元素间的相互关系。定义所有元素都可以有像盒子一样的平面空间和外形。包含内容区、内边…