js变量和作用域

◇◆丶佛笑我妖孽 提交于 2020-02-07 00:39:23

(一)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 逐行解析

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!