==============================================================================html
本文仅整理部分经常使用的知识点,完整请查看[阮一峰老师的文章][1],该文章也是源于其中
==============================================================================es6
() let声明变量,const声明常量,不容许重复声明
(2) let是块级做用域,不会挂载到window对象中
(3) let须要先声明再调用,不会存在变量提高的问题json
(1)多个变量赋值,并设置默认值数组
let [a=1,b,c] = [,2,3] console.log(a) // 1
(2)json中提取变量
提取json中的data值,并赋值给新的变量number:数据结构
let jsonData = { id: 42, status: "OK", data: [867, 5309] }; let { id, status, data: number } = jsonData; console.log(number);// [867, 5309]
(3)交互2个变量的值模块化
let x = 1; let y = 2; [x, y] = [y, x]; console.log(x) //2
(1)判断一个字符串是否在另外一个字符串函数
let s = 'Hello world!'; s.startsWith('Hello') // true s.endsWith('!') // true s.includes('o') // true
这三个方法都支持第二个参数,表示开始搜索的位置:this
let s = 'Hello world!'; s.startsWith('world', 6) // true s.endsWith('Hello', 5) // true s.includes('Hello', 6) // false
上面代码表示,使用第二个参数n时,endsWith的行为与其余两个方法有所不一样。它针对前n个字符,而其余两个方法针对从第n个位置直到字符串结束。
(2)repeat()
repeat返回一个新的字符串,并将原字符串重复n次。prototype
'hello'.repeat(2) // "hellohello"
(3)padStart(),padEnd()
自动补全字符串code
'x'.padStart(5, 'ab') // 'ababx' 'x'.padEnd(4, 'xaba') // 'xaba'
(4)模板字符串
let tempString = 'hello' console.log(`${tempString} world !`)
ES6 将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为彻底保持不变,减小全局性方法,使得语言逐步模块化。。
function add(x=1,y) { console.log(x+y) } add(undefined,2) // 触发默认值x=1 add(null,2) // 没触发默认值
参数造成单独的做用域,等到初始化结束,这个做用域就会消失:
const x1 = 1; function f1(x1, y = x1) { console.log(y); } f1(2) // 指向参数造成的单独做用域 const x2 = 1; function f2(y = x2) { let x2 = 2; console.log(y); } f2() // 在这个做用域中x2没有定义,因此指向外层的x2
function push(array,...values) { values.map((item)=>{ array.push(item) }) console.log(array) } let arr = [] push(arr,1,2,3,4) // [1,2,3,4]
//数组的深度拷贝 const a1 = [1, 2]; const a2 = [...a1]; a1[0]=2 console.log(a2) // [1,2] //合并数组(浅拷贝) const arr1 = [1,2,3] const arr2 = [4,5,6] const arr3 = [...arr1,...arr2] // [1,2,3,4,5,6] //将字符串转为数组(调用的是遍历器接口(Symbol.iterator),若是一个对象没有部署这个接口,就没法转换) const str = 'hello' console.log([...str]) // ["h", "e", "l", "l", "o"]
// 一、类数组对象:任何length属性的对象 const obj = { '0': 'gao', '1': '26', length:2 } console.log(Array.from(obj)) // ['gao','26'] //二、可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)
Array.of(2) // [2] Array(2) // [,,]
// find():返回第一个符合条件的成员,没有返回undefined const arrFind = [1,4,-5,10].find(value => value<0) console.log(arrFind) // -2 //findIndex():返回第一个符合条件成员的位置,没有返回-1 const arrFindIndex = [1,4,-5,10].findIndex(function (value,index,arr) { return value < 0 }) console.log(arrFindIndex) // 2
console.log([1,2,3].fill(4)) // 【4,4,4】默认从开始到结束都替换 console.log([1,2,3].fill(4,1,2)) // [1,4,3] 替换数组下标第1个到第2个
for (let index of ['a', 'b'].keys()) { console.log(index); } // 0 // 1 for (let elem of ['a', 'b'].values()) { console.log(elem); } // 'a' // 'b' for (let [index, elem] of ['a', 'b'].entries()) { console.log(index, elem); } // 0 "a" // 1 "b"
[1, 2, 3].includes(2) // true [1, 2, 3].includes(4) // false [1, 2, NaN].includes(NaN) // true
//默认拉平一层 console.log([1,2,[3,[4,5]]].flat()) // [1,2,3,[4,5]] //传入要拉平的层数 console.log([1,2,[3,[4,5]]].flat(2)) // [1,2,3,4,5] //传入Infility,所有拉平 console.log([1,2,[3,[4,5]]].flat(Infinity)) // [1,2,3,4,5]
//浅拷贝:若是源对象某个属性的值是对象,那么目标对象拷贝获得的是这个对象的引用 const objName = {name: {surname: 'gao'}} const objAge = {age:26} const person = Object.assign({},objName,objAge) objName.name.surname = 'danny' console.log(person.name.surname) // 'danny'
// 将proto设置为obj的原型对象 let proto = {}; let obj6 = { x: 10 }; Object.setPrototypeOf(obj, proto); proto.y = 20; proto.z = 40; obj6.x // 10 obj6.y // 20 obj6.z // 40
function Rectangle() { // ... } const rec = new Rectangle(); Object.getPrototypeOf(rec) === Rectangle.prototype// true Object.setPrototypeOf(rec, Object.prototype); Object.getPrototypeOf(rec) === Rectangle.prototype// false
//Object.keys():返回一个数组,成员是参数对象自身的(不含继承的)全部可遍历(enumerable)属性的键名。 const obj6 = { foo: 'bar', baz: 42 }; Object.keys(obj6) // ["foo", "baz"] //Object.values():方法返回一个数组,成员是参数对象自身的(不含继承的)全部可遍历(enumerable)属性的键值。 const obj7 = { foo: 'bar', baz: 42 }; Object.values(obj7) // ["bar", 42] //Object.entries() :返回一个数组,成员是参数对象自身的(不含继承的)全部可遍历(enumerable)属性的键值对数组。 const obj8 = { foo: 'bar', baz: 42 }; Object.entries(obj8) // [ ["foo", "bar"], ["baz", 42] ]
//Symbol 值做为对象属性名时,不能用点运算符 const mySymbol = Symbol(); const va = {}; va.mySymbol = 'Hello!'; va[mySymbol] // undefined va['mySymbol'] // "Hello!"
const obj = {}; let a = Symbol('a'); let b = Symbol('b'); obj[a] = 'Hello'; obj[b] = 'World'; const objectSymbols = Object.getOwnPropertySymbols(obj); objectSymbols// [Symbol(a), Symbol(b)] //另外一个新的 API,Reflect.ownKeys方法能够返回全部类型的键名,包括常规键名和 Symbol 键名。 let obj = { [Symbol('my_key')]: 1, enum: 2, nonEnum: 3 }; Reflect.ownKeys(obj)// ["enum", "nonEnum", Symbol(my_key)]
一、Set
const set = [...new Set([1,2,3,3,4,4])] // 1,2,3,4
const set = new Set([1,2,3]) // 添加值,并返回Set结构自己 set.add(4) console.log([...set]) //[1,2,3,4] //删除值,返回bool值表示是否成功 set.delete(4) console.log(set) //[1,2,3] //表示是该值是否为Set成员,返回bool值 console.log(set.has(3)) //清除全部成员,没有返回值 set.clear() console.log([...set]) //[]
const set2 = new Set([1,2,3]) // keys():返回键名的遍历器 for(let i of set2.keys()){ console.log(i) // 1 // 2 // 3 } // values():返回键值的遍历器(set结构没有键名,只有键值,因此keys和values方法同样) for(let i of set2.values()){ console.log(i) // 1 // 2 // 3 } // entries():返回键值对的遍历器 for(let i of set2.entries()){ console.log(i) // [1,1] // [2,2] // [3,3] } //foreach遍历器 set2.forEach((key,value)=>{ console.log(`${key}:${value}`) // 1:1 // 2:2 // 3:3 })
二、Map
for (let item of map.entries()) { console.log(item[0], item[1]); } // "F" "no" // "T" "yes" // 或者 for (let [key, value] of map.entries()) { console.log(key, value); } // "F" "no" // "T" "yes" // 等同于使用map.entries() for (let [key, value] of map) { console.log(key, value); }