JS部分内容可以查看MDN文档:https://developer.mozilla.org/zh-CN/
一、基本类型
- 数字(number) 用于表示数值,可以是整数或浮点数。【NaN、Infinity都是Number类型】
- 字符串(string) 用于表示文本内容。由单引号(')、双引号(")、反引号(`)包含的字符组成
- 布尔值(boolean) 只有true和false两个值,用于条件判断和罗技运算
- 空(null) 空对象指针,表示变量不引用任何对象,表示没有值的特殊类型。typeof检测null返回Object,说明null本身是Object未引用的状态。
- 未定义(undefined) 表示未赋值的变量。(1)当变量声明没有赋初始值时,默认为undefined。(2)调用函数时,函数定义的参数未接收,默认参数值为undefined。(3)定义对象的属性未赋值时,默认为undefined。(4)函数没有返回值,则默认返回undefined。
null和undefined的区别
Null只有一个值,是null。不存在对象。
Undefined只有一个值,是undefined。没有初始化。undefined是从null中派生出来的。
简单理解就是:undefined是没有定义的,null是定义了但是为空。
面向对象编程中一切皆对象(Object),但是对象又分为很多类型(对象属于引用型数据,因此这些分类又叫引用类型)。
内置对象就是指 JS 语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的最基本而必要的功能(属性和方法),内置对象最大的优点就是帮助我们快速开发
在JavaScript中,内置对象可以在任何地方直接使用,而不需要额外的导入或安装。这些内置对象提供了丰富的功能和方法,方便我们进行各种操作和处理。
全局对象(window)、数据类型对象(String、Array)、日期和时间对象(Date)、以及数学(Math)对象都是常用的内置对象。
二、引用类型
引用数据类型的原型,都是Object类型
- 对象(Object):对象是引用类型的基础,它是一组无序的键值对集合。对象可以使用字面量、构造函数或者Object.create()方法来创建。
- 数组(Array):数组是一种特殊的对象,其中的值按照数字索引(从零开始)进行存储。数组可以使用字面量或Array构造函数来创建。
- 函数(Function):函数可以接收参数,执行一些操作并返回值。可以使用Function构造函数、函数声明或者函数表达式来创建函数。【(1)函数声明、又叫函数定义:function 函数名( 参数列表 ) {函数体};(2)函数表达式,又叫函数字面量:let 函数名 = function xxx(参数列表) { 函数体 };(3)构造函数:let 函数名 = new Function("参数1", "参数2", "参数3", "函数体(return 返回值)");】
- 日期(Date):日期对象用于处理日期和时间,可以获取设置和计算日期和时间。
- 正则表达式(RegExp):正则表达式可以用来匹配和操作字符串。它由一个模式和一些可选的标志组成,可以进行字符匹配、替换和提取等操作。
- 错误对象(Error):let myError = new Error("This is an error message");
- Math对象(内置对象):它是一个内置对象,提供数学函数和常量
- JSON对象:JSON是一种用于表示数据的格式,虽然JSON是一种数据格式,但在JS中,一般解析为对象。【常用方法:JSON.stringify(对象转成JSON字符串),JSON.parse(JSON字符串转为对象)】
引用类型保存在堆内存中。
三、ES6中提供的数据类型
- Symbol:Symbol是一种原始数据类型,表示一个唯一的标识符。它可以用作对象属性的键,用于创建唯一的常量数值。Symbol类型的对象永远不相等,即便创建的时候传入相同的值,因此可以用来解决属性名冲突的问题。【Symbol("snow") !== Symbol("snow") //true 】
- Set:Set是一种新的集合数据结构,它允许存储任何类型的唯一值,Set中的值是无序的,且保持插入顺序。【类似于数组,(1)(特性)但成员的值都是唯一的,没有重复的值。(2)Set内部使用类似于Hash表的机制,所以插入和查找的效率很高,都为O(1)。(3)使用Set可以很容易地实现并集(Union)、交集(Intersection)、和差集(Difference)操作,因此非常适合用于处理集合运算】例子如下:
<script>// 创建一个 Set 对象const mySet = new Set();// 添加成员mySet.add(1);mySet.add(2);mySet.add(2); // 添加重复成员,Set 会自动去重mySet.add(3);// 检查成员是否存在console.log(mySet.has(1)); // 输出: trueconsole.log(mySet.has(4)); // 输出: false// 删除成员mySet.delete(2);console.log(mySet.has(2)); // 输出: false// 获取 Set 的大小console.log(mySet.size); // 输出: 2// 遍历 Set 成员for (let item of mySet) {console.log(item); // 输出: 1 3}console.log(mySet); //Set(2){1, 3}</script>
由于set的成员都是唯一的,所以经常用于需要去除数组中重复元素的场景。还有一些常用的方法。clear()从 set 对象中移除所有元素。keys() 和 values()方法等价。entries()方法返回一个新的迭代器对象,更多方法可以看mdn官网:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set#%E5%AE%9E%E4%BE%8B%E6%96%B9%E6%B3%95
- Map:Map是一种新的键值对数据结构,它类似于对象,但可以使用任意类型的值作为键,并且保持插入顺序。
- WeakSet:WeakSet是一种特殊的Set,它只能存储对象,并且对于存储的对象是弱引用,即如果没有其他引用指向这个对象,它将被垃圾回收。
- WeakMap:WeakMap是一种特殊的Map,它只能使用对象作为键,对于键所引用的对象是弱引用,即如果没有其他引用指向这个对象,它将被被垃圾回收掉。
ES6新增特性增强现有数据类型
- let和const关键字:用于声明块级作用域的变量(let)和常量(const)。
- Arrow function(箭头函数):一种更简洁的函数声明语法,提供了更方便的this绑定和更短的函数体写法
- Class(类):引入了class关键字,用于定义类和面向对象的编程。
- Promise(Promise对象):用于异步操作的解决方案,可以更优雅地处理异步编程。
BigInt是在ES2020中引入的一种新的数据类型,用于表示任意大小的整数。ES6的Number类型可以操作很大范围的数值,但精度有限,超过2^53-1的整数,JS的Number类型无法精确表示。而BigInt的出现解决了这个问题,允许JS能够安全地表示和操作任意大小的整数。
但是BigInt和JS的其他数字类型(如Number)是不兼容的,无法直接进行算术运算。运算的时候需要将BigInt转换为Number,或者Number转换为BigInt,但这样可能导致精度损失和溢出。在使用BigInt的时候要特别注意数据类型转换和精度问题。
(1)在前端将BigInt类型的数据传递给后端时,通常不会丢失精度。
(2)使用 BigInt 函数,需要注意,如果传入的是字符串类型的数字,则不会丢失精度;如果是整数,传参过程中可能会丢失精度。123n。
(3)在前后端分离的项目中,后端返回的数据可能因为长度过长而在前端解析时出现精度丢失。可以使用 json-bigint 插件来处理这个问题。安装该插件后,可以在Axios的配置中添加transformResponse选项,使用 JSONBig.parse(data) 来解析响应数据,从而保持大数的精度。