在JavaScript中可以分为基本数据类型和引用数据类型,内存分为栈(stock)内存和堆(heap)内存,数据类型和内存存放位置存在对应关系。
基本数据类型和栈内存
基本数据类型包括:Number,String ,Boolean,Null,Undefined
这些值都有固定大小,往往都保存在栈内存中,有系统自动分配空间。数据在栈内存的存储和读取类似数据结构中的堆栈数据结构,遵循先进后出原则。
当我们使用=进行变量赋值的时候,实际上将数据拷贝一份,然后赋值给新变量,前后互不干涉,称为值传递。
|
|
引用数据类型和堆内存
一个变量被赋值一个引用数据类型(Object,Array,Function),他们的值大小不固定,这部分值就被保存到的堆内存中,变量在栈内存中只记录了一个内存地址,该地址指向了堆内存中实际值。我们在访问堆内存中引用数据类型时,先从栈内存中回去对象引用地址,然后根据引用地址再从堆内存回去数据。
当我们使用=进行变量赋值的时候,传递的只是引用地址,而不是实际值,称为引用传递。
|
|
函数参数传递
ECMAScript中所有函数的参数都是按值传递的
出自红包书。
结合上面提到两种值传递,我的理解,如果参数是基本数据类型,那么就是值传递,数据的拷贝,但是如果是引用数据类型,那实际传递的还是引用地址,引用传递。红宝书说的值传递,我理解是指这个引用地址的值传递…
|
|
===和==
“===”严格运算符,”==”叫做相等运算符。
严格运算符的运算规则如下,
- 不同类型值
如果两个值的类型不同,直接返回false。
- 同一类的基本类型
值相同就返回true,值不同就返回false。
- 同一类的引用类型
不是比较它们的值是否相等,而是比较它们是否指向同一个对象。
- undefined和null
undefined 和 null 与自身严格相等。
|
|
相等运算符在比较相同类型的数据时,与严格相等运算符完全一样。
在比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。类型转换规则如下:
- 基本类型的值
基本类型数据会转换成数值类型再进行比较。
- 对象与原始类型值比较
对象(这里指广义的对象,包括数值和函数)与原始类型的值比较时,对象转化成原始类型的值,再进行比较。
- undefined和null
undefined和null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。