js中的数据类型
基本数据类型及其拓
js中的基本数据类型(8种)
undefined null boolean number String object Symbol Bigint
先带大家从基本的的出处,作用,使用三部分去了解一下
Undefinde:表示变量已声明但未赋值的空值状态,是原始类型。
- ECMAScript 标准定义的原始值
- 变量声明后未赋值,默认值就是
undefined - 函数无返回值时,默认返回
undefined
作用
- 标记未初始化的变量
- 区分「变量存在但没值」和「变量不存在」
使用
// 1. 声明变量不赋值
let a; console.log(a); // undefined
//2. 函数无return
function fn() {} console.log(fn()); // undefined
// 3. 判断
typeof a === 'undefined' // true
null:表示空对象指针,人为定义的「空值、无值」,原始类型。
出处
- ECMAScript 标准定义的原始值
- 设计初衷:表示空的对象引用
作用
- 手动清空变量、释放对象引用
- 明确表示「这个变量现在没有值」
使用:
// 手动赋值为空
let obj = null;
// 清空对象
let user = { name: '张三' };
user = null; // 释放内存
// 判断 obj === null // true
boolean:只有 true(真)和 false(假)两个值,原始类型。
出处
- JavaScript 基础逻辑类型,源于计算机布尔逻辑
作用
- 用于条件判断、逻辑运算(if/else、循环、比较)
使用
// 直接赋值
let isOpen = true;
let isLogin = false;
// 条件判断
if (isLogin) {
console.log('已登录');
}
// 比较运算返回布尔值
10 > 5 // true
Number:表示整数、浮点数、特殊数值,基于 IEEE 754 双精度浮点数,原始类型。
出处
- ECMAScript 标准定义的数值类型
- 包含:整数、小数、
Infinity、-Infinity、NaN
作用
- 存储和计算所有数字类型数据(年龄、价格、坐标等)
使用
// 整数
let age = 20;
// 浮点数
let price = 99.9;
// 特殊数值
let max = Infinity; // 无穷大
let err = NaN; // 非数字(计算错误)
// 运算
10 + 5 // 15
String :由单引号 / 双引号 / 反引号包裹的文本字符序列,原始类型。
出处
- JavaScript 标准文本类型,用于存储字符数据
作用
- 存储和处理文本、字符、HTML 片段等
使用
// 三种定义方式
let str1 = 'hello';
let str2 = "world";
let str3 = `你好,${str1}`; // 模板字符串
// 取值
str1[0] // 'h'
object :唯一的引用类型,用于存储键值对、复杂数据集合。
出处
- JavaScript 核心引用类型,所有非原始类型都是对象(数组、函数、日期等)
作用
- 存储复杂结构数据(多个属性、方法的集合)
- 模拟现实世界实体(用户、商品、订单)
使用
// 对象字面量
let user = {
name: '李四',
age: 25,
sayHi() { console.log('hi'); }
};
// 访问属性
user.name // 李四
user.sayHi() // 执行方法
Symbol:ES6 新增,唯一且不可变的原始值,用于创建唯一标识符。
出处
- ECMAScript 2015(ES6)标准新增
作用
- 避免对象属性名冲突
- 定义私有 / 不可覆盖的对象属性
使用
// 创建唯一值
let s1 = Symbol('id');
let s2 = Symbol('id');
s1 === s2 // false(永远不相等)
// 用作对象属性
let obj = {
[s1]: 100
};
bigint(大整数):ES2020 新增,用于存储超出 number 范围的超大整数,原始类型。
出处
- ECMAScript 2020 标准新增
作用
- 解决
number无法精确表示超大整数的问题 - 用于金融、高精度计算、大数据场景
使用
// 数字后加 n 定义
let bigNum = 123456789012345678901234567890n;
// 运算
bigNum + 10n // 正确计算超大数
// 注意:不能和 number 混合运算
相信很多小伙伴已经注意到原始数据类型,引用数据类型这几个字眼了,接下来给大家讲解一下这块的内容,会涉道堆和栈。、
js中的堆和栈 --社区内有很清楚的文章 (作者:likang )
一、 栈(stack)和 堆(heap)
栈(stack): 是栈内存的简称,栈是自动分配相对固定大小的内存空间,并由系统自动释放, 栈数据结构遵循FILO(first in last out)先进后出的原则,较为经典的就是乒乓球盒结构,先放进去的乒乓球只能最后取出来;
堆(heap): 是堆内存的简称,堆是动态分配内存,内存大小不固定,也不会自动释放, 堆数据结构是一种无序的树状结构,同时它还满足key-value键值对的存储方式;我们只用知道key名,就能通过key查找到对应的value。比较经典的就是书架存书的例子,我们知道书名,就可以找到对应的书籍;
栈的特点: 开口向上、速度快,容量小 ; 堆的特点:速度稍慢、容量比较大;
二、 基本类型和引用类型
基本数据类型:Undefined,String,Boolean,Null,Number, 都是直接按值存放在栈内存中,占用的内存空间的大小是确定的,并由系统自动分配和自动释放。这样带来的好处就是,内存可以及时得到回收,相对于堆来说,更加容易管理内存空间。
引用数据类型:指那些可能由多个值构成的对象,如对象(Object)、数组(Array)、函数(Function) ,它们是通过拷贝和new出来的,这样的数据存储于堆中。
三、 传值和传址的区别
基本类型:采用的是值传递。
引用类型:则是地址传递。
引用类型的数据的地址指针是存储于栈中的,将存放在栈内存中的地址赋值给接收的变量。当我们想要访问引用类型的值的时候,需要先从栈中获得对象的地址指针,然后,在通过地址指针找到堆中的所需要的数据(保存在堆内存中,包含引用类型的变量实际上保存的不是变量本身,而是指向该对象的指针)。
四、 内存分配垃圾回收
1.内存分配:
(1)栈内存: 线性有序存储,容量小,系统分配效率高。
(2)堆内存: 首先要在堆内存新分配存储区域,之后又要把指针存储到栈内存中,效率相对就要低一些了。
2.垃圾回收:
(1)栈内存: 变量基本上用完就回收了,相比于堆来说存取速度会快,并且栈内存中的数据是可以共享的。
(2) 堆内存:堆内存中的对象不会随方法的结束而销毁,就算方法结束了,这个对象也可能会被其他引用变量所引用(参数传递)。创建对象是为了反复利用(因为对象的创建成本通常较大),这个对象将被保存到运行时数据区(也就是堆内存)。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。
有了这些内容,相信大家遇到面试官问你js中有哪些基本数据类型时,应该可以很得心应手的回答上来:
可以这样去回答:
- 有哪些,分别有什么作用
- 分类讨论(原始数据类型和引用数据类型 ) 适当提自己对于堆和栈的理解 3.拓展(如自己项目会怎么取用)