1.基本类型和引用类型的值
在操作对象时,实际上是在操作对象的引用而不是实际的对象,5中基本数据类型是按值访问
在基本类型与引用类型的调用方面也与类c语言有很大区别
1.我们不能给基本类型的值添加属性,即使这样不会导致任何错误
var name = "van";
name.age = 27;
alert(name.age) //undefined
2.在复制变量方面
基本数据类型: 创建一个新的存储空间,将值赋值过去,两个变量各自的操作不会对对方产生任何影响
引用数据类型: 同样会分配存储空间,但是存储的是值实际上是一个指针,指向堆中的一个对象,
操作结束后,两个指针指向同一个对象,一个改变影响另一个。
// 基本数据类型
var a = 1;
var b = a;
b = 2;
console.log(a === b) // false
// 此时a 与 b 是两个不同的变量,操作不相通
//引用数据类型
var a = {};
var b = a;
b.name = 'van';
console.log(a.name) //van
// 此时 a 与 b 存储的值指向同一个堆中的变量,操作会改变另一个变量
2.没有块级作用域
在js 中没有块级作用域的概念,那么有些时候我们写的代码可能会得到一些意想不到的结果
for(var i=0;i<10;i++){}
console.log(i); //10
这就是没有块级作用域的坏处, i 变量居然能跑到上一级的作用域中了
3.垃圾收集
一般是两种方式 标记清除 与 引用计数
4.小结
- 基本数据类型保存在栈中,引用数据类型保存在堆中
- 基本数据类型复制的是值,引用数据类型复制的是一个指针副本
- 进入一个新执行环境,会创建一个作用域链