JavaScript 前端面试 1 (数据类型、数据结构)

发布于:2025-02-19 ⋅ 阅读:(122) ⋅ 点赞:(0)

一: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

  • 0NaN 转换为 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 有三个属性:

  1. name 属性:值为字符串 "nic"

  2. age 属性:值为数字 29

  3. 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-列表长度(即使是高效的散列表也会存在两个键值映射为一个值的可能--碰撞,避免方法有:开链法、线性探测法)

使用条件:数据的插入、删除、取用 不适合查找数据


网站公告

今日签到

点亮在社区的每一天
去签到