目录
一.前言
二.Ecmascript 规定的变量有两种
补充
1.基本数据类型(重点掌握)
基本数据类型的特点
2.引用数据类型 (重点掌握)
引用数据类型的特点
三.什么是栈?堆?
下面代码帮助了解
解释
官方解释
总结
四.小练习 (烧脑面试题)
解释
完整代码
一.前言
在计算机编程中,数据是关键的组成部分。了解数据的类型和特性对于编写高效和可靠的代码至关重要。在许多编程语言中,包括JavaScript,数据可以分为两大类别:基本数据类型和引用类型。
基本数据类型是指存储简单数据值的类型,它们被视为不可改变的。在JavaScript中,基本数据类型包括数字(Number)、字符串(String)、布尔值(Boolean)、空值(Null)、未定义(Undefined)和符号(Symbol)。这些类型的变量在内存中直接存储它们的值,且每个变量都相互独立,互不影响。
引用类型是指存储对象和复杂数据结构的类型,它们可以包含多个值并具有其自己的方法和属性。在JavaScript中,引用类型包括对象(Object)、数组(Array)、函数(Function)等。与基本数据类型不同,引用类型的变量实际上存储的是对象在内存中的引用地址,而不是对象本身。这意味着多个变量可以引用同一个对象,对其中一个引用进行修改会影响到其他引用。
深入了解基本数据类型和引用类型的区别和特性对于开发者来说是至关重要的。这种了解有助于理解变量的行为、内存管理、函数传参、数据操作等方面的工作原理。它们的使用和处理方式可能不同,因此我们需要掌握如何正确地操作和使用不同的数据类型,以避免潜在的错误和性能问题。
在接下来的内容中,我们将深入研究基本数据类型和引用类型的各项特性和用法,让你更加熟悉它们之间的区别,为编写高质量的代码打下坚实的基础。
二.Ecmascript 规定的变量有两种
Ecmascript 规定变量有两种不同的数据类型:基本类型 和 引用类型
基本类型 包括:number boolean string undefined
引用类型 包括:数组和对象
补充
也有其他的不同分类 原始类型 和 对象类型
或者 拥有方法的类型 和没有方法的类型
可变类型 和 不可变类型
以上的这些叫法都是依据两种类型特点来命名的,他们只是叫法不同其本质上都是数据类型。
1.基本数据类型(重点掌握)
基本数据类型的特点
基本类型的特点
基本类型的比较是 值的比较
基本类型的值是不能变的
基本类型的值 存在于 栈区中
2.引用数据类型 (重点掌握)
引用数据类型的特点
引用类型的特点
引用类型的值 是 可变的
引用类型的比较是 引用的比较
引用类型的值 存在于 栈内存和堆内存中
三.什么是栈?堆?
栈:指的是栈内存,存放的数据是先进后出,栈自动分配内存空间,也会自动释放内存空间
堆:指的是堆内存,动态分配内存空间,大小不确定,也不会自动释放内存空间先进先出。
下面代码帮助了解
let arr = [1,2,3,4];let arr1 = arr; //此时arr1指向 堆内存中的 数组空间arr[1]='分手快乐';arr[2]='说散就散';console.log(arr); //说明arr1 和arr同时指向一个地方
解释
将数组
arr
赋值给arr1
时,实际上是将堆内存中数组的引用复制给了arr1
。这意味着arr
和arr1
都指向相同的数组空间。所以,当你修改
arr
中的元素时,例如arr[1] = '分手快乐'
和arr[2] = '说散就散'
,这些修改会反映在原始的数组上。由于arr1
指向同一个数组,因此也会反映在arr1
上。这是因为数组是引用类型,在 JavaScript 中,对象(包括数组)的赋值是传递引用的。所以,
arr
和arr1
引用了相同的数组对象,它们指向相同的内存空间。任何针对该数组的更改都会被反映在两个变量上。
官方解释
在计算机科学中,栈(Stack)和堆(Heap)是两种常见的数据结构,用于管理程序在内存中的分配和存储。
栈(Stack)是一种后进先出(Last-In-First-Out,LIFO)的数据结构。它类似于现实生活中的堆叠物品,只能从最顶端插入和删除数据。当一个函数被调用时,函数的局部变量和参数被存储在栈内存中。每当一个新的函数调用发生时,该函数的数据被压入栈的顶部,形成一个称为栈帧(Stack Frame)的数据块。当函数执行完成后,栈帧被移出栈,控制权返回给调用函数。栈的大小通常是有限的,并受限于操作系统或编程语言的设定。
堆(Heap)是一种用于动态分配内存的区域。与栈不同,堆的内存分配和释放没有特定的顺序,它是一种自由存储区域。在堆上分配的内存可以通过指针进行访问,并且在不同的部分之间共享。在编程中,动态创建的对象、数组和其他复杂数据结构通常存储在堆内存中。在堆上分配的内存需要手动进行释放,否则可能会导致内存泄漏。
栈和堆在内存管理方面具有不同的特点和使用场景。栈的存储和释放速度较快,但容量有限,适合存储简单的局部变量和函数调用的上下文信息。堆则可以动态分配大量的内存空间,但需要程序员负责手动分配和释放内存,并且会存在一定的分配和释放开销。
总结
总的来说,栈和堆是计算机内存管理中的两个重要概念。栈用于存储函数调用和局部变量,具有快速的分配和释放特性;而堆用于动态分配内存,适合存储较大的对象和复杂的数据结构,但需要手动管理内存的分配和释放。
四.小练习 (烧脑面试题)
let num = num1 =10let a = {m:1}let b = a;a.x = a = {n:1} console.log(a.x);console.log(b.x);
解释
由于 . 操作高于 联= ,因此先算a.x = {n:1},此时a 和b指向的是内存中
的同一个空间,因此b = {m:1,x:{n:1} }
然后再计算 a = {n:1},这样之前声明的a 会被直接释放,只留下一个新的a={n:1}
综上,计算结果是
a= {n:1}
b={
m:1
x:{n:1}
}
所以输出的应是 undefined {n:1}
完整代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>引用类型</title>
</head>
<body></body>
</html>
<script>/*基本数据类型number boolean string undefined null objectEcmascript 规定变量有两种不同的数据类型:基本类型 和 引用类型基本类型 包括:number boolean string undefined 引用类型 包括:数组和对象也有其他的不同分类 原始类型 和 对象类型或者 拥有方法的类型 和没有方法的类型可变类型 和 不可变类型以上的这些叫法都是依据两种类型特点来命名的1.基本类型基本类型的特点基本类型的比较是 值的比较基本类型的值是不能变的基本类型的值 存在于 栈区中2.引用类型引用类型的特点引用类型的值 是 可变的引用类型的比较是 引用的比较引用类型的值 存在于 栈内存和堆内存中栈:指的是栈内存,存放的数据是先进后出,栈自动分配内存空间,也会自动释放内存空间堆:指的是堆内存,动态分配内存空间,大小不确定,也不会自动释放内存空间先进先出*/let arr = [1,2,3,4];let arr1 = arr; //此时arr1指向 堆内存中的 数组空间arr[1]='分手快乐';arr[2]='说散就散';console.log(arr); //说明arr1 和arr同时指向一个地方let arr2 = arr.concat() //拷贝arr2[2]='体面';console.log(arr);let arr3 = arr.slice() //拷贝arr3[2] = '移情别恋'console.log(arr3);let num = num1 =10let a = {m:1}let b = a;a.x = a = {n:1} /*由于 . 操作高于 联= ,因此先算a.x = {n:1},此时a 和b指向的是内存中的同一个空间,因此b = {m:1,x:{n:1} } 然后再计算 a = {n:1},这样之前声明的a 会被直接释放,只留下一个新的a={n:1}综上,计算结果是a= {n:1}b={m:1x:{n:1}}*/console.log(a.x);console.log(b.x);//声明一个空对象let obj1 ={}//给对象添加属性obj1.name = '牛郎'obj1.act = function(){console.log('偷织女的衣服')}obj1.box = {abc:'老黄牛'}console.log(obj1);console.log(obj1.box.abc)</script>