JavaScript中的变量、作用域与内存

JavaScript中的变量、作用域与内存

1.原始值与引用值

ECMAScript包含两种不同类型的数据:原始值和引用值。原始值就是最简单但的数据类型,引用值则是由多个值构成的对象。在javaScript中不允许直接访问内存空间,在操作对象时,实际上操作的时对象的引用,而非对象本身。

动态属性

在用new关键字时,JavaScript会创建一个Object实例,就可以对创建的对象动态添加属性。

let name1="marin";
let name2= new String("mata");
name1.age=27;
name2.age=25;
console.log(name1.age);
//undifined
console.log(name2.age);
//25
复制值
let name1="mate";
let name2=name1;

此时,name1name2在内存中是完全独立的,对引用操作时,两个引用互不影响。

let name1=new Object();
let name2=name1;
name1.name='mate';
console.log(name2.name)
//mate

当赋值变量是Object对象时,存储在变量中的值也会被复制到新变量所在的位置,区别在于,这里复制的实际上是一个指针,它指向堆内存中的对象,操作完成后,两个变量实际上指向同一个对象。

传递参数

ECMAScript所有函数的参数都是按值传递的。当参数无论是原始值还是引用值,都会像复制值那样将复制参数。

function add(num,obj){
	num+=10;
	obj.name="add";
	obj=new Object();
	obj.name="testAdd";
	return num;
}
let num1=10;
let obj=new Object();
let result=add(num1,obj)
console.log(num1)
//10
console.log(obj.name)
//add
确定类型
result=variable instanceof constractor

2.执行上下文与作用域

变量或者函数的上下文决定了它们可以访问哪些对象以及他们的行为。任何变量都存在与某个执行上下文中,这个上下文(作用域)决定了变量的生命周期,以及它可以访问代码的那些部分。

  • 执行上下文分为全局上下文、函数上下文何块级上下文
  • 代码执行流每进入一个新的上下文,都会创建一个作用域链,用于搜索函数和变量
  • 函数或块的局部上下文不仅可以访问自己作用域内的变量,也可以访问任何包含上下文乃至全局上下文中的变量。
  • 全局上下文只能访问全局上下文中的函数和变量,不能访问局部上下文中的任何数据。
  • 变量的执行上下文用于确定什么时候释放内存。