当前位置: 首页 > 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,内容] …...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目&#xff0c;集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...

Django RBAC项目后端实战 - 03 DRF权限控制实现

项目背景 在上一篇文章中&#xff0c;我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统&#xff0c;为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...