一:JavaScript中有哪些数据类型?在存储上的差异?
JavaScript的数据类型分为两类:基本类型 和 引用类型
两者的区别是存储位置不同
1:基本类型
基本类型有以下六种:
Number数字类型,用于表示整数或浮点数。 |
String字符串类型,用于表示文本数据 |
Boolean布尔类型,用于表示 true 或 false。 |
Undefined未定义类型,表示变量未初始化。 |
null空值类型,表示一个空值。 |
symbol(ES6 新增):符号类型,用于创建唯一的、不可变的数据类型。 |
注:其实还有 BigInt(ES11 新增):大整数类型,用于表示大于 2^53 - 1
的整数。在此不做学习目标
1.1 Number类型:
数值最常见的整数类型格式为十进制,还可以设置八进制(0开头)、十六进制(0x开头)
浮点型在数值汇总必须包含小数点,还可以使用科学计数法表示
在数值类型中存在一个特殊类型NaN,表示这不是数值,代表着原本要返回数值的操作失败了。(不是抛出错误)
1.2 Undefinde
Undefinde类型只有一个值,就是特殊值Undefinde。当我们使用var 、let声明变量但是没有初始化的时候就相当于给变量赋予了Undefinde值。
1.3 Sring
字符串可以用 双引号"" 单引号 '' 反引号 `` 标识
字符串是不可变的,代表一旦创建值就不能改变
1.4 null
只有一个值 特殊值:null 表示一个空对象指针,这也是 type of 传给一个null时会返回object的原因
undefined的值是由null派生来的
只要变量要保存对象而当时又没有那个对象可保存,就可以用null来填充该变量
1.5 Boolean
布尔值:true 、false
可以把其他类型转换成布尔值,转换规则如下:
数据类型 | 转换成true的值 | 转换成false的值 |
String | 非空字符串 | “” |
Number | 非0数值(包括无穷) | 0、NaN |
Object | 任意对象 | null |
Undefined | N/A(不存在) | undefined |
. 字符串 (String)
-
非空字符串转换为
true
-
空字符串 (
""
) 转换为false
console.log(Boolean("hello")); // true
console.log(Boolean("0")); // true
console.log(Boolean("")); // false
. 数值 (Number)
-
非 0 数值(包括无穷)转换为
true
-
0
、NaN
转换为false
console.log(Boolean(42)); // true
console.log(Boolean(-10)); // true
console.log(Boolean(Infinity)); // true
console.log(Boolean(NaN)); // false
console.log(Boolean(0)); // false
. 对象 (Object)
-
任意对象转换为
true
-
null
转换为false
console.log(Boolean({})); // true
console.log(Boolean([])); // true
console.log(Boolean(null)); // false
. undefined
-
undefined
转换为false
console.log(Boolean(undefined)); // false
1.6 Symbol
Symbol (符号)是原始值,实例是唯一的不可变的,主要用途是确保对象属性使用唯一标识符,避免发生属性冲突。
2:引用类型
复杂类型统称为Object,主要讨论以下三种:
Object |
Array |
Function |
2.1 Object
创建object常用方式 是为对象字面量表示法,属性名可以是字符串或者数值
let person = {name: "nic","age": 29,5: true
};console.log(person.name); // 输出: nic
console.log(person.age); // 输出: 29
console.log(person[5]); // 输出: true
总结
这个Object对象 person
有三个属性:
-
name
属性:值为字符串"nic"
。 -
age
属性:值为数字29
。 -
5
属性:值为布尔值true
。
2.2 Array
JavaScript数组是一组有序的数据,和其他语言不同的是数组每个槽位都可以存储任意类型的数据,并且数组也是动态大小,会随着数据添加字段增长。
2.3 Function
函数实际上是对象,每个函数都是Function类型的实例,Function也有自己的属性和方法,和其他引用类型一样
函数存在三种常见的表达方式:
函数的声明:
函数表达式:
箭头函数:
注:除了上述三种其实还包括:Date、RegExp、Map、Set......
2.4 存储区别
基本数据类型存储在栈中,引用类型的对象存储于堆中
2.4.1 基本类型的赋值过程
初始栈内存
a | 10 |
a赋值给b
a | 10 |
b | 10 |
栈内存b保存了另一个值
a | 10 |
b | 20 |
2.4.2 引用类型的赋值过程
初始堆内存
obj1 | 引用地址1 |
a复制地址给b
obj1 | 引用地址1 |
obj2 | 引用地址1 |
堆内存b保存了另一个值
obj1 | 引用地址1 |
obj2 | 引用地址1添加了name属性 |
由于地址是一样的二者共用的,所以改变2 的名称1也会有name属性。
二、说说对于js数据结构的了解
1:什么是数据结构?
数据结构是计算机存储、组织数据的方式。
数据结构意味着接口或是封装
常见的数据结构有:
数组 Array |
栈 Stack |
队列 Queue |
链表 Linked List |
字典 |
散列表 Hash table |
树 Tree |
图 Graph |
堆 Heap |
2.数组
数组是使用一块连续的内存框架保存数据,保存的数据个数在分配内存的时候就是确定的。
3.栈
遵循后进先出原则的有序集合
在栈中新元素接近栈顶,旧元素接近栈底
加入和拿出元素都是在顶部操作(类似和果汁的杯子,上面是新到出来的,喝的时候也是喝新的)
4.队列
遵循先进先出(就像排队结账先来的先服务)
从队尾添加新元素在顶部移除元素,新元素必须在队尾
5.链表
为什么有了数组还要设计链表呢?因为在js里面数组被实现成了对象,效率很低如果数组效率很低就可以考虑换成链表来代替他
替换的条件:
链表集合可以用在任意可以使用的一维数组的情况中
如果需要随机访问,数组是更好的选择
6.字典
字典是键值对存储数据的数据结构,js的object就是以字典的形式设计的。
7.散列表
也称为哈希表,特点是插入、删除、取用都非常快。数组和链表想要找到一个数据都需要从头遍历,而散列表可以基于数组进行设计,数组长度是预先设定的,所有元素和该元素对应的键,保存在数组的特点位置,这里键和对象的键是类型的概念。
使用散列表存储数组时通过一个散列函数将键映射为一个数字,范围是0-列表长度(即使是高效的散列表也会存在两个键值映射为一个值的可能--碰撞,避免方法有:开链法、线性探测法)
使用条件:数据的插入、删除、取用 不适合查找数据