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

news2024/9/22 17:36:19

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

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

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

相关文章

力扣热题100

排序 快速排序 #include <iostream> #include <vector> using namespace std;// 快速排序函数&#xff0c;传入引用&#xff0c;以便修改原始数组 void quick_sort(vector<int>& q, int l, int r) {// 边界条件&#xff1a;如果左边界大于等于右边界&am…

全链路追踪关键技术-TraceId、SpanId生成规则

链路追踪的traceid原理梳理 如何追踪微服务调用&#xff1f; ● traceId&#xff0c;用于标识某一次具体的请求ID。当用户的请求进入系统后&#xff0c;会在RPC调用网络的第一层生成一个全局唯一的traceId&#xff0c;并且会随着每一层的RPC调用&#xff0c;不断往后传递&…

【搜索引擎设计:信息搜索怎么避免大海捞针?

在前面我们提到了网页爬虫设计&#xff1a;如何下载千亿级网页&#xff1f;中&#xff0c;我们讨论了大型分布式网络爬虫的架构设计&#xff0c;但是网络爬虫只是从互联网获取信息&#xff0c;海量的互联网信息如何呈现给用户&#xff0c;还需要使用搜索引擎完成。因此&#xf…

AWS EC2的SSM配置(AWS云中的跳板机)

问题 开发人员需要访问AWS云中私有子网的数据库服务等&#xff0c;都需要通过EC2进行SSH隧道代理。这里假设本地已经有一款稳定优秀的SSH客户端工具&#xff0c;并且假设已经会熟练使用SSH的隧道代理。 1.创建EC2 搜索找到EC2服务&#xff0c;如下图&#xff1a; 点击“启动…

ssm基于Java的壁纸网站设计与实现论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

OpenHarmony源码解析之编译构建

前言 OpenHarmony是由开放原子开源基金会&#xff08;OpenAtom Foundation&#xff09;孵化及运营的开源项目&#xff0c;目标是面向全场景、全连接、全智能时代、基于开源的方式&#xff0c;搭建一个智能终端设备操作系统的框架和平台&#xff0c;促进万物互联产业的繁荣发展…

用通俗易懂的方式讲解:Stable Diffusion WebUI 从零基础到入门

本文主要介绍 Stable Diffusion WebUI 的实际操作方法&#xff0c;涵盖prompt推导、lora模型、vae模型和controlNet应用等内容&#xff0c;并给出了可操作的文生图、图生图实战示例。适合对Stable Diffusion感兴趣&#xff0c;但又对Stable Diffusion WebUI使用感到困惑的同学。…

Linux:信号

目录 1.信号 2.信号的过程 a.信号的产生 1:键盘产生, 异常产生 2:系统调用产生信号 3.软件条件产生信号 4.硬件异常产生信号 b.信号的发送 c.信号的处理 d.总结与思考 3.信号保存 1.信号及其它相关常见概念 2.在内核中的表示 3.sigset_t 4. 信号集操作函数 4.信…

C#基于ScottPlot进行可视化

前言 上一篇文章跟大家分享了用NumSharp实现简单的线性回归&#xff0c;但是没有进行可视化&#xff0c;可能对拟合的过程没有直观的感受&#xff0c;因此今天跟大家介绍一下使用C#基于Scottplot进行可视化&#xff0c;当然Python的代码&#xff0c;我也会同步进行可视化。 P…

【SQL注入】SQLMAP v1.7.11.1 汉化版

下载链接 【SQL注入】SQLMAP v1.7.11.1 汉化版 简介 SQLMAP是一款开源的自动化SQL注入工具&#xff0c;用于扫描和利用Web应用程序中的SQL注入漏洞。它在安全测试领域被广泛应用&#xff0c;可用于检测和利用SQL注入漏洞&#xff0c;以验证应用程序的安全性。 SQL注入是一种…

脱离于ASP.NET 和Visual Studio编辑Razor脚本

Razor Pad是一个编辑Razor脚本的工具&#xff0c;脱离于ASP.NET 和Visual Studio。 github地址&#xff1a;https://github.com/RazorPad/RazorPad 如果在编译源码时出现&#xff1a;签名时出错: 未能对 bin\Debug\app.publish\RazorPad.exe 签名。SignTool Error: No certifi…

myql进阶-一条查询sql在mysql的执行过程

目录 1. 流程图 2. 各个过程 2.1 连接器 2.2 分析器 2.3 优化器 2.4 执行器 2.5 注意点 1. 流程图 2. 各个过程 假设我们执行一条sql语句如下&#xff1a; select * from t_good where good_id 1 2.1 连接器 首先我们会和mysql建立连接&#xff0c;此时就会执行到连接…

Java+Mysql存储过程生成订单序列号

Mysql存储过程生成唯一订单号 直接上代码&#xff01;&#xff01; 1.创建存储过程 CREATE DEFINERrootlocalhost PROCEDURE getOrderSerialNo(# 前缀in orderPrefix varchar(64), # 返回结果out result int) BEGIN# 当前流水号declare curOrderNo int;# 默认值为0declare e…

【问题探讨】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究

目录 主要内容 模型研究 结果一览 下载链接 主要内容 该模型以环境保护成本和运行成本为双目标构建了微电网优化调度模型&#xff0c;模型目标函数和约束条件复现文献《基于改进粒子群算法的微电网多目标优化调度》&#xff0c;程序的特点是采用非支配排序的蜣螂…

学习selenium+python使用 XPath 表达式来实现找到目标元素时智能封装等待,执行测试代码启动Chrome浏览器后,地址栏只显示data;

背景 学习使用 XPath 表达式来实现找到目标元素时智能封装等待执行测试代码启动Chrome浏览器后&#xff0c;地址栏只显示data&#xff1b; 代码如下 import unittest from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from …

Java SE入门及基础(11)

程序调试 1. 什么是程序调试 当程序出现问题时&#xff0c;我们希望程序能够暂停下来&#xff0c;然后通过我们操作使代码逐行执行&#xff0c;观察整个过程中变量的变化是否按照我们设计程序的思维变化&#xff0c;从而找问题并解决问题&#xff0c;这个过程称之为程序调试…

ftp安装与配置 云服务器 CentOS7

1、FTP的安装 #安装 yum install -y vsftpd#设置开机启动 systemctl enable vsftpd.service#启动 systemctl start vsftpd.service#停止 systemctl stop vsftpd.service#查看状态 systemctl status vsftpd.service 2、配置FTP #修改前先进行备份文件 cp /etc/vsftpd/vsftpd…

LeetCode264. 丑数 II(相关话题:多重指针动态规划)

题目描述 给你一个整数 n &#xff0c;请你找出并返回第 n 个 丑数 。丑数 就是质因子只包含 2、3 和 5 的正整数。 示例 1&#xff1a; 输入&#xff1a;n 10 输出&#xff1a;12 解释&#xff1a;[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。示例 2&am…

物联网协议Coap之Core和NetWork简介

目录 前言 一、Coap的Core包 1、Coap对象 2、Message对象 3、Request对象 4、Response对象 二、Coap的NetWork调试 1、UDP运行模式 2、Network消息接收 3、Sender线程发送数据 三、总结 前言 在之前的博文中&#xff0c;对Californium中Coap的实现进行了简要的介绍&a…

31 树的存储结构二

DIsplay() 递归显示 :图示 求树的高度时&#xff0c;递归的技巧 在递归的过程中&#xff1a;ret单独和任意一个子树的子高度比较&#xff0c;如果ret<max&#xff0c;retmax ------------- 注意&#xff1a;组织链表和子链表的【元素类型】都是TLNode* 链表都要先通过TLNod…