1、背景介绍:
基本类型有哪些
1、undefined 类型表示不存在定义,声明变量但没有初始化,这个变量的值就是undefined; 注意:在任何一个引用变量值设置为undefined都是错误的
2、null 类型,表示一个值被定义了,定义为空值; 使用场景为 定义变量准备在将来用于保存对象;所以引用值可以是null而不会是undefined;
undefined和null的区别:js诞生的时候只设置了null作为“无”的值。最初的设计是null是表示一个“无”的对象,转为数值时为0; | undefined表示“无”的原始值,转为数值时为NaN;红宝书上说引入undefined就是为了正式的区分空对象指针与未经初始化的变量,变量设置为null就是空对象指针,没有设置就是未经初始化!
3、Boolean类型,字面值为true和false
4、number类型,字面量格式可以是十进制、八进制(八进制第一位必须是0)、十六进制(前两位必须是0x)
5、String类型 由零个或多个16位Unicode字符组成的字符序列
6、symbol类型,ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是ES6 引入Symbol的原因
引用类型有哪些
引用类型统称为object类型,细分的话有:Object 类型、Array 类型、Date 类型、RegExp 类型、Function 类型 等。
变量的不同内存分配
原始值:存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。这是因为这些原始类型占据的空间是固定的,所以可将他们存储在较小的内存区域 – 栈中。这样存储便于迅速查寻变量的值。
引用值:存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存地址。这是因为:引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。
两种类型在复制值的什么有什么区别?
基本类型复制值的时候,会重新在变量对象上创建一个新值,然后把值赋值到新变量分配的空间上来(理解为栈中的空间);
引用类型复制时,也会在储存在变量对象中的值复制一份放到为新变量分配的空间上来,但是不同的是新复制的值是一个指针,指向原值所在堆内存中的地址;
两种类型在传递值的时候有什么区别?
结论 没有差别,红宝书70页在传递参数章节的第一句话就明确表明 “ECMAScript中所有的函数都是按值传递的”
2、知识剖析:
3、常见问题:
4、解决方案
5、编码实战
6、扩展思考
7、参考文献
问题:
1、值传递是什么?
当我们使用=将这些变量赋值到另外的变量,实际上是将对应的值拷贝了一份,然后赋值给新的变量。我们把它称作值传递
2、对象是通过什么传递的?
对象是通过引用传递,而不是值传递。也就是说,变量赋值只会将地址传递过去。
3、==和===在比较时有什么区别?
对于引用类型的变量,==和===只会判断引用的地址是否相同,而不会判断对象具体里属性以及值是否相同。因此,如果两个变量指向相同的对象,则返回true。