1、var 定义的变量能提升到作用域顶部,能重复声明同一个变量,可以先声明后赋值,能重复赋值,在声明的位置之前访问不会报错
let 定义变量不能提升,不能重复声明,可以先声明后赋值,在声明的位置之前访问会报错
const 定义常量, 不能重复声明,不能重复赋值,不能先声明后赋值,必须在声明的同时赋值
var 在一对"{ }"内部声明的变量 在"{ }"代码块执行结束之后还能访问
let const 在一对"{ }"内部声明的变量 在"{ }"代码块执行结束后不能再访问
var 在window作用域定义的变量 ,能通过 "window.变量名" 访问
let const 在window作用域下定义的变量,不能通过 "window.变量名" 访问
2、正则 u 操作符,按照字符匹配而不是码位匹配 ,有些两个码位的字符,长度是2,能通过u操作符匹配到
正则 y 操作符,匹配的时候从上一次匹配结束的位置开始匹配
子字符串识别方法 includes() startsWith() endsWith() 返回子字符串位置
正则复制 用 new RegExp(正则对象,操作符) 复制并修改操作符 返回新正则对象
正则对象.flags 返回'/'后面的正则操作符串
正则对象.source 返回'/'前面的正则表达式字符串
模板字面量 用'` `' 对包含模板 可以直接换行 可以用 '\n' 表示换行
用'${ }'包含javascript 表达式 表示计算结果的占位符
标签模板就是个函数fn 使用的时候不是用'fn()' 而是 'fn` `' 后面的模板会将占位符内容以及模板固定的内容传入函数
在函数中可以做更多的修改 然后弹回想要表达的结果字符串
3、函数可以在形参中通过'形参=value'来赋予默认值,默认值也可以是一个javascript表达式的结果
可以在形参中用三个点'...变量名'来表示传入的不定个数的参数 这个变量在函数内是个数组,从这个形参的位置开始传入的变量都是这个数组的元素
形参列表中只能有一个'...变量' 只能放到所有形参的最后面 不能在set访问器的参数中用这种形式
形参中 前面的不能访问后面的
形参不能访问函数体中的变量
Function 构造函数中 可以使用 '...变量' 可以使用默认参数
函数声明时候的名字就是函数的name
函数表达式在function后面的字符串是函数的name
通过bind()返回的函数 name 有 bound前缀
访问器 get 有前缀 get
访问器 set 有前缀 set
通过Function构造函数创建的函数 有前缀 anonymous
函数内部有[[call]] 和 [[construct]] 方法 有元属性 new.target
直接用'fn()' 调用 会执行 [[call]] 方法 new.target是undefined
用'new fn()' 调用 会执行 [[construct]] 方法 new.target不是undefined
块级函数 在"{ }" 内部定义 在外部也能访问
箭头函数 ()=>{} 没有自己的[[construct]],this,argumnets,new.target
箭头函数只能按照形参使用传入的参数 this值是上层作用域的this值
一个参数可以省略'()' 函数体只有一个语句做返回值 可以省略 return 和 '{}'
如果是返回的一个对象 要用'({ })'表示返回的是一个对象
立即执行函数 用'(fn(a){return a})(a)'格式
尾调用优化 return语句在尾部 返回的值不需要和函数内的变量做计算 调用的函数结果是返回值
尾调用格式 'function a(){ return b()}'
尾调用能重用战帧