JavaScript基本类型和引用类型

在JavaScript中可以分为基本数据类型和引用数据类型,内存分为栈(stock)内存和堆(heap)内存,数据类型和内存存放位置存在对应关系。

基本数据类型和栈内存

基本数据类型包括:NumberStringBooleanNullUndefined

这些值都有固定大小,往往都保存在栈内存中,有系统自动分配空间。数据在栈内存的存储和读取类似数据结构中的堆栈数据结构,遵循先进后出原则。

当我们使用=进行变量赋值的时候,实际上将数据拷贝一份,然后赋值给新变量,前后互不干涉,称为值传递

1
2
3
4
5
let a = 1
let b = a
b = 2
console.log(a, b) // 1 2

引用数据类型和堆内存

一个变量被赋值一个引用数据类型(Object,Array,Function),他们的值大小不固定,这部分值就被保存到的堆内存中,变量在栈内存中只记录了一个内存地址,该地址指向了堆内存中实际值。我们在访问堆内存中引用数据类型时,先从栈内存中回去对象引用地址,然后根据引用地址再从堆内存回去数据。

当我们使用=进行变量赋值的时候,传递的只是引用地址,而不是实际值,称为引用传递

1
2
3
4
5
let a = [1]
let b = a
b.push(2)
console.log(a, b) //[1, 2] [1, 2]

函数参数传递

ECMAScript中所有函数的参数都是按值传递的

出自红包书。

结合上面提到两种值传递,我的理解,如果参数是基本数据类型,那么就是值传递,数据的拷贝,但是如果是引用数据类型,那实际传递的还是引用地址,引用传递。红宝书说的值传递,我理解是指这个引用地址的值传递…

1
2
3
4
5
6
7
8
9
10
11
let obj = { n: 1}
let a = 1
function fn(data1, data2) {
data1.m = 2
data1 = 2
data2 = 2
}
fn(obj, a)
console.log(obj, a) // {n: 1, m: 2} 1

===和==

“===”严格运算符,”==”叫做相等运算符。

严格运算符的运算规则如下,

  1. 不同类型值

如果两个值的类型不同,直接返回false。

  1. 同一类的基本类型

值相同就返回true,值不同就返回false。

  1. 同一类的引用类型

不是比较它们的值是否相等,而是比较它们是否指向同一个对象。

  1. undefined和null

undefined 和 null 与自身严格相等。

1
2
null === null //true
undefined === undefined //true

相等运算符在比较相同类型的数据时,与严格相等运算符完全一样。

在比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。类型转换规则如下:

  1. 基本类型的值

基本类型数据会转换成数值类型再进行比较。

  1. 对象与原始类型值比较

对象(这里指广义的对象,包括数值和函数)与原始类型的值比较时,对象转化成原始类型的值,再进行比较。

  1. undefined和null

undefined和null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。