(数据类型)前端八股文修炼Day1

在这里插入图片描述

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

JavaScript中有以下种数据类型:

基本数据类型(Primitive Data Types):

  • String:表示文本数据,用单引号(')或双引号(")括起来。
  • Number:表示数字,包括整数和浮点数。
  • Boolean:表示逻辑值,即true或false。
  • Null:表示一个空值。 - Undefined:表示一个未定义的值。
  • Symbol(ES6新增):表示唯一的、不可变的值。
    引用数据类型(Reference Data Types):
  • Object:表示复杂数据结构,可以包含多个键值对。
    这些数据类型在 JavaScript 中有着不同的特点和用途:
  • Function: 作为一种特殊的数据类型,用于封装可重用的代码块,实现特定功能,是 JavaScript 中的重要组成部分。

基本数据类型在赋值、传递时是按值传递,即会创建一个新的值,原始值不受影响。

引用数据类型在赋值、传递时是按引用传递,即只是传递了指向对象的引用,多个变量可能指向同一个对象,修改其中一个会影响其他变量。

另外,JavaScript中的数据类型是动态的,变量的数据类型可以根据赋予的值自动改变。这种动态类型特性使得 JavaScript 在开发过程中更加灵活,但也需要开发者注意数据类型的转换和处理,以避免意外的问题。

2.数据类型检测的方式?

3.有哪些判断数组的方式?

4. null和undefined区别 typeof null 的结果是什么,为什么?

  • null:
    null 是一个表示“空”的值,用于指示变量未被赋值或者表示空对象引用。
    当我们想明确地表示一个变量为空时,可以将其赋值为 null。
    例如:let myVar = null;
  • undefined:
    undefined 表示一个变量声明了但未被赋值,或者访问对象属性不存在时返回的值。
    在 JavaScript 中,未初始化的变量会被默认赋值为 undefined。
    例如:let myVar; // myVar 的值为 undefined

对于 typeof null 的结果是 ‘object’,这是 JavaScript 设计上的一个历史遗留问题。在 JavaScript 的早期版本中,null 的二进制表示全为 0,而对象的二进制表示最后三位也为 0,因此 typeof null 返回 ‘object’。这个问题至今尚未修复,仍然存在于现代的 JavaScript 解释器中。
因此,虽然 null 是一个基本数据类型,但 typeof null 返回 ‘object’,这是 JavaScript 的一个特殊情况,开发者在使用 typeof 操作符时需要注意这个细节。

5.intanceof 操作符的实现原理

instanceof 操作符用于检查一个对象是否是一个特定类型(class 或者 constructor function)的实例。其实现原理是通过检查对象的原型链来确定对象的类型,即判断对象的原型链上是否存在指定类型的原型。
当使用 obj instanceof Constructor 这种形式进行检查时,JavaScript 引擎会沿着 obj 的原型链向上查找,看 Constructor.prototype 是否在 obj 的原型链上。如果在原型链上找到了 Constructor.prototype,则返回 true,否则返回 false。

6. 实现为什么0.1+0.2 ! == 0.3,如何让其相等?

这涉及到 JavaScript 浮点数精度的问题。在 JavaScript 中,所有数字都使用双精度浮点数表示,这会导致浮点数计算时出现精度丢失问题。因此,0.1 + 0.2 的结果并不精确等于 0.3,而是一个非常接近但不完全相等的值。

要解决这个问题,通常可以通过以下方法来处理:

1.转换为整数计算:将小数转换为整数,完成计算后再转回小数。
let result = (0.1 * 10 + 0.2 * 10) / 10; // 结果为 0.3
2.使用库函数:可以使用一些库函数或工具来处理精确计算,例如使用 BigDecimal.js、math.js 等库来进行精确计算。
3.比较误差范围:由于浮点数计算精度问题,可以比较两个浮点数之间的差值是否在一个很小的范围内来判断它们是否相等,而不是直接使用严格相等比较。

7.如何获取安全的 undefined 值?

  • 声明不赋值
    let a;
  • 返回 void 0
    let safeUndefined = void 0
  • 传递 undefined 作为参数:在某些情况下,将 undefined 明确传递给函数或方法也可以获得安全的 undefined 值。

8. typeof NaN 的结果是什么?isNaN 和 Number.isNaN 函数的区别?

  • isNaN:
    isNaN() 函数用来判断一个值是否是 NaN。
    当参数为非数值类型时,会先尝试将其转换为数值,然后判断是否是 NaN。
    例如,isNaN(‘hello’) 会返回 true,因为 ‘hello’ 会被转换为 NaN。
  • Number.isNaN:
    Number.isNaN() 是 ES6 新增的用于判断一个值是否为 NaN 的方法。
    与 isNaN() 不同的是,Number.isNaN() 不会尝试将参数转换为数值,只有当参数是真正的 NaN 时才会返回 true。
    例如,Number.isNaN(‘hello’) 会返回 false,因为 ‘hello’ 不是真正的 NaN。

总的来说,Number.isNaN() 更加严格和准确,只有当参数是 NaN 时才会返回 true,不会发生类型转换。而 isNaN() 在判断非数值类型时会进行类型转换,可能会导致一些意想不到的结果。因此,在判断一个值是否为 NaN 时,推荐优先使用 Number.isNaN()。

9. == 操作符的强制类型转换规则?

其他值到字符串的转换规则?
其他值到数字值的转换规则?
其他值到布尔类型的值的转换规则?
当使用 == 操作符比较两个值时,会根据以下规则进行强制类型转换:

  • 其他值到字符串的转换规则:
    如果其中一个操作数是字符串,另一个操作数会被转换为字符串。
    数字和布尔值转换为相应的字符串,例如 1 转换为 ‘1’,true 转换为 ‘true’。
    null 和 undefined 分别转换为 ‘null’ 和 ‘undefined’。
    对象会调用其 toString 方法进行转换,如果没有则调用 valueOf 方法。如果两个方法都没有返回原始值,则默认转换为 ‘[object Object]’。
  • 其他值到数字值的转换规则:
    如果其中一个操作数是数字,另一个操作数会被转换为数字。
    布尔值转换为数字时,true 转换为 1,false 转换为 0。
    字符串转换为数字时,会尝试解析字符串为数字,如果无法解析则转换为 NaN。
    null 转换为 0,undefined 转换为 NaN。
    对象会调用其 valueOf 方法进行转换,如果没有则调用 toString 方法。如果两个方法都没有返回原始值,则转换为 NaN。
  • 其他值到布尔类型的值的转换规则:
    布尔值保持不变。
    数字中只有 0 和 NaN 被转换为 false,其他数字都被转换为 true。
    字符串中只有空字符串 ‘’ 被转换为 false,其他字符串都被转换为 true。
    null、undefined 和 NaN 被转换为 false。
    对象会被转换为 true,无论对象是什么。
    这些转换规则适用于 JavaScript 中的类型转换,当需要将一个值转换为不同类型时,根据上述规则进行转换。

10. || 和 && 操作符的返回值?

这些逻辑运算符在实际开发中经常用于条件判断和简化代码逻辑。当其中一个操作数可以确定整个表达式的结果时,JavaScript 引擎会短路计算,即不会对第二个操作数进行求值,从而提高运行效率。

11. Object.is() 与比较操作符 “=”、“” 的区别?

Object.is() 方法和 === 操作符都是严格相等的比较方式,不会进行类型转换,而 == 操作符是松散相等的比较方式,可能会进行类型转换,因此在比较值时,优先考虑使用 Object.is() 或 === 来确保更准确的比较结果。

12.什么是 JavaScript 中的包装类型?

在 JavaScript 中,包装类型是指将基本数据类型(如数字、字符串、布尔值)包装成对象的过程。JavaScript 提供了三种包装类型:String、Number 和 Boolean。当我们尝试在基本数据类型上调用对象方法时,JavaScript 会临时将基本数据类型转换为包装类型,以便我们可以调用对象的方法。
虽然我们可以像操作对象一样操作包装类型的实例,但它们并不是完全相同的。包装类型是临时创建的对象,每次访问该值时都会创建一个新的包装对象,因此在比较包装对象时可能会遇到一些意外的行为。在一般情况下,推荐直接使用基本数据类型而非包装类型,除非需要调用对象方法或者明确需要对象的特性。

13.JavaScript 中如何进行隐式类型转换?

JavaScript 中的隐式类型转换是指在某些操作中,JavaScript 引擎会自动将一个数据类型转换为另一种数据类型。这种类型转换是由 JavaScript 引擎根据操作符和操作数的类型来执行的,并不需要显式地指定转换动作。

以下是一些常见的隐式类型转换情况:

  • 字符串转换:当一个非字符串类型的值与字符串相加时,非字符串类型会被自动转换为字符串类型。
    var num = 10;
    var str = "The number is: " + num; // num 会被转换为字符串,str 的值为 “The number is: 10”
  • 数字转换:当一个非数字类型(除了符号 -)的值参与数学运算时,会被自动转换为数字类型。
    var result = “10” * 2; // 字符串 “10” 会被转换为数字 10,result 的值为 20
  • 布尔值转换:在需要布尔值的地方(如条件判断、逻辑运算等),JavaScript 会将其他类型的值自动转换为布尔值。
    if (“hello”) {
    // “hello” 被转换为 true,执行这里的代码
    }
  • 比较操作符中的转换:在使用比较操作符时,JavaScript 会根据操作数的类型做出相应的转换。
    console.log(10 == ‘10’); // 字符串 ‘10’ 会被转换为数字 10,结果为 true
    虽然 JavaScript 中的隐式类型转换可以方便编码,但有时也会导致一些意外的行为,因此在编写代码时应该注意类型转换的规则,以避免出现不必要的错误。

15.为什么会有BigInt的提案?

BigInt 的提案是为了解决 JavaScript 中整数表示范围的限制。在 JavaScript 中,普通的数字类型(Number)使用双精度浮点数(64 位)表示,因此有一个固定的范围,超过这个范围的整数就会丢失精度。

BigInt 类型允许表示更大范围的整数,它可以安全地存储和操作超出普通数字类型表示范围的整数值。BigInt 可以表示任意精度的整数,只受限于计算机内存的限制。

BigInt 的提案引入了一种新的数据类型,通过在数字后面添加 n 来创建 BigInt:

const bigIntValue = 1234567890123456789012345678901234567890n;
BigInt 类型的引入使得 JavaScript 能够更好地处理大整数计算,如加密算法、大型数据集合等领域,提高了 JavaScript 在处理整数运算上的灵活性和准确性。BigInt 类型也能够解决一些传统数字类型无法处理的精度问题,使 JavaScript 在处理整数计算上更加强大和可靠。

16.object.assign和扩展运算法是深拷贝还是浅拷贝,两者区别

.Object.assign() 和扩展运算符在 JavaScript 中都用于对象的浅拷贝,但它们之间有一些区别:

  • 区别:
    1、语法:
    Object.assign(target, …sources) 是一个方法,第一个参数是目标对象,后面的参数都是源对象。
    扩展运算符 … 通常用于展开数组或对象,语法更简洁,直接在对象字面量或数组字面量中使用。
    2、应用场景:
    Object.assign() 适用于将多个源对象的属性复制到目标对象中,并返回目标对象。
    扩展运算符通常用于快速复制对象或数组的内容,通常在对象字面量、数组字面量、函数调用或解构赋值中使用。
    3、返回值:
    Object.assign() 方法会返回目标对象本身,源对象的属性会被复制到目标对象中。
    扩展运算符不会修改现有对象,而是创建一个新的对象或数组。

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

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

相关文章

【C语言】strcmp 的使⽤和模拟实现

前言 这篇文章将要带我们去实现模拟一个strcmp函数 首先我们要知道strcmp函数的定义 strcmp()定义和用法 我们先看一下strcmp在cplusplus网站中的定义 链接: link int strcmp ( const char * str1, const char * str2 );比较两个字符串将 C 字符串 str1 与 C 字符串 str2 …

4.Python数据分析—数据分析入门知识图谱索引(知识体系下篇)

4.Python数据分析—数据分析入门知识图谱&索引-知识体系下篇 一个人简介二机器学习基础2.1 监督学习与无监督学习2.1.1 监督学习:2.1.2 无监督学习: 2.2 特征工程2.3 常用机器学习算法概述2.3.1 监督学习算法:2.3.2 无监督学习算法&#…

数据结构/C++:位图 布隆过滤器

数据结构/C:位图 & 布隆过滤器 位图实现应用 布隆过滤器实现应用 哈希表通过映射关系,实现了O(1)的复杂度来查找数据。相比于其它数据结构,哈希在实践中是一个非常重要的思想,本博客将介绍哈希思想的两大应用,位图…

jmeter常用的函数

20211025白板 课前内容: 参数: 用户定义变量:它是一个全局变量,在启动运行时,获取一次值,在运行过程中,不会动态获取值。 用户定义变量,在启动时获取一次值,在运行过程中…

【Flutter 面试题】 什么是Flutter插件(Plugin)?如何使用和创建插件?

【Flutter 面试题】 什么是Flutter插件(Plugin)?如何使用和创建插件? 文章目录 写在前面口述回答补充说明使用插件创建插件 写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 3月28日,星期四

每天一分钟,知晓天下事! 2024年3月28日 星期四 农历二月十九 1、 四部门:培育空中摆渡、私人包机等新业态,2030年形成万亿级市场规模。 2、 市监总局发文规范外卖营销防止浪费:不将主食纳入满减优惠展示范围。 3、 多…

Fortinet 核心高管团队访谈:计划在所有产品系列中引入生成式AI

近期,Fortinet 发布了2023 财年第四季度及全年财报,再创骄人业绩!新增客户超 2.5 万,账单收入超 60 亿美元……对此,Fortinet 创始人、董事长兼首席执行官谢青(Ken Xie);首席财务官K…

SQL104 返回产品名称和每一项产品的总订单数(left join..on.. ,group by)

select prod_name,count(order_num) as orders from Products P left join OrderItems OI on OI.prod_id P.prod_id group by prod_name order by prod_name;left join一个数据条多的表 count(order_num),group by 另一个字段

前端学习<二>CSS基础——05-CSS样式表的继承性和层叠性

本文重点 CSS的继承性 CSS的层叠性 计算权重 权重问题大总结 CSS样式表的冲突的总结 权重问题深入 同一个标签,携带了多个类名 !important标记 CSS的继承性 我们来看下面这样的代码,来引入继承性: 上方代码中,我们给div标…

Ubuntu 系统下安装 Nginx

目录 一、Nginx是什么 ​二、Ubuntu 系统下安装 Nginx 1、安装包下载 2、上传服务器并解压缩 3、依赖配置安装 4、生成编译脚本 ​5、编译 6、开始安装 7、设置为随机自启动 7.1、创建 nginx.service 文件,将以下内容粘贴到文件中 7.2、将 nginx.service…

极简wordpress网站模板

Pithy设计师wordpress网站模板 精练简洁的wordpress模板,设计师或设计工作室展示型网站模板。 https://www.jianzhanpress.com/?p6329

C++哈希hash:位图、布隆过滤器的实现及应用

一、位图实现 1.1位图的原理 所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用 来判断某个数据存不存在的。 当我们想查找某一个数据是否存在或者是否处于某种状态时,相比于直接对存放数据的容器…

Redis是单线程还是多线程?(面试题)

1、Redis5及之前是单线程版本 2、Redis6开始引入多线程版本(实际上是 单线程多线程 版本) Redis6及之前版本(单线程) Redis5及之前的版本使用的是 单线程,也就是说只有一个 worker队列,所有的读写操作都要…

最新2024年增强现实(AR)营销指南(完整版)

AR营销是新的最好的东西,就像元宇宙和VR营销一样。利用AR技术开展营销活动可以带来广泛的利润优势。更不用说,客户也喜欢AR营销! 如果企业使用AR,71%的买家会更多地购物。40%的购物者准备在他们可以在AR定制的产品上花更多的钱。…

【nodejs ubuntu】nodejs版本过老的更新方法

使用apt方法安装的node.js版本过于老了,以至于我没法用npm下载hexo 下面是更新方法 参考了这篇文章 然后就可以成功安装了

【计算机网络】物理层

文章目录 第二章 物理层一、 物理层的基本概念1. 物理层接口特性 二、数据通信基础1. 典型的数据通信模型2. 数据通信相关术语3. 设计数据通信系统要考虑的3个问题4. 三种通信方式5. 串行传输&并行传输6. 同步传输&异步传输7. 码元8. 数字通信系统数据传输速率的两种表…

FFmpeg拉取RTSP流并定时生成10秒短视频

生成效果: 视频时长为10秒 生成格式为FLV 输出日志: 完整实现代码如下: 需要在Mac和终端先安装FFmpeg brew install ffmpeg CMake文件配置: cmake_minimum_required(VERSION 3.27) project(ffmpeg_open_stream) set(CMAKE_CXX_STANDARD 17)#头文件包目录 include_director…

C语言牛客网BC-37 牛牛的圆(求面积)

题目如下 代码实现 #include<stdio.h> int main() { float r 0;float s 0;scanf("%f",&r);s 3.14*r*r;printf("%.2f",s);return 0; } 创作不易&#xff0c;点点关注&#xff0c;感谢支持&#xff01;&#xff01;&#xff01;

IDEA设置代码自动提示不区分大小写

点击File–>Settings–>Editor --> General --> Code Completion&#xff0c;取消勾选Match case&#xff0c;即可实现代码自动提示不区分大小写

利用RWKV-Runner初步感受一下ai的世界

最近又听到群里的高手在讨论RWKV-Runner&#xff0c;于是没忍住&#xff0c;就想试试&#xff0c;没想到第一关就卡住了。 从群里大咖上传的RWKV-Runner_windows_x64.exe文件开始吧&#xff0c;又找了个虚拟机&#xff0c;直接放在桌面上运行一下&#xff0c;结果就跳出一堆文…