作用域,作用域链,垃圾收集,js解析
程序员文章站
2022-03-26 12:20:29
变量中包含基本数据类型和引用数据类型,基本类型指简单的数据值,引用类型由多个值构成的对象. 引用类型可以为其添加属性和方法,也可以改变和删除属性和方法. 复制变量值: 基本类型:一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,并把该值分配到新变量分配的位置上,两者任何操作不会互相影 ......
变量中包含基本数据类型和引用数据类型,基本类型指简单的数据值,引用类型由多个值构成的对象.
引用类型可以为其添加属性和方法,也可以改变和删除属性和方法.
复制变量值:
基本类型:一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,并把该值分配到新变量分配的位置上,两者任何操作不会互相影响.
引用类型:当一个变量向另一个变量复制引用类型的值时,同样也会存储在变量的值复制一份放到位新变量分配的空间中,但是不同的视,这个值的副本只是一个指针,而这个指针指向存储在堆中的一个对象,两个变量引用一个对象,改变其中一个变量,另一个也会随之改变.
传递参数:
所有函数的参数都是按值传递的.
在向函数的参数传递基本类型值时,被传递的值会被复制给一个局部的变量(命名参数.arguments对象中的一个元素)
在向参数传递引用类型的值时,即使是按值传递,指向的也是同一个对象,因为变量指向的对象在堆内存中只有一个.
typeof操作符是一个确定一个变量是字符中数值,布尔值.undefined的最佳工具,如果变量是null或对象,则会返回object
instanceof操作符是一个确定变量是引用类型的操作符.
instanceof检测引用类型和object构造函数时 return true
instanceof检测基本数据类型值时 return false
作用域:
最外围的作用域为全局作用域,根据宿主环境不同,其表示作用域的对象也不同,未声明的变量皆为全局变量.
除全局作用域以外的所有作用域皆为局部作用域,var声明的变量为局部变量
js中没有块级作用域一说
作用域链:
是由局部作用域中的深层作用域由内向外冒泡寻找,一直到全局作用域.
局部作用域可以访问全局作用域,但是全局作用域不可以访问局部作用域中的变量.
延长作用域链
with()延长作用域链
实例
var person={};
with(person){
name="xiaoming";
sex="male";
}
基本数据类型
|
引用数据类型
|
不可修改
|
可以修改
|
保存在栈内存
|
保存在堆内存,指针地址保存在栈内存中
|
按值访问 |
按引用访问
|
比较时,值相等就相等
|
比较时,同一引用才相等
|
复制时,创建一个副本
|
复制时,,复制的其实只是一个指针
|
按值传递参数
|
按值传递参数
|
用typeof检测类型
|
用instanceof检测类型
|
垃圾收集:
js是全自动的,不必像c和c++之类手动收集垃圾,可以让我们少操心了.
js中垃圾收集分为两种,一种是标记清除法,还有一种是引用计数.
标记清除是垃圾收集器在运行的时候会给在内存中的所有变量都打上标记,然后,它会去掉环境中的变量和被环境中变量引用的变量的标记,而在此之后再被添加上标记的变量就被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了,最后完成垃圾收集.
引用计数是跟踪每个值被引用的次数,当声明了一个变量并将一个引用类型值赋给该变量时,该值引用的次数加1,反之减1,为0时,说明无法访问,收回所占用内存.
但是会涉及循环引用的问题,循环引用会导致永远都不会被清理,一直占用内存,可将值设置为null来手动解除引用.
js解析
1.预解析
当前作用域var和function关键词的会事先声明(变量提升),函数的优先级比var声明的优先级高,var声明的变量会被提升为undefined,声明函数会把整个函数提升到最前面.
2.逐行解读
个人理解,欢迎大佬们给提意见!!