前端知识图谱 - JavaScript基础(变量和类型)

变量和类型

1. JavaScript 规定了几种语言类型?

JavaScript 语言的每一个值都属于某一种数据类型,它规定了 7 种语言类型。语言类型广泛用于变量、函数参数、表达式、函数返回值等场合,根据最新的语言标准,这 7 种语言类型如下:

  • Undefined
    Undefined 类型表示未定义,任何一个变量未定义之前都是 Undefined类型,值为 undefined。但需要我们注意的是,undefined 不是一个关键字,它可以作为一个变量被定义,所以当我们为一个变量直接赋值 undefined 的时候,有可能和预期效果出现偏差。
const undefined: number = 123;
const udf: number = undefined;	// echo 123

严谨一点的话,我们可以使用 void 运算,来把任意表达式转换为 undefined。例如:

const udf: undefined = void 0; // echo undefined

但在实际编程中,我们一般不会给 Undefined 类型的值赋值,这样可以保证它是一个未赋值的自然状态,从而让它的值为 undefined。

  • Null
    Null 类型表示定义了但为空,它和 undefined 还是有一定区别的。

  • String
    String 类型用来表示文本数据,只读。

  • Boolean
    Boolean 类型有两个值,用关键字 true 和 false 来表示逻辑意义上的真和假。

  • Number
    Number 类型表示通常意义上的数字,大致对应数学中的有理数。
    JavaScript 中的 Number 类型基本符合 IEEE 754-2008 规定的双精度浮点数规则,但它为特定的几个语言场景规定了几种特殊情况:

    • Infinity:无穷大。当一个数字除以 0 时,得到的结果就是 Infinity。
    • NaN:非数字。当一个数字和一个非数字(例如字符串)作加法之外的运算时,得到的结果就是 NaN。

    根据双精度浮点数的定义,Number 类型中有效的整数范围是 -0x1fffffffffffff 至 0x1fffffffffffff,所以 Number 无法精确表示此范围外的整数。
    根据双精度浮点数的定义,非整数的 Number 无法用 == 或 === 来比较。它也造成了一个 精度丢失 的问题:

    0.1 + 0.2 == 0.3	// echo false
    

    这里我们需要换一种比较方法:使用 JS 提供的最小精度值。

    Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON	// echo true
    
    最大数字:Number.MAX_VALUE = 1.7976931348623157e+308
    最大安全数字:Number.MAX_SAFE_INTEGER = 2 ^53 - 1 = 9007199254740991
    
  • Symbol
    自ECMAScript 2015起,Symbol 成为了一种新的原生类型,就像 Number 和 String 一样,表示独一无二的值。

  • Object
    Object 类型是 JS 中最复杂的类型,也是 JS 的核心机制之一,是一种无序的键值对集合。

2. 如何避免 JavaScript 浮点数运算精度丢失?

我们先来看一个经典问题:0.1 + 0.2 != 0.3

0.1 + 0.2 == 0.3	// echo false
0.1 + 0.2			// 0.30000000000000004
(0.1 + 0.2) * 10e16	// echo 30000000000000004

可以看到,相加的结果和预期差了一个微小值,我们后期计算的话就会出现误差。
为什么会这样呢?我们先来看看运算过程:小数转换二进制用的是 乘2取整法,就是不断乘2,小数为0为止,顺序排列。
通过计算,可得:

0.1 = 0.0001100(1100) = 2^-4 * 1.1001100(1100) // 1100循环
0.2 = 0.001100(1100) = 2^-3 * 1.1001100(1100)

JS 中数字存储使用的是 ieee 754 64位双精度浮点数,64 位中第 1 位为符号位,0 正 1 负;之后 11 位为指数位,用来确定范围;其余 52 位都是尾数位,用来确定精度。
由于 0.1 和 0.2 都是无限循环的二进制,保留位数 52 位,不算最左边整数位。最终计算机中存储的数位:

0.1 = 2^-4 * 1.100 11001100 11001100 11001100 11001100 11001100 11001100 1
0.2 = 2^-3 * 1.100 11001100 11001100 11001100 11001100 11001100 11001100 10.00011001100110011001100110011001100110011001100110011001
+
0.0011001100110011001100110011001100110011001100110011001
=
0.01001100110011001100110011001100110011001100110011001011
// 保留 52 为,末位进位(逢1进1)
0.01 00110011 00110011 00110011 00110011 00110011 00110011 00110.30000000000000004

原生解决办法:

parseFloat((0.1 + 0.2).toFixed(10))

或者使用像 decimal.js 这样的库,它们提供了更加精确的浮点数处理能力。

3. JavaScript 对象的底层数据结构是什么?

JavaScript 对象的底层数据结构并没有在规范中明确定义,不同的 JavaScript 引擎可能会采用不同的实现方式。在当前的主流 JavaScript 引擎中,比如 V8 引擎(Chrome 和 Node.js 使用的引擎),JavaScript 对象的底层实现是基于哈希表的。

哈希表是一种能够快速查找元素的数据结构,它通过计算元素的哈希值(一个用于确定元素位置的数字)来存储元素。当你访问对象的属性时,引擎会计算属性名的哈希值,并用它来快速找到相应的属性值。

需要注意的是,虽然大多数现代 JavaScript 引擎使用哈希表作为对象的底层数据结构,但这并不是规范规定的实现方式,不同的实现可能会有所不同。

4. 理解值类型和引用类型

值类型和引用类型是编程语言数据类型的两种基本分类,它们在内存中的存储和传递方式不同。

值类型又称为原始类型或原始值(primitive value),这类值直接存储在栈(Stack)内存中,基础数据类型的值不可修改。当我们定义一个变量,为它赋值时,可以理解为,我们为这个变量绑定了一个内存空间,值就存储在这个内存空间中。
我们定义两个基本类型的变量,把一个值赋值给另一个值,会进行值的复制,这两个变量的值是相互独立的,修改一个变量的值不会影响另一个变量的值。

引用类型的变量存储在栈上,但它们指向的对象存储在堆(Heap)上。堆是内存中的动态区域,相当于自留空间,程序在运行期间会动态分配给堆栈。堆中存储的一般都是对象,然后在栈内存中存储一个变量指针,计算机通过这个变量指针,找到堆中的数据块进行操作,这种访问方式叫做按引用访问。
我们定义两个变量,其中一个为引用类型,当我们把引用类型的变量赋值给另一个变量,只是复制了对象的引用(地址),两个变量指向的是同一个值,修改一个变量会影响另一个变量的值。

5. JavaScript 中的变量在内存中的具体存储形式

同上

6. Symbol类型在实际开发中的应用,手动实现一个简单的 Symbol

了解 JavaScript Symbol 类型及其应用场景
手动实现一个 Symbol:https://segmentfault.com/a/1190000015262174

7. 至少可以说出三种判断JavaScript数据类型的方式,以及他们的优缺点,如何准确的判断数组类型

let obj = { str: "", num: 0, bool: false, nul: null, und: undefined, sym: Symbol(), arr: [] }
  1. typeof:直接返回数据的类型字段。但无法区分 NullObjectArray,它们的返回值都是 object
console.log(typeof obj.str) // 'string'
console.log(typeof obj.num) // 'number'
console.log(typeof obj.bool) // 'boolean'
console.log(typeof obj.nul) // 'object'
console.log(typeof obj.und) // 'undefined'
console.log(typeof obj.sym) // 'symbol'
console.log(typeof obj.arr) // 'object'
console.log(typeof obj) // 'object'
  1. instanceof:只能判断引用类型数据,null、understand不支持判断
obj.str instanceof String // false
obj.num instanceof Number // false
obj.bool instanceof Boolean // false
obj.nul instanceof Null // Uncaught ReferenceError: Null is not defined
obj.und instanceof Undefined // ReferenceError: Undefined is not defined
obj.sym instanceof Symbol // false
obj.arr instanceof Array // true
obj instanceof Object // true
  1. Object.prototype.toString.call():完美的判断方法。
Object.prototype.toString.call(obj.str) // '[object String]'
Object.prototype.toString.call(obj.num) // '[object Number]'
Object.prototype.toString.call(obj.bool) // '[object Boolean]'
Object.prototype.toString.call(obj.nul) // '[object Null]'
Object.prototype.toString.call(obj.und) // '[object Undefined]'
Object.prototype.toString.call(obj.sym) // '[object Symbol]'
Object.prototype.toString.call(obj.arr) // '[object Array]'
Object.prototype.toString.call(obj) // '[object Object]'
  1. Array.isArray():数组类型内置的判断方法。
Array.isArray(obj.arr) // true
Array.isArray(obj) // false

参考:
js的7中语言类型详解 - https://www.cnblogs.com/lilistyle/p/13613756.html
解析 js 中 0.1 + 0.2 != 0.3 - https://www.php.cn/faq/386908.html

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

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

相关文章

【GCC】2015: draft-alvestrand-rmcat-congestion-03 机器翻译

腾讯云的一个分析,明显是看了这个论文和草案的 : 最新的是应该是这个 A Google Congestion Control Algorithm for Real-Time Communication draft-ietf-rmcat-gcc-02 下面的这个应该过期了: draft-alvestrand-rmcat-congestion-03

python:用 sklearn 构建线性回归模型,并评价

编写 test_sklearn_6.py 如下 # -*- coding: utf-8 -*- """ 使用 sklearn 估计器构建线性回归模型 """ import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib import rcParamsfrom sklearn import dataset…

系统思考—战略共识

当企业不增长的时候&#xff0c;是忙着救火&#xff0c;还是在真正解决问题&#xff1f; 最近遇到很多领导者&#xff0c;把精力放在“管理”上&#xff0c;希望通过抓细节提升效率&#xff0c;解决经营问题。结果呢&#xff1f;全公司上上下下忙成了一团乱麻&#xff0c;但不…

web3跨链桥协议-Nomad

项目介绍 Nomad是一个乐观跨链互操作协议。通过Nomad协议&#xff0c;Dapp能够在不同区块链间发送数据&#xff08;包括rollups&#xff09;&#xff0c;Dapp通过Nomad的合约和链下的代理对跨链数据、消息进行验证、传输。其安全通过乐观验证机制和欺诈证明制约验证者实现&…

微信小程序实现画板画布自由绘制、选择画笔粗细及颜色、记录撤回、画板板擦、清空、写字板、导出绘图、canvas,开箱即用

目录 画板创建canvas绘制及渲染画笔粗细功能实现画笔颜色选择画笔痕迹撤回、板擦、画布清空canvas解析微信小程序中 canvas 的应用场景canvas 与 2D 上下文、webgl 上下文的关系图像的加载与绘制说明代码说明画板创建 canvas绘制及渲染 在wxml添加对应的canvas标签代码,并在j…

网站灰度发布?Tomcat的8005、8009、8080三个端口的作用什么是CDNLVS、Nginx和Haproxy的优缺点服务器无法开机时

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

解锁BL后的K40降级

1 下载刷机工具 https://miuiver.com/miflash/ 2、下载刷机包 https://xiaomirom.com/series/ 下载ROM包&#xff0c;12.0.8比较好 3 打开第一步下载的刷机工具 打开首次安装驱动&#xff0c; 接下来先选择个重要的东西&#xff0c;如果不想重新上BL那就选择全部删除…

蓝桥杯刷题——day8

蓝桥杯刷题——day8 题目一题干解题思路代码 题目二题干解题思路代码 题目一 题干 N 架飞机准备降落到某个只有一条跑道的机场。其中第i架飞机在 Ti时刻到达机场上空&#xff0c;到达时它的剩余油料还可以继续盘旋 Di个单位时间&#xff0c;即它最早可以于 Ti时刻开始降落&am…

redis数据类型:list

list 的相关命令配合使用的应用场景&#xff1a; 栈和队列&#xff1a;插入和弹出命令的配合&#xff0c;亦可实现栈和队列的功能 实现哪种数据结构&#xff0c;取决于插入和弹出命令的配合&#xff0c;如左插右出或右插左出&#xff1a;这两种种方式实现先进先出的数据结构&a…

IDEA中解决Edit Configurations中没有tomcat Server选项的问题

今天使用IDEA2024专业版的时候,发现Edit Configurations里面没有tomcat Server,最终找到解决方案。 一、解决办法 1、打开Settings 2、搜索tomcat插件 搜索tomcat插件之后,找到tomcat 发现tomcat插件处于未勾选状态,然后我们将其勾选保存即可。 二、结果展示 最后,再次编…

复习打卡大数据篇——Hadoop HDFS 02

目录 1. HDFS辅助工具 2. namenode安全模式 1. HDFS辅助工具 跨集群数据拷贝 当我们需要跨集群进行文件数据的拷贝时可以用&#xff1a; hadoop distcp 集群1的某个文件路径 要拷贝到集群2的地址路径 文件归档工具archive 由于HDFS的块的数量取决于文件的大小和数量&…

Mamba安装环境和使用,anaconda环境打包

什么是mamba Mamba是一个极速版本的conda&#xff0c;它是conda的C重新实现&#xff0c;使用多线程并行处理来加速包和依赖项的下载。 Mamba旨在提高安装、更新和卸载Python包的速度&#xff0c;同时保持与conda相同的兼容性和命令行接口。 Mamba的核心部分使用C实现&#xff…

Sigrity System Explorer Snip Via Pattern From Layout模式从其它设计中截取过孔模型和仿真分析操作指导

Sigrity System Explorer Snip Via Pattern From Layout模式从其它设计中截取过孔模型和仿真分析操作指导 Sigrity System Explorer Snip Via Pattern From Layout模式支持从其它设计中截取过孔模型用于仿真分析,同样以差分模板为例 具体操作如下 双击打开System Explorer软件…

顺序表的操作

注意位序和数组下标的关系 插入&#xff1a; 插入的时间复杂度&#xff1a; 最深层语句&#xff1a; 最好情况 最坏情况 平均情况 删除&#xff1a; 查找&#xff1a;

以腾讯混元模型为例,在管理平台上集成一个智能助手

背景 前几天&#xff0c;公司的同事们一起吃了个饭&#xff0c;餐桌上大家聊到大模型的落地场景。我个人在去年已经利用百度千帆平台写过案例&#xff0c;并发过博客&#xff08;传送门&#x1f449;&#xff1a;利用文心千帆打造一个属于自己的小师爷&#xff09;&#xff0c…

计算机基础 试题

建议做的时候复制粘贴,全部颜色改为黑色,做完了可以看博客对答案。 一、单项选择题(本大题共25小题,每小题2分,共50分〉 1.计算机内部采用二进制数表示信息,为了便于书写,常用十六进制数表示。一个二进制数0010011010110用十六进制数表示为 A.9A6 B.26B C.4D6 D.…

[机器学习]XGBoost(3)——确定树的结构

XGBoost的目标函数详见[机器学习]XGBoost&#xff08;2&#xff09;——目标函数&#xff08;公式详解&#xff09; 确定树的结构 之前在关于目标函数的计算中&#xff0c;均假设树的结构是确定的&#xff0c;但实际上&#xff0c;当划分条件不同时&#xff0c;叶子节点包含的…

【AI驱动的数据结构:包装类的艺术与科学】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 包装类装箱和拆箱阿里巴巴面试题 包装类 在Java中基本数据类型不是继承来自Object&#xff0c;为了…

探索Moticon智能传感器鞋垫OpenGo的功能与优势

Moticon智能传感器鞋垫OpenGo是一款专为运动科学和临床研究设计的先进工具。它通过13枚压力传感器、1枚3D加速器和1枚温度传感器&#xff0c;实时监测脚部的压力分布和步态变化。用户可以通过配套的Beaker应用&#xff0c;将这些数据以图表形式呈现&#xff0c;便于分析和理解。…

hive注释comment中文乱码解决

问题描述 当使用以下命令查看表的元数据信息时出现中文乱码&#xff08;使用的是idea连接hive&#xff09; desc formatted test.t_archer; 解决 连接保存hive元数据的MySQL数据库&#xff0c;执行以下命令&#xff1a; use hive3; show tables;alter table hive3.COLUMNS_…