【图解面试】JS系列 - 如何回答数据类型相关问题(上)

1. JS中的数据类型有哪些,他们的区别是什么?

  • 知识点大纲
    在这里插入图片描述

  • 语言组织(示例)

要点:数量 → 种类 → 区别

JS中的数据类型主要有 8 种,分为两大类 基础数据类型引用数据类型

基础数据类型中主要有 Number、String、Boolean、Null、Undefined、Symbol和BigInt

引用数据类型有Object,Object下又有一些内置的子类主要分为基础引用类型和集合类引用类型,基础引用类型比如基础类型包装类、Date、RegExp、单例全局对象window和Math等等,集合类引用对象有Array、Set、Map等等

两者的区别主要从三个方面体现:a. 存储方式不同 - 基础类型存放在栈内存中,引用类型存储在堆内存中 b. 复制方式不同 - 基础类型是复制一个副本,具有不可变性,引用类型复制的堆内存的地址引用,指向的还是同一个堆内存 c. 参数传递不同 - 参数传递本质还是复制一个变量的副本,所以区别类似于复制方式

2. 如何判断不同的数据类型

  • 知识点大纲

在这里插入图片描述

  • 语言组织(示例)

要点:方式的种类 → 每个种类的优缺点 → 通用的方式

判断数据类型的方式比较多,一般根据不同的场景采取对应的判断方式;

如果判断一个基础数据类型可以采用 typeof 的方式,它的返回结果为对应类型的字符串,但是 typeof 对于引用类型都是返回Object,判断的时候有两个例外,一个是null,null虽然是基础类型但是返回的还是object,另外一个是function,虽然function是引用类型,但是返回的是function

如果判断一个对象是否是属于某个类的实例,可以使用instanceof,格式为 A instanceof B,用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性

比较通用的一种方式是:Object.prototype.toString.call(),既可以检测基础数据类型,也可以检测引用类型,返回的格式为中括号内,第一个是object,第二个就是首字母大写的类型。之所以不能直接调用对象上的toString方法,是Array,Function等比较典型的方法都重写了toString方法,所以是调用的是Object对象原型上的toString方法。

  • 代码运行
let a = 123; // typeof => number, Object.prototype => [object Number]
let b = 'string'; // typeof => string, Object.prototype => [object String]
let c = true;// typeof => boolean, Object.prototype => [object Boolean]
let d = null;// typeof => object, Object.prototype => [object Null]
let f = undefined;// typeof => undefined, Object.prototype => [object Undefined]
let g = Symbol();// typeof => symbol, Object.prototype => [object Symbol]
let e = BigInt(123);// typeof => bigint, Object.prototype => [object BigInt]
let h = [1,2,3];// typeof => object, Object.prototype => [object Array]
let i = {a:1,b:2};// typeof => object, Object.prototype => [object Object]
let k = function(){};// typeof => function, Object.prototype => [object Function]
  • 推荐资料

JavaScript的数据类型及其检测:https://github.com/ljianshu/Blog/issues/4

3. 你刚刚有提到Symbol,那你在日常开发中有使用过么?

  • 知识点大纲
    在这里插入图片描述

  • 语言组织(示例)

要点:提出背景 → 具有哪些特性 → 如何在项目中使用 三个方面递进回答

Symbol是在ES6中提出的第7种数据类型,也是一种基础数据类型。

(介入背景)因为对象的属性只能是字符串,所以我们在调用别人提供的对象时可能会涉及到一些属性的增加或修改而跟原本的属性产生命名冲突,也是基于这一背景,在ES6中提出了Symbol机制来保证属性的唯一性。

(介入特性)Symbol 类型的变量都是独一无二的,可以保证不会与其他属性名产生冲突,

(引出场景)正是因为它这种不可变的特性,在我们日常开发中主要分为两种场景:业务开发场景中使用,去声明一个枚举类型对象或者全局常量等,保证常量属性的唯一性,另一种场景是在日常组件开发中,使用Symbol去定义一些组件的ID值及状态值等。

4. 0.1+0.2不等于0.3,你是怎么理解的呢

  • 知识点大纲
    在这里插入图片描述

  • 语言组织(示例)

从 遵循的标准 → 标准导致的问题 → JS中提出的方案 → 最后问题的答案

这个涉及到JS的数值类型遵循的算术标准:IEEE 754 二进制浮点数算术标准,在JS中使用的是双精度浮点数,即用64位表示数值。这64位又被分成了3个域,符号位、指数域和尾数域。从右到左分别编号063的话,编码051就表示尾数域,编码52~62表示指数域,编码63就表示符号位。

由这种表示方式就导致了两个问题:精度问题和大小问题,精度问题由尾数域导致,它只有52位去表示精度,像0.1、0.2这种无限循环小数就会存在精度丢失问题,大小问题则是由指数域导致的,大于等于2的1024次方的数值就无法表示了,也就出现了数值中的特殊数值Infinity。这两种问题并不是JS中特有的,而是使用IEEE 754 标准浮点数表示法的语言都存在的问题。

在JS中主要有两种解决方案,一个是ES2020提出的 BigInt数据类型用来存储计算大数据,没有精度限制;另一种是机器精度,即使存在误差,但是只要在最小误差内就可以忽略不计,这个精度大概是2的-52次方,也就是JS能表示的最小精度值,在ES6中,把这个值放到了Number.EPSILON常量中。

  • 资料(IEEE754标准、指数偏移值计算详情可参考以下链接)

维基百科:https://zh.wikipedia.org/wiki/IEEE_754

百度文库:https://wenku.baidu.com/view/b50d16c9a6c30c2259019ede.html?wkts=1704806640422&bdQuery=IEEE+754

在这里插入图片描述

5. 说一下你了解的数组方法有哪些?

  • 知识点大纲
    在这里插入图片描述

  • 语言组织(示例)

要点: 产生数组 → 操作数组 → 遍历数组,在 操作数组 部分又分两个方向回答:会改变原数组和不会改变原数组,切忌想到哪个说哪个,毫无逻辑感

常用到的数组方法,主要涉及到三个方面的:创建数组类、操作数组类和遍历数组类。

创建数组类的主要有:Array.of()、Array.from(),这两个都是ES6中新增的数组方法,Array.of()用于将一组数值转换为数组,Array.from()用于将类数组对象转换为数组。

操作数组类的主要 会改变原数组类 和 不会改变原数组类两种,会改变原数组类的涉及到基本都是增删改相关的函数:push/pop、unshift/shift、copyWithin、fill、splice、reverse、sort等,不会改变原数组的主要是查找拼接相关的函数:indexOf、lastIndexOf、includes、concat、join、slice、toString等。

还有一些对数组的遍历操作:forEach、map、some、every、filter、reduce、find等等

  • 推荐链接

数组API及常见排序算法:https://blog.csdn.net/weixin_41305441/article/details/119008708

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wpf的资源路径

1、手动命名空间 xmlns:share"clr-namespace:***;assembly**" 2、资源文件 Pack URI 编译到本地程序集内的资源文件的 pack URI 使用以下授权和路径: 授权:application:///。 路径:资源文件的名称,包括其相对于本地…

【OpenCV学习笔记06】- 制作使用轨迹条控制的调色板

内容 学习将轨迹栏绑定到 OpenCV 窗口。你将学习这些函数:cv.getTrackbarPos(), cv.createTrackbar() 等等。 调色板代码 这里,我们将创建用以显示指定颜色的简单程序。 你有一个显示颜色的窗口和三个轨迹栏,用来指定 B,G&…

研发型企业怎样选择安全便捷的数据摆渡解决方案?

研发型企业在市场经济发展中发挥着至关重要的作用,研发型企业是指以科技创新为核心,以研发新产品、新技术、新工艺为主要业务的企业。这类企业注重技术创新和研发,持续不断地进行技术创新和产品升级,为经济发展注入新鲜的活力。 研…

Vue学习笔记五--路由

1、什么是路由 2、VueRouter 2、1VueRouter介绍 2、2使用步骤 2、3路由封装 3、router-link 3.1两个类名 3.2声明式导航传参 4、路由重定向、404 当找不到路由时,跳转配置到404页面 5、路由模式 6、通过代码跳转路由---编程式导航&传参 路由跳转时传参 跳转方式…

canvas设置线条样式(宽度,端点形态、拐点样式、虚线)

查看专栏目录 canvas示例教程100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

学习笔记之——3D Gaussian Splatting源码解读

之前博客对3DGS进行了学习与调研 学习笔记之——3D Gaussian Splatting及其在SLAM与自动驾驶上的应用调研-CSDN博客文章浏览阅读450次。论文主页3D Gaussian Splatting是最近NeRF方面的突破性工作,它的特点在于重建质量高的情况下还能接入传统光栅化,优…

【Python】AttributeError: module ‘torch.nn‘ has no attribute ‘HardSigmoid‘

AttributeError: module ‘torch.nn’ has no attribute ‘HardSigmoid’ 这个错误是因为PyTorch的torch.nn模块中并没有HardSigmoid这个函数。是拼写的大小写问题,换成nn.Hardsigmoid()即可。 如下述代码出错。 import torch import torch.nn as nn hard_sigmoid…

进程、线程、协程的对比、区别和联系,进程之间的通信方式、线程之间的通信方式、协程之间的通信方式

前言 之前的一篇文章曾写过一些关于进程、线程、协程的内容——进程、线程、协程… … ——任务管理器的性能里都有什么?那么多的线程,进程、线程、句柄都是什么? 但对其之间的通信方式还是没有太过详细了解,因此特写此&#xf…

Flink构造宽表实时入库案例介绍

1. 安装包准备 Flink 1.15.4 安装包 Flink cdc的mysql连接器 Flink sql的sdb连接器 MySQL驱动 SDB驱动 Flink jdbc的mysql连接器 2. 入库流程图 3. Flink安装部署 上传Flink压缩包到服务器,并解压 tar -zxvf flink-1.14.5-bin-scala_2.11.tgz -C /opt/ 复…

7个JavaScript面试题全面解析,一文搞定技术面试

JavaScript是构建网络的主要基石之一。这个强大的语言也有自己的怪癖。例如,您知道0 -0计算为true,或者Number("")产生0吗? 问题在于,这些怪癖有时会让你抓耳挠腮,甚至质疑Brendon Eich发明JavaScript的那一天是不是high了。当然,这里的重点不是说JavaScript是一种…

金融帝国实验室(Capitalism Lab)V10版本游戏平衡性优化与改进

即将推出的V10版本中的各种游戏平衡性优化与改进: ————————————— 一、当玩家被提议收购一家即将破产的公司时,显示商业秘密。 当一家公司濒临破产,玩家被提议收购该公司时,如果玩家有兴趣评估该公司,则无…

【Axure高保真原型】树控制内联框架

今天和大家分享树控制内联框架的原型模板,点击树的箭头可以打开或者收起子节点,点击最后一级人物节点,可以切换右侧内联框到对应的页面,左侧的树是通过中继器制作的,使用简单,只需要按要求填写中继器表格即…

【二】为Python Tk GUI窗口添加一些组件和绑定一些组件事件

文章目录 背景系统环境添加一些组件添加一个Tab标签Frame标签内添加两个单选框、按钮为按钮添加事件(预览图片、生成图片按钮和事件) 运行示例添加notebook组件和frame组件(见标题【添加一个Tab标签】)在frame组件上添加单选框和按…

dpdk20.11.9 编译arm版本以及在arm 应用中引用dpdk20.11.9

以往19版本的dpdk 都是可以直接用make 的方式进行编译, e.g, make Tx86_64-native-linux-gcc install 为了和客户那边用的DPDK 版本一致, 这次要用dpdk20.11.9, 并且要把之前跑在X86 版本的服务器上的程序跑在ARM 版本上. 目前有两个问题: 1. 编译出arm 版本的dpdk. 2. 把…

Spark与云存储的集成:S3、Azure Blob Storage

在现代数据处理中,云存储服务如Amazon S3和Azure Blob Storage已成为存储和管理数据的热门选择。与此同时,Apache Spark作为大数据处理框架也备受欢迎。本文将深入探讨如何在Spark中集成云存储服务,并演示如何与S3和Azure Blob Storage进行互…

R语言安装教程(附安装包链接)

R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。 Mac支持M1芯片,下载其中的arm即可,其余下载另一个文件 下载链接: 链接: https://pan…

Python如何使用Excel文件

使用Python操作Office——EXCEL 首先介绍下office win32 com接口,这个是MS为自动化提供的操作接口,比如我们打开一个EXCEL文档,就可以在里面编辑VB脚本,实现我们自己的效果。对于这种一本万利的买卖,Python怎么能放过…

怎么样检查自己系统上的Python环境中是否有某个包(扩展库)?

比如我们这里想看下有没有库pytz 很简单,进入Python的命令行,然后输入下面的命令: import pytz如果有这个库,则不会报错,否则会报错。 Windows的测试结果如下: Centos的测试结果如下:

【LV12 DAY12-13 GPIO C 语言与寄存器封装】

GPIO 通用型输入输出,GPIO可以控制连接在其引脚实现信号的输入和输出 芯片的引脚和外部设备相连从而实现与外部硬件的通讯,控制,信号采集的功能。 控制CHG_COK引脚输出为高电平,LED亮,输出为低电平,LED熄灭…

麦芯(MachCore)开发教程1 --- 设备软件中间件

黄国强 2024/1/10 acloud163.com 对任何公司来说,在短时间内开发一款高质量设备专用软件,是一件不太容易做到的事情。麦芯是笔者发明的一款设备软件中间件产品。麦芯致力于给设备厂商提供一个开发工具和平台,让客户快速高效的开发自己的设备专…