面试 JavaScript 框架八股文十问十答第一期

面试 JavaScript 框架八股文十问十答第一期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

1)JavaScript有哪些数据类型,它们的区别?

在JavaScript中,数据类型主要分为两类:原始数据类型(Primitive Types)和对象数据类型(Object Types)。

原始数据类型(Primitive Types):
  1. Undefined(未定义): 表示声明了变量但未赋值的情况。
  2. Null(空值): 表示一个空值或者不存在的对象。
  3. Boolean(布尔值): 表示逻辑上的真或假。
  4. Number(数字): 表示整数或浮点数。
  5. String(字符串): 表示文本数据。
对象数据类型(Object Types):
  1. Object(对象): 一般是由多个键值对组成的无序集合,可以包含原始数据类型或其他对象。
  2. Array(数组): 一种特殊的对象,用于存储有序的数据集合。
  3. Function(函数): 也是一种对象,但具有可调用的行为。

区别:

  • 原始数据类型是不可变的(immutable): 一旦被创建,原始数据类型的值不能被修改。每次对原始数据类型进行操作时,都会创建一个新的值。
  • 对象数据类型是可变的(mutable): 对象和数组是可变的,可以随时添加、修改、删除属性或元素。

2)数据类型检测的方式有哪些

在JavaScript中,有多种方式可以进行数据类型检测:

  1. typeof 操作符: 用于检测变量的数据类型,返回一个字符串。

    typeof variable
    
  2. instanceof 操作符: 用于检测对象的原型链,判断对象是否属于某个构造函数创建的实例。

    object instanceof constructor
    
  3. Object.prototype.toString.call() 方法: 利用内置的 toString 方法,返回一个格式为 “[object Type]” 的字符串,其中 Type 表示对象的类型。

    Object.prototype.toString.call(variable)
    
  4. constructor 属性: 利用对象的 constructor 属性,但要注意该属性可能会被修改。

    variable.constructor === Array
    
  5. Array.isArray() 方法: 专门用于检测是否为数组。

    Array.isArray(variable)
    

3)判断数组的方式有哪些

判断一个值是否为数组有多种方式,其中一些在上面的回答中已经提到了。以下是判断数组的常见方式:

  1. Array.isArray() 方法: 是最直接的方式,专门用于检测是否为数组。

    Array.isArray(variable)
    
  2. instanceof 操作符: 用于检测对象的原型链,可以判断是否为数组。

    variable instanceof Array
    
  3. constructor 属性: 利用对象的 constructor 属性,但要注意该属性可能会被修改。

    variable.constructor === Array
    
  4. Object.prototype.toString.call() 方法: 利用内置的 toString 方法,返回一个格式为 “[object Array]” 的字符串。

    Object.prototype.toString.call(variable) === '[object Array]'
    

每种方法都有其优缺点,根据具体的场景选择合适的方式进行数组类型检测。通常来说,推荐使用 Array.isArray() 方法,因为它简单、直观且性能较好。

4)null和undefined区别

nullundefined 是 JavaScript 中的两种特殊值,它们有一些区别:

  • null:
    • 表示一个空值或者不存在的对象引用。
    • 当一个对象被赋值为 null 时,表示该对象不指向任何内存地址。
    • 使用 typeof null 会返回 "object",这是一个历史遗留问题,实际上 null 是一种特殊的对象值。
  • undefined:
    • 表示一个变量已声明但尚未被赋值,或者一个对象没有给定属性。
    • 当一个变量被声明但未初始化时,默认值为 undefined
    • 使用 typeof undefined 会返回 "undefined"

在实践中,null 通常是程序员显式赋予的,表示变量的空值,而 undefined 更多是由 JavaScript 引擎生成,表示变量尚未初始化或对象没有给定属性。

5)typeof null 的结果是什么,为什么?

typeof null 的结果是 "object"。这是 JavaScript 中的一个历史遗留问题,实际上是一个语言设计上的错误。

在 JavaScript 的早期版本中,typeof null 返回 "object" 是因为 JavaScript 中的值都包含了一个表示其类型的标签,而 null 被标记为对象类型(010)。

尽管这是一个历史遗留问题,但由于已经广泛使用,为了保持向后兼容性,ECMAScript 规范并未修改这个行为。

6)intanceof 操作符的实现原理及实现

instanceof 操作符用于判断对象是否是某个构造函数创建的实例。其实现原理是通过检查对象的原型链,看构造函数的原型是否出现在对象的原型链上。

实现步骤:

  1. 获取对象的原型:通过 Object.getPrototypeOf(obj) 或者对象的 __proto__ 属性获取对象的原型。
  2. 获取构造函数的原型:通过构造函数的 prototype 属性获取构造函数的原型。
  3. 检查原型链:判断对象的原型链中是否存在构造函数的原型。

简化的 instanceof 实现示例:

function myInstanceOf(obj, constructorFunc) {let prototype = Object.getPrototypeOf(obj);while (prototype !== null) {if (prototype === constructorFunc.prototype) {return true;}prototype = Object.getPrototypeOf(prototype);}return false;
}// 使用示例
let arr = [];
console.log(myInstanceOf(arr, Array)); // true
console.log(myInstanceOf(arr, Object)); // true
console.log(myInstanceOf(arr, Function)); // false

这个实现会沿着对象的原型链逐级查找,如果找到构造函数的原型,则返回 true,否则返回 false。需要注意的是,instanceof 在多层继承链的情况下也能正确判断。

7)为什么0.1+0.2 ! == 0.3,如何让其相等

在 JavaScript 中,浮点数的表示方式采用的是 IEEE 754 标准,由于浮点数的精度有限,可能导致某些小数计算不精确。因此,0.1 + 0.2 的结果并不等于 0.3

解决方式可以通过四舍五入或使用小数点后的固定位数,然后再比较。例如:

const sum = 0.1 + 0.2;
const expectedResult = 0.3;// 四舍五入
console.log(Math.abs(sum - expectedResult) < Number.EPSILON); // true// 小数点后两位
console.log(sum.toFixed(2) === expectedResult.toFixed(2)); // true

使用 Math.abs()Number.EPSILON 进行比较,或者通过 toFixed() 方法控制小数点后的位数,可以规避浮点数计算不精确的问题。

8)如何获取安全的 undefined 值?

在 JavaScript 中,undefined 是一个全局变量,但为了避免被重写,可以使用以下几种方式获取安全的 undefined 值:

  1. 使用全局对象访问:

    const safeUndefined = window.undefined; // 在浏览器环境中
    
  2. 使用 void 操作符:

    const safeUndefined = void 0;
    

这样获取的 safeUndefined 就是原生的 undefined 值,不受可能被重写的影响。

9)typeof NaN 的结果是什么?

typeof NaN 的结果是 "number"。虽然 NaN 代表 “Not-a-Number”,但在 JavaScript 中,它被归类为数字类型。

这可能是因为 NaN 实际上是一个特殊的数字值,表示一个本来要返回数值的操作未返回数值的情况。由于历史原因,JavaScript 将 typeof NaN 返回为 "number"

10)isNaN 和 Number.isNaN 函数的区别?

isNaNNumber.isNaN 是两个用于检测是否为 NaN 的函数,它们之间有一些区别:

  • isNaN:

    • 全局函数,用于检测传入的值是否为 NaN

    • 在检测之前会尝试将参数转换为数值,如果无法转换,则返回 true

      isNaN("Hello"); // true,因为无法转换为数值
      
  • Number.isNaN:

    • Number 对象上的静态方法,严格检查传入的值是否为 NaN

    • 不会尝试将参数转换为数值,只有在参数是 NaN 时才返回 true

      Number.isNaN("Hello"); // false,不会尝试转换,直接返回 false
      

总的来说,使用 Number.isNaN 更安全,因为它不会进行类型转换。如果你只想判断是否为 NaN,而不关心是否可以转换为数值,推荐使用 Number.isNaN

开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

已 300 + Star!

⭐点赞⭐收藏⭐不迷路!⭐

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

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

相关文章

Linux 高并发服务器

多进程并发服务器 使用多进程并发服务器时要考虑以下几点&#xff1a; 父进程最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符)系统内创建进程个数(与内存大小相关)进程创建过多是否降低整体服务性能(进程调度) server /* server.c */ #include <stdio…

IDEA反编译Jar包

反编译步骤 使用IDEA安装decompiler插件 找到decompiler插件文件夹所在位置&#xff08;IDEA安装路径/plugins/java-decompiler/lib &#xff09;&#xff0c;将需要反编译的jar包放到decompiler插件文件夹下&#xff0c;并创建一个空的文件夹&#xff0c;用来存放反编译后的…

电子信息考博目标院校

电子信息考博 1.目标院校 第一志愿 武汉大学 211计算机学院(2024年度) 085400电子信息 新一代信息通信技术&#xff08;卓工博士专项&#xff09; 外语水平考试科目 1101英语 卓工博士专项计划详见专项简章 212电子信息学院(2024年度) 085400电子信息 新一代信息通信…

AJAX-常用请求方法和数据提交

常用请求方法 请求方法&#xff1a;对服务器资源&#xff0c;要执行的操作 axios请求配置 url&#xff1a;请求的URL网址 method&#xff1a;请求的方法&#xff0c;如果是GET可以省略&#xff1b;不用区分大小写 data&#xff1a;提交数据 axios({url:目标资源地址,method…

【C语言】异常处理 | assert函数 | errno错误码

文章目录 C语言传统的处理错误的方式1. 终止程序&#xff08;例如使用 assert&#xff09;2. 返回/设置错误码手动实现C语言库函数内置的错误码Linux系统调用内置的错误码 C语言传统的处理错误的方式 C语言传统的处理错误的方式主要包括assert终止程序和返回或设置错误码两种方…

Django的web框架Django Rest_Framework精讲(三)

文章目录 1.DRF视图1) 视图基类1.GET请求2.POST请求&#xff0c;添加单条记录3.更新单条记录put方法4.DELETE请求 2) GenericAPIView[通用视图类] 2.视图类中使用多个序列化器类的方法3.基于视图扩展类的视图接口1&#xff09;ListModelMixin2&#xff09;CreateModelMixin3&am…

如何远程操控vm虚拟机(finalshell版)

你是否因为虚拟机命令行操作不便而头疼&#xff1f;是否因为难以复制粘贴而烦恼&#xff1f;是否因为无法快速上传文件而烦躁&#xff1f; 别急&#xff01;现在有一个简单便捷的软件能够实现上述你所述说的所有烦恼&#xff0c;请听我细细道来~ 一、查看虚拟机的ip地址 a.首…

python-分享篇-GUI界面开发-PyQt5-窗体代码与逻辑代码分离

代码 # _*_ coding:utf-8 _*_ # 文件名称&#xff1a;LoginWindows.py # 开发工具&#xff1a;PyCharmimport sys # 导入操作系统模块from PyQt5.QtCore import QCoreApplication # 导入PyQt5的QtCore模块 from PyQt5.QtWidgets import QApplication,QMainWindow # 导入P…

Spring Boot解决跨域问题的3种方案

前后端分离大势所趋&#xff0c;跨域问题更是老生常谈&#xff0c;随便用标题去google或百度一下&#xff0c;能搜出一大片解决方案&#xff0c;那么为啥又要写一遍呢&#xff0c;不急往下看。 文章目录 问题背景&#xff1a;解决办法&#xff1a;第一种办法&#xff1a;第二种…

【game——关机程序】

程序运行后&#xff0c;会在1分钟内关机&#xff0c;用户需要输入&#xff1a;lalala&#xff0c;才能停止电脑关机。 电脑内有操作命令符&#xff0c;可以实现关机&#xff1a; 最后按一下回车&#xff1a; #include<stdio.h> #include<stdlib.h> #include<s…

分类预测 | Matlab实现GAF-PCNN-MATT格拉姆角场和双通道PCNN融合多头注意力机制的分类预测/故障识别

分类预测 | Matlab实现GAF-PCNN-MATT格拉姆角场和双通道PCNN融合多头注意力机制的分类预测/故障识别 目录 分类预测 | Matlab实现GAF-PCNN-MATT格拉姆角场和双通道PCNN融合多头注意力机制的分类预测/故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现G…

【Crypto | CTF】BUUCTF Alice与Bob1

天命&#xff1a;比较简单的题目 先用Python生成一个脚本&#xff0c;分解两个素数 def prime_factors(n):"""分解给定整数n的质因数。返回一个列表&#xff0c;其中包含n的所有质因数。"""# 初始化一个空列表来存储质因数factors []# 从2开始…

十、Qt三维图表

一、Data Visualization模块概述 Data Visualization的三维显示功能主要有三种三维图形来实现&#xff0c;三各类的父类都是QAbstract3DGraph&#xff0c;从QWindow继承而来。这三类分别是&#xff1a;三维柱状图Q3DBar三维空间散点Q3DScatter三维曲面Q3DSurface 1、相关类的…

QSqlRelationalTableModel 关系表格模型

一、 1.1 QSqlRelationalTableModel继承自QSqlTableModel&#xff0c;并且对其进行了扩展&#xff0c;提供了对外键的支持。一个外键就是一个表中的一个字段 和 其他表中的主键字段之间的一对一的映射。例如&#xff0c;“studInfo”表中的departID字段对应的是“departments…

2024年华为OD机试真题-靠谱的车-Java-OD统一考试(C卷)

题目描述: 程序员小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大。 出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常。 比如: 1. 23再多一块钱就变为25; 2. 39再多一块…

计算机视觉-PCV包、Vlfeat库、Graphviz库的下载安装配置及问题解决(使用anaconda3 python 3.8.5)

目录 一、PCV包配置 二、Vlfeat配置 三、在PCV包的sift.py文件中对路径进行修改 四、以上步骤所需注意的错误 五、Graphviz配置 一、PCV包配置 1.下载PCV包,点开网址直接下载安装包(不用解压),下载之后将安装包放在任意目录位置https://codeload.github.com/Li-Shu14…

wasm 在web中最小胶水代码; 报错Imports argument must be present and must be an object

加载和运行 WebAssembly 代码 我试过了没成功&#xff0c;代码裁剪有点严重 加载WebAssembly的两个新的API 新的 WebAssembly.compileStreaming/WebAssembly.instantiateStreaming 方法更加高效——它们直接在来自网络的原始字节流上执行操作&#xff0c;省去了 ArrayBuffer 步…

Linux升级openssh的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

网络原理TCP/IP(2)

文章目录 TCP协议确认应答超时重传连接管理断开连接 TCP协议 TCP全称为"传输控制协议(Transmission Control Protocol").⼈如其名,要对数据的传输进⾏⼀个详细 的控制; TCP协议段格式 • 源/目的端口号:表⽰数据是从哪个进程来,到哪个进程去; • 32位序号/32位确认…

ClickHouse基于数据分析常用函数

文章标题 一、WITH语法-定义变量1.1 定义变量1.2 调用函数1.3 子查询 二、GROUP BY子句&#xff08;结合WITH ROLLUP、CUBE、TOTALS&#xff09;三、FORM语法3.1表函数3.1.1 file3.1.2 numbers3.1.3 mysql3.1.4 hdfs 四、ARRAY JOIN语法&#xff08;区别于arrayJoin(arr)函数&a…