面试 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,内容] …...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...

Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...