==============================================================================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); }