来补充一点上一篇文章
js变量初探 中漏掉的知识点:
1.变量的定义与声明中常见问题:
(1)用var关键字声明的变量,未经初始化时,保存的是一个特殊的值—undefined,变量初始化仅仅是给变量赋一个值
(2)当使用var关键字声明了一个变量时,创建的这个变量是不可配置的,也就是说这个变量无法通过delete运算符删除;在严格模式下,使用delete运算符删除var关键字声明的变量会导致SyntaxError。
(3)省略var关键字会导致定义一个全局变量,但是不推荐这种做法。在严格模式下,给未声明的变量赋值会导致ReferenceError。
(4)变量的声明、定义与初始化
a)声明:给变量一个名字,宣告它从此刻开始存在;
b)定义:给变量分配一个存储空间;
c)初始化:给变量的存储空间赋值。
由于JS是一种动态语言,其变量的类型是不固定的,可以随着保存值的变化而变化,所以其定义变得无关紧要
(5)变量声明提升
JS在执行的时候,会把所有变量的声明都提升到当前作用域的最前面;声明提升,这步操作是在JS引擎“预编译”阶段实现的,是在代码开始运行之前;
2.基本类型与引用类型
(1)对于基本类型值,在复制变量的时候,会在新的变量上创建一个新值,这个新值是原值的一个副本,它们相互独立;基本类型值之间的比较,只是单纯的值的比较
(2)引用类型值是保存在变量中的对象,保存引用类型值的变量,实际上保存的是一个指向该对象的指针;当复制保存着对象的某个变量时,复制的其实是指针;复制操作结束后,两个变量指向同一个对象
(3)对于引用类型值,可以为其添加属性和方法,也可以修改或者删除其属性和方法;在为对象添加属性和方法时,操作的是实际的对象,因此,改变任何一个变量,都会影响另外一个变量。
(4)引用类型值的比较并非值的比较:即使两个对象包含相同的属性和值,它们也是不相等的;各个索引元素完全相等的两个数组也不相等;引用类型值的比较是引用的比较,当且仅当它们引用同一个对象时,它们才相等
3.全局变量:当JS解析器启动时,或者任何Web浏览器加载新页面的时候,它将创建一个新的全局对象,并给他一组定义的初始属性:
(1)全局属性:比如undefined、Infinite、NaN
(2)全局函数:比如isNaN()、parseInt()、eval()
(3)构造函数,比如Date()、String()、Array()、Object()
(4)全局对象:比如Math、Json
初次创建的时候,全局对象定义了JS中所有的预定义全局值;如果代码声明了一个全局变量,这个全局变量就是全局对象的一个属性。
4.名字解析顺序
JS中一个名字可能以4种方式进入作用域,其优先级如下:
(1)语言内置:所有作用域中都有arguments对象和this对象;
(2)函数声明
(3)形式参数
(4)变量声明:不会影响同名的函数声明或者形式参数声明