简介
定义:ECMAScript是由Ecma国际通过ECMA-262标准化的脚本程序设计语言
Ecma国际制定了许多标准,而ECMA-262只是其中的一个,ES6就是ES2015
ES6版本变动内容多,加入许多语法特性,是前端发展趋势
ES6兼容性,可以用babel进行转换成ES5等更低级的标准以支持IE等浏览器
ES6是JS语言的标准,是被浏览器支持的,只是支持程度不同,和TypeScript不同,TS需要被编译成JS才会被浏览器执行
语法 let关键字
*let不能重复声明同一变量
let的作用域是块级作用域,只在作用域内生效
var则不同,var没有块级作用域,如果在方法中声明类型为var的变量,则为局部变量;如果在全局中声明,则为全局变量1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 function fn ( ) { var a = 1 ; console .log(a); } fn(); console .log(window .a); if (1 ) { let girl = 'zhou' ; var boy = "luo" ; } console .log(boy);console .log(girl);function get ( ) { var test = "test" ; } console .log(test) console .log(song); var song = '恋爱达人' ;console .log(song2); let song2 = '恋爱达人2' ;{ let school = "11" ; function fn3 ( ) { let school = '22' ;fn(); } function fn ( ) { console .log(school); } fn3(); } let items = document .getElementsByClassName('item' );for (let i = 0 ; i < items.length; i++) { items[i].onclick = () => { console .log(this );this .style.background = 'pink' } } let i = 0 ;{ i = 0 ; items[0 ].onclick = () => { this .style.background = 'pink' ; } } { i = 1 ; items[1 ].onclick = function ( ) { this .style.background = 'pink' ; } } { i = 2 ; items[2 ].onclick = function ( ) { this .style.background = 'pink' ; } }
声明常量const 1 2 3 4 5 6 7 8 9 10 11 12 const SCHOOL = "尚硅谷" ;console .log(SCHOOL);const TEAM = ['uzi' , 'mlxg' ];TEAM.push('Hexi' ); console .log(TEAM);TEAM = '1' ;
解构赋值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 const F4 = ['1' , '2' , '3' ];let [first, second, third] = F4;const zhao = {name: '赵本山' , age: '不详' , xiaopin: function ( ) { console .log('我可以演小品' ); } } let { xiaopin } = zhao;
模板字符串``(反单引号) 1 2 3 4 5 6 7 8 9 10 let str = `111` ;console .log(str);str = `111 222 ` ;let love = '111' ;let out = `${love} 222` ;console .log(out);
对象的简化写法 1 2 3 4 5 6 7 8 9 10 11 12 let name = "1" ;let change = function ( ) { console .log('2' ); } const school = { name, change, improve ( ) { console .log('3' ); } }
箭头函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 let fn = function ( ) {}let fn2 = (a, b ) => { return a + b; } let result = fn2(1 , 2 );console .log(result);function getName ( ) { console .log(this .name); } let getName2 = () => {console .log(this .name);window .name = '尚硅谷' ;const school = { name: 'aguigu' } getName.call(school); getName2.call(school); let Person = (name, age ) => { this .name = name; this .age = age; } let me = new Person('xiao' , 30 ); console .log(me);let fn = () => { console .log(arguments ); } fn(1 , 2 , 3 );
箭头函数的实践 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 let ad = document .getElementById('ad' );ad.addEventListener('click' , function ( ) { setTimeout (() => { this .style.background = 'black' ; }, 2000 ); }); var A = { name: 'B' , sayHello: function ( ) { console .log(this .name) } } A.sayHello(); var PI = "a" ;if (true ) { console .log(PI); const PI = "3.1415926" ; } console .log(0.3 === (0.1 + 0.2 )) console .log(0.3 === 0.3 ) console .log(bl1); const arr = [1 , 4 , 8 , 9 , 10 ];const result = arr.filter(item => item % 2 === 0 )console .log(result);
函数参数的默认值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 function add (a, b, c = 10 ) { return a + b + c; } let result = add(1 , 2 )console .log(result);function connect ({ host = '127.0.0.1' , username, password, port } ) { console .log(host, username, password, port); } connect({ host: 'localhost' , username: 'root' , password: 'root' , port: '3306' }) function date ( ) { console .log(arguments ); } date('柏芝' , '阿娇' ); function date2 (...args ) { console .log(args); } date2('1' , '2' ); let fn = (...args ) => { console .log(args); } fn(1 , 2 , 3 , 4 )
ES6扩展运算符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 let arr = [1 , 2 , 3 ];let ovj = {...arr}; const tfboys = ['1' , '2' , '3' ];function chunwan ( ) { console .log(arguments ); } chunwan(...tfboys); let a = [1 , 2 ];let b = ['3' , () => console .log(1 )]let c = [...a, ...b];console .log(c);const sanzhihua = ['E' , 'D' ];const c = [...sanzhihua];console .log(c);const divs = document .querySelectorAll('div' );console .log(divs); const d = [...divs];console .log(d);
Symool 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 let s = Symbol ();console .log(s, typeof s);let s2 = Symbol ('尚硅谷' );let s3 = Symbol ('尚硅谷' );console .log(s2 === s3); let s4 = Symbol .for('尚硅谷' );let s5 = Symbol .for('尚硅谷' );console .log(s4 === s5); let game = { up: () => console .log('up' ), down: () => cnosole.log('down' ) } let methods = { up: Symbol (), down: Symbol () } game[Symbol .for('up' )] = () => console .log('newup' ); game[Symbol .for('down' )] = () => console .log('newdown' ); console .log(game[Symbol .for('up' )]); let youxi = { name: '狼人杀' , [Symbol .for('say' )]: () => console .log('我自爆' ) } console .log(youxi[Symbol .for('say' )])
迭代器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 const a = ['唐僧' , '孙悟空' , '猪八戒' , '沙僧' ];for (let v of a) { console .log(v); } let iterator = a[Symbol .iterator]();console .log(iterator);console .log(iterator.next());console .log(iterator.next());console .log(iterator.next());console .log(iterator.next());console .log(iterator.next());const banji = { name:'终极一班' , students:['汪东城' ,'罗志祥' ,'金城武' ], [Symbol .iterator](){ let index = 0 ; return { next:()=> { if (index < this .students.length){ let result = { value:this .students[index], done:false } index++; return result; }else { return { value:undefined , done:true } } } } } } for (let v of banji){ console .log(v); } let arr = [...banji];console .log(arr);
生成器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 function * gen ( ) { console .log(arguments ); let one = yield 111 console .log(one); let two = yield 222 console .log(two); let three = yield 444 console .log(three); } let iterator = gen('AAA' );console .log(iterator.next());console .log(iterator.next('BBB' ));console .log(iterator.next('CCC' ));console .log(iterator.next('DDD' ));iterator.next(); iterator.next(); for (let v of gen()) { console .log(v); } function fn1 ( ) { setTimeout (() => { console .log('111' ); iterator.next(); }, 1000 ); } function fn2 ( ) { setTimeout (() => { console .log('222' ); iterator.next(); }, 2000 ); } function fn3 ( ) { setTimeout (() => { console .log('333' ); }, 3000 ); } function * gen ( ) { fn1(); yield 1 fn2(); yield 2 fn3(); yield 3 } let iterator = gen();iterator.next(); iterator.next(); iterator.next(); iterator.next(); function getUsers ( ) { setTimeout (() => { let data = '用户数据' ; iterator.next(data); }, 1000 ); } function getOrders ( ) { setTimeout (() => { let data = '订单数据' ; iterator.next(data); }, 2000 ); } function getGoods ( ) { setTimeout (() => { let data = '商品数据' ; iterator.next(data); }, 3000 ); } function * gen ( ) { let userdata = yield getUsers() let orderdata = yield getOrders(); let goodsdata = yield getGoods(); yield '3' } let iterator = gen();iterator.next();
Promise 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 const p = new Promise (function (resolve, reject ) { setTimeout (() => { let data = '数据库中的用户数据' ; let error = '数据读取失败' ; reject(error); }, 2000 ); }) p.then(function (value ) { console .log(value); }, function (reason ) { console .error(reason); }) const p = new Promise (function (resolve, reject ) { const xhr = new XMLHttpRequest(); xhr.open('GET' , 'http://api.apiopen.top/getJ2oke' ) xhr.send() xhr.onreadystatechange = function ( ) { if (xhr.readyState === 4 ) { if (xhr.status >= 200 && xhr.status < 300 ) { resolve(xhr.response); } else { reject(xhr.status); } } else { reject(xhr.status); } } }).then(value => { console .log(value); }, reason => { console .log(reason); }) const p = new Promise ((resolve, reject ) => { setTimeout (() => { reject('数据库连结失败' ); }, 2000 ); }) p.catch(err => { console .warn(err); }) let set = new Set (['1' , '2' , '1' ]);console .log(set);console .log(set.size);set.add('3' ); console .log(set);console .log(set.has('3' ));set.delete('2' ); console .log(set);set.clear(); console .log(set);let arr1 = [1 , 3 , 4 , 5 ];let arr2 = [1 , 4 , 6 , 7 ];let set1 = new Set ([...arr1, ...arr2]);let set2 = arr1.filter(item => { let s2 = new Set (arr2); if (s2.has(item)) { return true ; } else { return false ; } }); console .log(set2);
Map字典 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 let m = new Map ();m.set('key1' , 'value1' ); console .log(m.get('key1' ));console .log(m.has('key1' ));for (let v of m) { console .log(v); }
class类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 function Phone (brand, price ) { this .brand = brand; this .price = price; } Phone.prototype.call = function ( ) { console .log('我可以打电话' ); } Phone.prototype.game = function ( ) { console .log('我可以玩游戏' ); } let huawei = new Phone('华为' , 5999 );huawei.call(); huawei.game(); console .log(huawei);class Phone { constructor (brand, price ) { this .brand = brand; this .price = price; } call ( ) { console .log('我可以打电话' ); } game ( ) { console .log('我可以玩游戏' ); } } let huawei = new Phone('华为' , 5999 );huawei.call(); huawei.game(); console .log(huawei);class person { constructor (name, age ) { this .name = name; this .age = age; } eat ( ) { console .log('i can eat' ); } } let ajie = new person('ajie' , 18 );console .log(ajie);function Phone ( ) {} Phone.prototype.size = '5.5inch' ; Phone.name = '手机' ; Phone.change = function ( ) { console .log('我可以改变世界' ); } let nokia = new Phone();console .log(nokia.size) console .log(nokia.name); nokia.change(); class Phone { static change ( ) { console .log('我可以改变世界' ); } static color = '#000' ; constructor (name, size ) { this .name = name; this .size = size; } } Phone.color = '#fff' ; let huawei = new Phone('华为' , 100 );console .log(huawei);console .log(huawei.color);function Phone (brand, price ) { this .brand = brand; this .price = price; } Phone.prototype.call = function ( ) { console .log('call' ); } Phone.prototype.text = function ( ) { console .log('text' ); } function SmartPhone (brand, price, size, color ) { Phone.call(this , brand, price); this .color = color; this .size = size; } SmartPhone.prototype = new Phone; SmartPhone.prototype.constructor = SmartPhone; SmartPhone.prototype.game = function ( ) { console .log('game' ); } console .log(SmartPhone);let sm = new SmartPhone('华为' , 1000 , '5.5inch' , '#fff' );sm.call(); sm.game(); sm.text(); console .log(sm);class Phone { constructor (brand, price ) { this .brand = brand; this .price = price; } call ( ) { console .log('call' ); } } class SmartPhone extends Phone { constructor (brand, price, size, color ) { super (brand, price); this .size = size; this .color = color; } photo ( ) { console .log('photo' ); } call ( ) { console .log('视频通话' ) } } let xiaomi = new SmartPhone('小米' , 1000 , '5.5inch' , '#fff' );xiaomi.call(); xiaomi.photo(); console .log(xiaomi);class Phone { get price () { console .log('价格属性被获取了' ); return '111' } set price (value ) { console .log('价格属性被设置' ); } constructor (brand, price ) { this .brand = brand; this .price = price; } } let ph = new Phone('huawei' , 100 );ph.price = 'free' ; console .log(ph.price);class Chef { constructor (food ) { this .food = food; this .dish = []; } get menu () { return this .dish } set menu (dish ) { this .dish.push(dish) } cook ( ) { console .log(this .food) } } let zhangsan = new chef();console .log(zhangsan.menu = 'tomato' ); console .log(zhangsan.menu = 'pizza' ); console .log(zhangsan.menu);
数值拓展 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 function floatNumberEquals (a, b ) { if (Math .abs(a - b) < Number .EPSILON) { return true ; } else { return false ; } } console .log(floatNumberEquals(0.1 + 0.2 , 0.3 ));console .log(floatNumberEquals(0.3 , 0.3 ));let b = 0b1010 ;let o = 0o777 ;let d = 100 ;let x = 0xff ;console .log(Number .isFinite(100 ));console .log(Number .isFinite(100 / 0 ));console .log(Number .isFinite(Infinity ));console .log(Number .isNaN(1234 ));console .log(Number .parseInt('111' ));console .log(Number .parseFloat('111.111' ));console .log(Math .trunc(3.4 ));console .log(Object .is(NaN , NaN )); console .log(NaN === NaN ); console .log(Object .is(120 , 120 ));const obj1 = { host: 1 , name: 2 , get ( ) { console .log('get' ); } } const obj2 = { host: 2 , test ( ) { console .log(test); } } console .log(Object .assign(obj1, obj2));const school = { name: '尚硅谷' } const cities = { xiaoqu: ['北京' , '上海' , '深圳' ] } Object .setPrototypeOf(school, cities);console .log(school);
模块化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 let {stat,exists,readFile} = require ('fs' );let _fs = require ('fs' );let stat = _fs.stat;let exists = _fs.exists;let readFile = _fs.readfile;import {stat,exists,readFile} from 'fs' ;export var firstname = 'michael' ;export var lastname = 'jackson' ;export var year = 1958 ;
ES7 Array.includes() 检查数组中是否包含某个值,返回值是true/false
ES8 async+await
async和await两种语法集合可以让异步代码像同步代码一样
async函数的返回值为Promise对象
Promise对象的结果由async函数执行的返回值决定
await表达式
await必须写在async函数中
await右侧的表达式一般为promise对象
await返回的是promise成功(resolve)的值
await的promise失败了,就会抛出异常,需要通过try catch捕获处1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 async function fn ( ) { return new Promise ((resolve, reject ) => { reject('错误' ); }) } const result = fn();result.then(value => { console .log(reason) }, reason => { console .error(reason); }) console .log(result);const p = new Promise ((resolve, reject ) => { reject('yonghu' ); }) async function main ( ) { try { let data = await p; console .log(data); } catch (err) { console .error(err); } } main();
Object对象新方法
Object.values()方法返回一个给定对象的所有可枚举属性值的数组
Object.entries()方法返回一个给定对象自身可遍历属性[key,value]的数组
Object.getOwnPropertyDescriptor()方法获取对象描述对象,可以进行深层次克隆
Object.fromEntries二维数组 转 键值对对象1 2 3 4 5 const result = Object .fromEntries([ ['name' , '尚硅谷' ], ['xueke' , 'Java 前端' ] ]) console .log(result);
ES9
扩展运算符与rest参数1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 function connect ({ host, port, ...args } ) { console .log(host, port, args); } connect({ host: 1 , port: 2 , username: 3 , password: 4 }); const skillone = { q: '天音波' , w: '金钟罩' } const skillTwo = { e: "铁布衫" } const ms = {...skillone, ...skillTwo }; console .log(ms);
正则扩展 命名捕获分组 1 2 3 4 5 6 7 8 9 10 let str = `<a href="http://www.atguigu.com">尚硅谷</a>` ;const reg = /<a href="(.*)">(.*)<\/a>/ ;const result = reg.exec(str);console .log(result[1 ], result[2 ]);const reg2 = /<a href="(?<url>.*)">(?<text>.*)<\/a>/ ;const result = reg2.exec(str);console .log(result.groups.url, result.groups.text);
声明字符串 1 2 3 4 5 6 7 8 9 let str = 'JS5211314你知道么555啦啦啦' ;const reg = /\d+(?=啦)/ ; const result = reg.exec(str);console .log(result);const regfan = /(?<=么)\d+/ ; let result2 = regfan.exec(str);console .log(result2);
正则扩展的dot模式
字符串trimStart trimEnd 清除字符串左边和右边空白 1 2 3 4 let str = ' ilove ' ;console .log(str);console .log(str.trimStart());console .log(str.trimEnd());
ES10 1 2 3 4 5 6 7 8 const arr = [1 , 2 , 3 , [5 , 6 , [8 , 9 ]]];console .log(arr.flat(2 )); let s = Symbol ('111' );console .log(s.description);
ES11
私有属性 #属性名
Promise allSettled
动态加载import1 2 3 4 5 btn.onclick = function ( ) { import ('src/index.js' ).then(module => { module .hello(); }) }
全局this(globalThis),支持浏览器和nodejs。取代window,可以在浏览器和nodejs中同时运行
字符串正则批量获取 1 2 3 4 const result = str.matchAll(reg);for (let v of result){ console .log(v); }
可选链操作符?. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 let a= { b:{ c:{ d:1 } } } function main (config ) { const result = config && config.b && config.b.c && config.b.c.d; const result2 = config?.b?.c?.d; } main(a);
BigInt类型,用于大数值计算 1 2 3 4 let n = 123 ;console .log(BigInt (n));n = Number .MAX_SAFE_INTEGER; console .log(BigInt (n)+BigInt (100 ));