面试 JavaScript 框架八股文十问十答第一期
面试 JavaScript 框架八股文十问十答第一期
作者:程序员小白条,个人博客
相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!
⭐点赞⭐收藏⭐不迷路!⭐
1)JavaScript有哪些数据类型,它们的区别?
在JavaScript中,数据类型主要分为两类:原始数据类型(Primitive Types)和对象数据类型(Object Types)。
原始数据类型(Primitive Types):
- Undefined(未定义): 表示声明了变量但未赋值的情况。
- Null(空值): 表示一个空值或者不存在的对象。
- Boolean(布尔值): 表示逻辑上的真或假。
- Number(数字): 表示整数或浮点数。
- String(字符串): 表示文本数据。
对象数据类型(Object Types):
- Object(对象): 一般是由多个键值对组成的无序集合,可以包含原始数据类型或其他对象。
- Array(数组): 一种特殊的对象,用于存储有序的数据集合。
- Function(函数): 也是一种对象,但具有可调用的行为。
区别:
- 原始数据类型是不可变的(immutable): 一旦被创建,原始数据类型的值不能被修改。每次对原始数据类型进行操作时,都会创建一个新的值。
- 对象数据类型是可变的(mutable): 对象和数组是可变的,可以随时添加、修改、删除属性或元素。
2)数据类型检测的方式有哪些
在JavaScript中,有多种方式可以进行数据类型检测:
-
typeof 操作符: 用于检测变量的数据类型,返回一个字符串。
typeof variable
-
instanceof 操作符: 用于检测对象的原型链,判断对象是否属于某个构造函数创建的实例。
object instanceof constructor
-
Object.prototype.toString.call() 方法: 利用内置的
toString
方法,返回一个格式为 “[object Type]” 的字符串,其中 Type 表示对象的类型。Object.prototype.toString.call(variable)
-
constructor 属性: 利用对象的
constructor
属性,但要注意该属性可能会被修改。variable.constructor === Array
-
Array.isArray() 方法: 专门用于检测是否为数组。
Array.isArray(variable)
3)判断数组的方式有哪些
判断一个值是否为数组有多种方式,其中一些在上面的回答中已经提到了。以下是判断数组的常见方式:
-
Array.isArray() 方法: 是最直接的方式,专门用于检测是否为数组。
Array.isArray(variable)
-
instanceof 操作符: 用于检测对象的原型链,可以判断是否为数组。
variable instanceof Array
-
constructor 属性: 利用对象的
constructor
属性,但要注意该属性可能会被修改。variable.constructor === Array
-
Object.prototype.toString.call() 方法: 利用内置的
toString
方法,返回一个格式为 “[object Array]” 的字符串。Object.prototype.toString.call(variable) === '[object Array]'
每种方法都有其优缺点,根据具体的场景选择合适的方式进行数组类型检测。通常来说,推荐使用 Array.isArray()
方法,因为它简单、直观且性能较好。
4)null和undefined区别
null
和 undefined
是 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
操作符用于判断对象是否是某个构造函数创建的实例。其实现原理是通过检查对象的原型链,看构造函数的原型是否出现在对象的原型链上。
实现步骤:
- 获取对象的原型:通过
Object.getPrototypeOf(obj)
或者对象的__proto__
属性获取对象的原型。 - 获取构造函数的原型:通过构造函数的
prototype
属性获取构造函数的原型。 - 检查原型链:判断对象的原型链中是否存在构造函数的原型。
简化的 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
值:
-
使用全局对象访问:
const safeUndefined = window.undefined; // 在浏览器环境中
-
使用 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 函数的区别?
isNaN
和 Number.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!
⭐点赞⭐收藏⭐不迷路!⭐
相关文章:
面试 JavaScript 框架八股文十问十答第一期
面试 JavaScript 框架八股文十问十答第一期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)JavaScript有哪些…...

【发票识别】新增针对图片发票的识别(升级中)
说明 为了完善发票识别的功能,目前发票识别支持发票图片格式的识别,增加可用性。 体验 体验地址:https://invoice.behappyto.cn/invoice-service/ 体验地址上面有示例的发票,可以下载上传识别或者复制url地址进行识别。 技术栈…...

面试数据结构与算法总结分类+leetcode目录【基础版】
🧡🧡🧡算法题目总结: 这里为大家总结数据结构与算法的题库目录,如果已经解释过的题目会标注链接更新,方便查看。 数据结构概览 Array & String 大家对这两类肯定比较清楚的,同时这也是面试…...

音频二维码怎么制作出来的?支持多种格式音频生码的方法
怎么把一个音频的文件做成二维码图片呢?在日常工作和生活中,有很多的场景会需要使用音频类型的文件来展示内容,比如常见的英语听力、课程、听书等类型的内容,现在都可以用二维码展示。而且现在生成音频二维码的方法也很简单&#…...

ReactNative实现一个圆环进度条
我们直接看效果,如下图 我们在直接上代码 /*** 圆形进度条*/ import React, {useState, useEffect} from react; import Svg, {Circle,G,LinearGradient,Stop,Defs,Text, } from react-native-svg; import {View, StyleSheet} from react-native;// 渐变色 const C…...

【JS逆向学习】今日头条
逆向目标 目标网页:https://www.toutiao.com/?wid1707099375036目标接口:https://www.toutiao.com/api/pc/list/feed目标参数:_signature 逆向过程 老规矩先观察网络请求,过滤XHR请求观察加密参数,发现Payload的_s…...

Tailwind CSS
目录 引入原因: css增长,样式错乱 调试 规范:在class上原子化css 特点:把class当行内style动态属性用 优点 不用命名样式 不用想并不重要的CSS变量名 缺少命名逻辑 不用撰写维护和模板【对应的独立css块】 不用不停滚…...

Go语言每日一练——链表篇(五)
传送门 牛客面试笔试必刷101题 ----------------合并k个已排序的链表 题目以及解析 题目 解题代码及解析 解析 这一道题与昨天的合并链表题目类似,但是由于有K个且时间复杂度要求控制在O(nlogn),这里主要有两种解法:一种是依旧使用归并来…...

5-4、S加减单片机程序【51单片机+L298N步进电机系列教程】
↑↑↑点击上方【目录】,查看本系列全部文章 摘要:本节介绍实现步进电机S曲线运动的代码 一、目标功能 实现步进电机转动总角度720,其中加减速各90 加速段:加速类型:S曲线 加速角度:角度为90 起步速度…...

【安卓跨程序共享数据,探究ContentProvider】
ContentProvider主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。 目前,使用ContentProvider是Android实现跨程序共享数据的标准方…...

abap - 发送邮件,邮件正文带表格和excel附件
发送内容 的数据获取: 正文部分使用cl_document_bcs>create_document静态方法实现 传入参数为html内表结构 CLEAR lo_document .lo_document cl_document_bcs>create_document(i_type HTMi_text lt_htmli_length conlengthsi_subject lv_subje…...
Ubuntu编译和测试ITK4.13.1
安装不麻烦,环境配置挺麻烦,主要是gcc、cmake和ccmake的版本不匹配问题。 环境: gcc -- 7.5.0 cmake -- 3.15.2 ccmake -- 3.15.2 参考以下两篇博客安装: 1、 ITK的安装与测试(Ubuntu系统)_ubuntu20…...
【C语言】简易计算器转移表(函数指针简化)
什么是转移表? 转移表是一种根据输入条件进行分支选择的技术。它通常用于根据不同的条件执行不同的操作。在 C 语言中,我们可以使用 switch 语句来创建转移表,根据表达式的值选择不同的分支执行。 计算器转移表的普通实现 #include<stdi…...

JavaBase持续更新
仅作笔记📒, 尚不完善, 持续更新中… 一、Java概述 1.1 Java语言发展史 语言: 人与人交流沟通的表达方式 计算机语言: 人与计算机之间进行信息交流沟通的一种特殊语言 Java语言是美国Sun公司(Stanford University Network)在1995年推出的…...

AI专题:海外科技巨头指引,AI主线逻辑依旧坚挺
今天分享的是AI 系列深度研究报告:《AI专题:海外科技巨头指引,AI主线逻辑依旧坚挺》。 (报告出品方:华西证券) 报告共计:54页 本周热点:海外科技巨头指引,AI主线逻辑依旧坚挺 硬件…...

性能测试工具LoadRunner与登录性能测试分析
1. LoadRunner与Jmeter Jmeter是开源免费的,LoadRunner是商业收费的。 但是LoadRunner具有非常强大的录制功能,具有丰富且灵活的场景,具备丰富的报告性能。 1)Jmeter没有录制功能 2)LoadRunner可以设计非常丰富的测试…...
作业2024/2/5
第四章 堆与拷贝构造函数 一 、程序阅读题 1、给出下面程序输出结果。 #include <iostream.h> class example {int a; public: example(int b5){ab;} void print(){aa1;cout <<a<<"";} void print()const {cout<<a<<endl;} …...

聊聊并发编程,另送5本Golang并发编程新书
大家好,我是飞哥! 并发编程并不是一个新话题,但是我觉得在近几年以及未来的时间里,并发编程将显得越来越重要。 为什么这样讲,让我们先回到一个基本的问题上来,为什么我们要采用并发编程?关于这…...
Jgit Packfile is truncated解决方案
配置方式解决 这两个配置选项是用于提高 SSH 连接稳定性的 SSH 客户端配置参数,它们被添加到 SSH 配置文件(通常是 ~/.ssh/config)中。这些参数有助于在网络不稳定或者长时间无数据交换时保持 SSH 连接不被断开。下面是每个参数的具体作用&am…...

为后端做准备
这里写目录标题 flask 文件上传与接收flask应答(接收请求(文件、数据)flask请求(上传文件)传递参数和文件 argparse 不从命令行调用参数1、设置default值2、"从命令行传入的参数".split()3、[--input,内容] …...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...