1.var
var定义的是全局变量和局部变量,可以省略var,一般情况下不会报错,两者使用看似一样实际上存在着区别,执行代码之后x属性没有被删除,y被删除了
通过Object.getOwnPropertyDescriptor()获取对象的属性可以发现,有var定义的x的configurable默认是true,没定义的y的configurable默认是false,当configurable为true是则不会被delete删除。
var 声明全局变量举例来说for循环定义的var也可以在循环外使用
tips:变量提升
var声明全局变量会进行代码提升,举例来说var b =2;会分解成var b;b=2;代码解析的时候会将var b;提升到最前面,并且在内存中开辟空间,因为var b没赋值,所以默认为空。因为a没进行var声明,所以变量没有提升,因此会报错。
let
在ECMAScript6标准中,一个重要的概念就是JavaScript严格模式,需要在最前面加“use strict”
let需要注意的地方:
let用于作用域块,一个{}就是一个作用域,也就是let声明块级变量,即局部变量
let在其作用域下面不存在变量提升
let在其作用域中不能重复声明(函数作用域和块级作用域)
let块级作用域
最外层的代码块不受内层代码块的影响,但如果是var来定义变量则结果会输出为20
const
const用来声明常量,一旦声明,就无法修改,而且必须要初始化,强行修改虽然不报错但也无法修改
const的作用域与let相同,只在声明所在的块级作用域内有效,并且也是和let一样不可以重复进行声明。const是常数变量,即一般在require一个模块的时候用或者定义一些全局常量,一旦定义,无法更改,无法重复赋值。
最后一句话总结,var可以声明全局变量和局部变量可以进行变量提升,let只能声明局部变量,无法进行变量提升,变量所存储的值可以被更改,const声明的是常量,一旦确定就无法修改,也无法重新赋值
字典(map)
字典就是一种键值对形式储存数据的数据结构。
size属性
size属性返回Map结构的成员总数
set(key,value)
set方法设置键名key对应的键值为value,然后返回整个Map结构,如果key已经有值,则键值会被更新,否则就新生成该键
set方法返回的是当前Map对象,可以采用链式写法
get(key)
get方法读取key对应键值,如果没找到key返回undefined
has(key)
has方法返回一个布尔值,表示某个键是否在当前Map对象
delete(key)
delete方法删除某个键,返回true,如果删除失败,则返回false
clear()
clear方法清除所有成员,没有返回值
遍历方法
Map结构原生提供三个遍历器生成函数和一个遍历方法
keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回所有成员的遍历器
forEach():遍历Map的所有成员
注意Map遍历顺序就是插入顺序
map结构的默认遍历器接口(Symbol.iterator属性),就是entries方法
Map结构转数组结构,比较快速的方法是使用扩展运算符(...)
结合数组的map方法,filter方法,可以实现Map的遍历和过滤(Map本身没有map和filter方法)
Map中有forEach方法,和数组的forEach方法类似,也可以实现遍历
forEach方法可以接受第二个参数,用来绑定this,forEach方法的回调函数的this,就指向rep
Map与其它数据结构的转换