当前位置: 首页 > news >正文

面试 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!

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

相关文章:

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

面试 JavaScript 框架八股文十问十答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;JavaScript有哪些…...

【发票识别】新增针对图片发票的识别(升级中)

说明 为了完善发票识别的功能&#xff0c;目前发票识别支持发票图片格式的识别&#xff0c;增加可用性。 体验 体验地址&#xff1a;https://invoice.behappyto.cn/invoice-service/ 体验地址上面有示例的发票&#xff0c;可以下载上传识别或者复制url地址进行识别。 技术栈…...

面试数据结构与算法总结分类+leetcode目录【基础版】

&#x1f9e1;&#x1f9e1;&#x1f9e1;算法题目总结&#xff1a; 这里为大家总结数据结构与算法的题库目录&#xff0c;如果已经解释过的题目会标注链接更新&#xff0c;方便查看。 数据结构概览 Array & String 大家对这两类肯定比较清楚的&#xff0c;同时这也是面试…...

音频二维码怎么制作出来的?支持多种格式音频生码的方法

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

ReactNative实现一个圆环进度条

我们直接看效果&#xff0c;如下图 我们在直接上代码 /*** 圆形进度条*/ 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逆向学习】今日头条

逆向目标 目标网页&#xff1a;https://www.toutiao.com/?wid1707099375036目标接口&#xff1a;https://www.toutiao.com/api/pc/list/feed目标参数&#xff1a;_signature 逆向过程 老规矩先观察网络请求&#xff0c;过滤XHR请求观察加密参数&#xff0c;发现Payload的_s…...

Tailwind CSS

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

Go语言每日一练——链表篇(五)

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

5-4、S加减单片机程序【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本节介绍实现步进电机S曲线运动的代码 一、目标功能 实现步进电机转动总角度720&#xff0c;其中加减速各90 加速段&#xff1a;加速类型&#xff1a;S曲线  加速角度&#xff1a;角度为90  起步速度…...

【安卓跨程序共享数据,探究ContentProvider】

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

abap - 发送邮件,邮件正文带表格和excel附件

发送内容 的数据获取&#xff1a; 正文部分使用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

安装不麻烦&#xff0c;环境配置挺麻烦&#xff0c;主要是gcc、cmake和ccmake的版本不匹配问题。 环境&#xff1a; gcc -- 7.5.0 cmake -- 3.15.2 ccmake -- 3.15.2 参考以下两篇博客安装&#xff1a; 1、 ITK的安装与测试&#xff08;Ubuntu系统&#xff09;_ubuntu20…...

【C语言】简易计算器转移表(函数指针简化)

什么是转移表&#xff1f; 转移表是一种根据输入条件进行分支选择的技术。它通常用于根据不同的条件执行不同的操作。在 C 语言中&#xff0c;我们可以使用 switch 语句来创建转移表&#xff0c;根据表达式的值选择不同的分支执行。 计算器转移表的普通实现 #include<stdi…...

JavaBase持续更新

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

AI专题:海外科技巨头指引,AI主线逻辑依旧坚挺

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

性能测试工具LoadRunner与登录性能测试分析

1. LoadRunner与Jmeter Jmeter是开源免费的&#xff0c;LoadRunner是商业收费的。 但是LoadRunner具有非常强大的录制功能&#xff0c;具有丰富且灵活的场景&#xff0c;具备丰富的报告性能。 1&#xff09;Jmeter没有录制功能 2&#xff09;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并发编程新书

大家好&#xff0c;我是飞哥&#xff01; 并发编程并不是一个新话题&#xff0c;但是我觉得在近几年以及未来的时间里&#xff0c;并发编程将显得越来越重要。 为什么这样讲&#xff0c;让我们先回到一个基本的问题上来&#xff0c;为什么我们要采用并发编程&#xff1f;关于这…...

Jgit Packfile is truncated解决方案

配置方式解决 这两个配置选项是用于提高 SSH 连接稳定性的 SSH 客户端配置参数&#xff0c;它们被添加到 SSH 配置文件&#xff08;通常是 ~/.ssh/config&#xff09;中。这些参数有助于在网络不稳定或者长时间无数据交换时保持 SSH 连接不被断开。下面是每个参数的具体作用&am…...

为后端做准备

这里写目录标题 flask 文件上传与接收flask应答&#xff08;接收请求&#xff08;文件、数据&#xff09;flask请求&#xff08;上传文件&#xff09;传递参数和文件 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符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 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 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;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…...