本篇先讲类型,作用域与内存比较复杂分为两篇来讲
一.基本类型与引用类型
1、基本类型指的是简单的数据段(存储在栈中)
number、boolean、string、null、undefined
2、基本类型的比较是值的比较
var v = 1;
var c = true;
console.log(1==true);
var a = 'purpro';
var b = 'purpro';
console.log(a === b);//true
由上面可知,基本类型的比较只比较值。
3.基本类型的变量是存放在栈内存中的,当变量传值时,内存中产生新的副本。
4.引用类型:有多个值构成的对象,引用类型的值是可变的
```jsx
var obj = {
a: 1,
b: 2,
c: 3
};
delete obj.a;
console.log(obj.a) //undefined
5.引用类型的比较是引用的比较,即在判断相等的时候,判断的是***引用地址是否相等***,也就是说会比较是否是内存中的同一个东西。
var obj1 = {
a: 1,
b: 2,
c: 3
};
var obj2 = {
a: 1,
b: 2,
c: 3
};
console.log(obj1 == obj2); // false
console.log(obj1 === obj2); // false
// 在进行引用类型值得的== === 时,JS会比较两个对象是不是内存中的同一个对象
console.log({} == {}); // false
console.log({} === {}); // false
// 两个空对象在内存中不同的区域
注:不可以直接访问堆内存空间中的位置和操作堆内的空间,只能通过操作对象在堆内存中的引用地址
7.传递参数
(1)所有函数的传参都是按值传递,即函数外部的值复制给函数内部参数
- 基本类型如同基本类型复制(复制值本身)
- 引用类型如同引用类型复制(复制内存中指向的地址)
先来思考一个问题,输出obj是什么?
function fun(num){
//num是obj在内存中的地址的副本,在内存中和obj指向同一个对象,所以num添加name,相当于obj添加name
num.name = "张三";
//另外的索引,跟obj无关
num = new Object();
num.name="李四"
}
var obj = new Object();
fun(obj);
console.log(obj);
3,2,1…
{name: '张三'}
解释一下:虽然obj是一个对象,一个引用类型,但传值的时候,传递的是复制之后的对象,给对象一个name的属性,再重新创建一个对象叫num,此时相当于在堆栈中开辟一个另外的空间,也叫num,这个num的name叫做李四,所以我们输出外面的obj,他添加的name是张三。这说明即使在函数内部修改了参数的值,但原始的引用仍然未改变。实际上,当在函数内部重写obj时,这个变量引用的就是另外一个局部变量了。而这个局部变量会在函数执行完毕之后立即销毁。
8.检测类型
typeof检测null,数组和对象,都会返回Object.
那么怎样区分数组和对象呢?
使用instanceof区分对象和数组
下一篇预告:
Js执行环境与作用域