数据类型
基本数据类型
也称作原始类型,主要常见有以下几种:
- number
- string
- boolean
- null
- undefined
- symbol
基本数据类型是按值访问的,因为可以直接保存变量中的实际值;
引用数据类型
也称作对象类型,比如:Object、Array、Function、Data
对象类型与原始类型不同之处是,原始类型储存的是值,对象类型储存的是地址(指针)。当我创建一个对象类型的时候,计算机会在内存空间内帮我们开辟一个空间来存放值,但是我们需要找到这个空间,这个空间会拥有一个地址(指针)。看下面这个小例子:
let a = [];let b = a;b.push(1);console.log(b); //[1]console.log(a); //[1]
根据上面代码,首先定义变量a,假设内存地址(指针)为#001,那么在地址#001位置放了值 [],变量a存放了地址#001;当我们把变量a赋值给变量b时,负值的是原本变量a的地址,也就是说变量b的存放地址(指针)也是#001,当我们修改数据的时候,就会修改存放在地址#001上的值,也就导致了两个变量都放生了变化。
当函数参数为对象的时候,示例如下:
function fn(person){person.age = 22;person = {name : 'b',age : 24}return person;}let p1 = {name : 'a',age : 20}var p2 = fn(p1)console.log(p1) // {name:'a',age:22}console.log(p2) // {name:'b',age:24}
首先p1传入到fn中后,age被改变了,所以p1 = {name:’a’,age:22}; 然后程序继续执行,参数p1被一个新的地址(指针)赋值,也就是p1引用了新的地址,此时我们将person返回, 我们把新的地址给到p2,
则p2 = {name:’b’,age:24}
作用域
理解作用域
引擎:从头到尾负责整个JavaScript程序的编译及执行过程;
编辑器:负责语法分析及代码生成等脏活累活;
作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限;
作用域嵌套
作用域是根据名称查找变量的一套规则。实际情况下,需要同时估计几个作用域。
当一个块或函数嵌套在另一个块或函数中时,就发生了作用域的嵌套。因此,在当前作用域中无法找到某个变量时,引擎就会在外层嵌套的作用域中继续查找,知道找到该变量,当抵达最外层作用域时(也就是全局作用域 window),无论找到与否,查找过程都会停止。
作用域是一套规则,用于确定在何处及何时查找变量。
如果查找的目的是对变量进行赋值,那么就会使用LHS查询;
如果查找的目的是获取变量的值,那么就会使用RHS查询;
PS:赋值操作会导致LHS查询, “=”操作符或者调用函数是传入参数的操作都会导致关联作用域的赋值操作。
函数作用域
在任意代码片段外部添加包装函数,可以将内部的变量和函数定义”隐藏”起来,外部作用域无法访问包装函数内部的任何内容。
块作用域
- with:用with从对象中创建出的作用域仅在with声明中有效,而在外部作用域中无效;
- try/catch:catch分句会创建一个块作用域,其中声明的变量只在catch内部有效;
try{undefined(); //执行一个非法操作来强制制造一个异常}catch(err){console.log(err); //能够正常执行}console.log(err); //ReferceError:err not found
catch中的err在全局变量中找不到;
