ES6
严格模式
“use strict” //开启严格模式
在严格模式下,某些先前被接受的过失错误会被认为是异常,主要有以下几点:
严格模式下无法再意外创建全局变量。例如 a = 4;在严格模式下会报错
严格模式下会引起静默失败(silently fail ; 不报错也没有任何效果的赋值操作),任何再正常模式下引起静默失败的赋值操作(给不可写属性赋值,给只读属性赋值,给不可扩展对象的新属性赋值等)都会抛出异常
严格模式下,试图删除不可删除的属性时会抛出异常(在正常模式下这种操作不会产生任何效果)
严格模式下,一个对象内的所有属性名再对象内必须唯一,否则会报错;在正常模式下重名属性是允许的,最后一个重名的属性决定其属性值。
严格模式下,函数的参数名唯一,否则报错;在正常模式下,最后以一个重名参数会掩盖之前的重名参数,之前的参数可以通过arguments 来访问。
严格模式下禁止八进制数字语法,在ES6中支持一个数字加“0o"的前缀来表示八进制数
严格模式简化了变量的使用:
- 严格模式禁止使用with
- 严格模式下eval 仅仅被运行的代码创建变量,不会使得名称映射到外部变量或者其他局部变量;在严格模式下执行eval,eval内包含的代码块会被当做严格模式下的代码去执行;
- 严格模式禁止删除声明变量。 delete name 在严格模式下会引起语法错误;
使得eval和arguments变得简单
-
eval和arguments不能通过程序语法绑定或者赋值;以下操作都会引起语法错误
"use strict" eval = 17; arguments ++; ++eval; var obj = {set p(arguments){}}; var eval; try {} catch {arguments}; function x(eval){}; function arguments(){} var y = function eval(){}; var f = new Function("arguments","'use strict';return 17")
严格模式下,参数的值不会随arguments对象的值的改变而变化。在正常模式下,对于第一个参数是arg的函数,对arg赋值的同时赋值为arguments[0],反之亦然(除非没有参数,或者arguments[0]被删除)。严格模式下,函数的arguments对象会保存函数被调用时的原始参数。arguments[i]的值不会随与之相应的参数的值的改变而变化,同名参数的值也不会随与之相应的arguments[i]的值的改变而变化;
不再支持 arguments.callee,在严格模式下,arguments.callee是一个不可删除属性,而且赋值和读取时都会抛出异常;
ES6基本语法
let
var 定义的变量,该变量时window的属性,可能会造成覆盖或者叠加在window的原属性上;
let 定义的变量,不是window属性,无法通过this.a调用;是局部作用域的,只作用于他所在的花括号内;
const
常量定义,尽量标准命名(以大写字母和下划线组成,且富有语义化)
箭头函数
var fn1 = ()=>{} //基本形式
当花括号内只有一条语句且该语句为 return 时,可以省略花括号;
当传入参数有且只有一个时,可以省略小括号;其他情况都要加;
var fn = e=>return e;
使用箭头函数后,this的指向是该函数外的this指向;!important
解构赋值
解构赋值语法是一种JavaScript表达式。通过解构赋值可以将属性/值从对象/数组中取出;赋值给其他变量;
[a,b,c] = [10,20]
console.log(a,b,c) // 10 , 20 , undefined
//数组的解构赋值是按位赋值,当参数过多时则为undefined,当参数不够时,则从前往后一一赋值
[a,b,...rest]=[10,20,30,40,50]
console.log(a,b,rest) //10,20,[30,40,50]
({a,b,c=0} = {a:10,b:20})
console.log(a,b,c) // 10,20,0
//对象的解构赋值是按照属性名解构的
//对象解构中“=”是用于赋值初始值 当对象内存在同名属性时则属性值覆盖初始属性值
({a,b,...rest} = {a:10,b:20,c:30,d:40})
console.log(a,b,rest)//10,20,{c:30,d:40}
({a,b} = {a:1,b:function(){console.log(this)}})
b() // window
//结构赋值后,将对象的方法解构为全局方法时,对象中的this,将会被重新指向全局的this,即window
字符串扩展方法
incliudes
console.log("abcde".includes("b")) // true
console.log("abcde".includes("b",1)) // true
console.log("abcde".includes("b",2)) // false
//判断字符串中是否有该字符,返回布尔值,可以从第几位开始判断
//如果没有指定第几位开始则为从头开始
startsWith
console.log("abcde".startsWith("a")) //true
console.log("abcde".startsWith("b",1)) //true
//判断字符串中从某个位置开始第一个元素是不是这个字符,如果没有指定位置就是从头开始
endsWith
console.log("abcde".endsWith("e",5))//true
console.log("abcde".endsWith("e",6))//true
//判断传入的字符串是否在搜索字符串的末尾
//第二个参数默认为搜索字符串的length,当传入小于length的值时则返回false,传入大于length的值时等同于传入length
repeat
console.log("abc".repeat(2)) // abcabc
//让某个字符串重复若干次 参数范围为[0,+∞)
console.log("abc".repeat(3.5))//abcabcabc 参数会自动转换为整数
console.log("abc".repeat(0))// ""
console.log(({toString : ()=> "abc",repeat : String.prototype.repeat}).repeat(2)) // abcabc
//repeat 是一个通用的方法,调用者可以不是一个字符串对象
trim
console.log(" ab c ".trim())//ab c
//删除字符串前后两端空白字符,不影响原字符串本身。空白字符指所有空白字符:space,tab,no-break space 以及终止符字符 LF ,CR
//当trim()不可用时,可用以下代码代替
if(!String.prototype.trim){
String.prototype.trim = function(){
return this.replace(/^[\s\uFEFF\xAO]+|[\s\uFEFF\xAO]+$/g,"")
}
}
padStart
console.log("aaa".padStart(5,"#")) // ##aaa
console.log("aaa".padStart(2,"#")) // aaa
console.log("aaa".padStart(5,"abc")) // abaaa
//在原字符串开头填充指定的填充字符串直到目标长度所形成的新字符串
//如果目标长度小于原字符串本身的长度则返回原字符串本身
//如果填充字符串太长,使填充后的字符串长度超过了目标长度,则只保留最左侧的部分;
padEnd
在原字符串末尾填充指定的填充字符串知道目标长度所形成的新字符串;
具体用法同上;
字符串模板
//简单demo
let arr = ["1","2","3","4","5"]
let ul = "<ul>";
for(let i = 0; i < arr.length;i++){
ul+=`<li>${arr[i]}</li>`;
}
ul+=`</ul>`;
document.body.innerHTML+=ul;
模板字符串使用反引号 () 来代替普通字符串中的用双引号和单引号。模板字符串可以包含特定语法(
${expression}
)的占位符。占位符中的表达式和周围的文本会一起传递给一个默认函数,该函数负责将所有的部分连接起来,如果一个模板字符串由表达式开头,则该字符串被称为带标签的模板字符串,该表达式通常是一个函数,它会在模板字符串处理后被调用,在输出最终结果前,你都可以通过该函数来对模板字符串进行操作处理。在模版字符串内使用反引号(`)时,需要在它前面加转义符(\)。