js变量和作用域
(一)js变量
1. 变量数据类型和堆栈
1.1 数据类型
基本数据类型
- 数字
- 字符串
- 布尔值
- undefined
- null
基本数据类型的值不能被修改,其值保存在栈中,当变量赋予新的值,栈中的值被覆盖
引用数据类型
- 对象
- 数组
引用数据类型的值可以被修改,其地址保存在栈中,值保存在堆中
1.2 堆栈
栈 | 堆 | |||
基本数据类型 | a | 值 | ||
引用数据类型 | b | 地址1 | 地址1 | { } |
c | 地址2 | 地址2 | { } |
2. 变量值的比较
基本数据类型
由于其值保存在栈中,每次比较都是栈中的值进行比较
引用数据类型
其地址保存在栈中,每次比较进行的都是栈中地址的比较,从堆栈表格中就可以看出,两个相同的对象,其保存在栈中的地址是不相同的
var a={},b={};
console.log(a === b); //得出结果为flase
总结:js中变量的比较是保存在栈中内容的比较
3. 参数的传递
基本数据类型
参数复制定义变量的值后进行传递
var a=5;
function fn(a){
a=10;
}
console.log(a); // 5
引用数据类型
参数复制引用的地址后进行传递,赋值是会对地址中的内容进行修改
var a=[5];
function fn(a){
a=[1];
}
console.log(a); // [1]
总结: js中参数的传递是对栈中的内容复制后进行传递
4. 类型检测
4.1 typeof
typeof 变量
- 数字——number
- 字符串——string
- 布尔值——boolean
基本的类型都能由typeof分辨,但是部分类型无法区分
- null——object
- 对象——object
- 数组——object
- undefined——undefined
- 没有定义——undefined
4.1 instanceof
变量 instanceof 类型
instanceof 能够对数据类型进行严格区分,没有定义的变量会报错
var a=null;
console.log(a instanceof Object); //false
instanceof 的值是布尔类型值
(二)js变量的作用域与解析
1. 变量对象及作用域链
全局变量
- 定义在外部,在任何地方都能访问的变量,作用域为全局作用域
- 全局变量和方法都是window对象的属性
局部变量
定义在函数内部的变量,只能在函数内部进行访问,作用域为局部作用域
2. js解析机制
2.1 预解析
- 变量提升 ——变量初始值为undefined
- 函数提升——函数等于函数本身
2.2 解析冲突
- 变量和函数冲突—— 以函数优先
- 函数与函数冲突—— 以后顺序优先
2.3 逐行解析
来源:CSDN
作者:学习中的萌新
链接:https://blog.csdn.net/weixin_46257824/article/details/104198665