JS中
变量没有类型,只有值有类型,变量的类型取决于其内存储的值的类型
第一:考察基础,语言类型的掌握
基本类型
-
number -
string -
boolean -
null`typeof null`返回`object`,语言本身的`bug`。 但`null`是基本类型 -
undefined -
symbol(ES6中新增)
对象类型
FunctionArrayDateRegExpErrorStringNumberBoolean
当我们把值赋值给一个变量时发生了什么?
第二:考察数据类型存储方式的掌握
值为基本类型
基本类型的值存在栈中
var num1 = 1; 发生了什么?
LHS查询num1,没找到- 在栈中开辟一个空间存储
num1 - 把
num1值设为1
var num2 = num1; 发生了什么?
LHS查询num2,没找到- 在栈中开辟一个空间存储
num2 RHS找到num1的值为1- 把
num2的值设置为1
var num2 = 2; 发生了什么?
LHS查询num2,找到- 把
num2的值设置为2(因为是值引用,不会影响num1)
图示:
demo:
// 基本类型,修改复制的值不会影响旧值
var num1 = 1;
var num2 = num1;
num2 = 2;
console.log(num1); // 1
console.log(num2); // 2
值为对象类型
对象类型的值存储在堆中,然后在栈中存储堆的位置信息。
var obj1 = { num1: 1 }; 发生了什么?
LHS查询obj1,没找到- 在栈中开辟一个空间存储
obj1 - 在
堆中开辟空间存储{ num1: 1 },地址为0x123 - 把
obj1值设为0x123
var obj2 = obj1; 发生了什么?
LHS查询obj2,没找到- 在栈中开辟一个空间存储
obj2 RHS找到obj1的值为0x123- 把
obj2的值设置为0x123
obj2.num2 = 2; 发生了什么?
LHS查询obj2,找到堆的地址0x123- 根据地址
0x123找到对象中num2为空,在对象中创建num2 - 把
num2的值设置为2 - 因为是根据
地址修改的对象,所以所有指向这个地址的变量的都会发生变化
图示:
demo:
// 对象类型,修改复制的值会影响旧值
var obj1 = {
num1: 1
};
var obj2 = obj1;
obj2.num2 = 2;
console.log(obj2.num2); // 2
console.log(obj1.num2); // 2
tips:
函数的参数如果是对象类型也是地址引用
如果觉得内容对你有帮助,请点个赞和关注,你们的鼓励是我持续更新下去的动力,比心。
如需转载请注明出处,感恩。
更多内容可先关注GitHub