第一次在掘金髮文章,好緊張啊~~~~(>_<)~~~~
複製代碼
先說一下箭頭函數,由於下面默認都使用箭頭函數,基本上不會出現function
字樣。ios
// 僅作舉例使用哈
// 原始函數
function json2string(json){
return JSON.stringify(json)
}
// 一級簡寫: 建立一個變量,並使這個變量等於一個箭頭函數
const json2string = (json) => {
return JSON.stringify(json)
}
// 二級簡寫:當函數只有一個參數的時候,能夠省略參數括號
const json2string = json => {
return JSON.stringify(json)
}
// 三級簡寫: 當函數表達式只有一行的時候,能夠省略return和{}
const json2string = json => JSON.stringify(json)
// 感謝@blacker2018大佬提醒,本例的四級簡寫
const json2string = JSON.stringify
// 例外:當函數沒有參數的時候不能省略()
const helloWorld = () => 'hello world!'
複製代碼
上面是箭頭函數的基本用法,另外說兩句:面試
1, 箭頭函數沒有本身的thisjson
2, 箭頭函數的this指向從自身像外層找所能找到的第一個使用function
聲明的函數(見例1)axios
3, 若是一直找到最頂層都沒有function聲明的函數,this
指向window
數組
3, 9021年了,多使用箭頭函數吧,畢竟好處那麼多,代碼簡潔那麼多bash
例1:函數
export default {
name: 'test',
data(){ // 這裏不能用箭頭函數,會改變this指向,請注意
return {
count: 0
}
},
mounted(){ // 同理,不能箭頭函數
this.$axios({...}).then(res => this.count = res.count)
}
}
複製代碼
囉嗦一句,既然用了箭頭函數,就不要存 this 否則代碼會讓後來人吐槽的ui
好了,BB了半天,正文開始了。this
filter
的中文解釋是過濾,功能也顯而易見,在一個數組中過濾出知足要求的數據,並返回一個由全部知足條件的數據組成的數組spa
let arr = array.filter(callback[, thisObject]);
e.g.1 找出一個數組中全部大於3的數字
let arr = [1,2,3,4,5,6,7,8,9]
let arr2 = arr.filter(ele => ele > 3)
複製代碼
e.g.2 過濾數據數據中的全部disabled
爲true
的數據
const data = [
{
title: 'test1',
disabled: false,
},
/*...省略100個*/
{
title: 'test100',
disabled: true,
}
]
const disabledList = data.filter(ele => ele.disabled)
複製代碼
e.g.3 這個很重要,仍是上面的數據,需求要實現找出全部disabled
爲true
的數據的title
const disabledList = data.filter(ele => ele.disabled && ele.title) // 這樣能夠嗎? false. 由於filter 不會執行 第一個條件以後的全部條件
複製代碼
難道這個需求就不能實現了嗎?非也。接着往下看
這裏的map
不是「地圖」的意思,而是指「映射」。map
函數相似於上面的filter
同樣,接收一個函數,對數組中的每一個元素執行相同的操做,接收一個並返回一個由全部知足條件的數據組成的數組
let newArray = array.map(callback[, thisObject]);
e.g.1 上面filter
不能實現的功能,如今配合map實現如下
const data = [
{
title: 'test1',
disabled: false,
},
/*...省略100個*/
{
title: 'test100',
disabled: true,
}
]
// map 函數 當條件不知足時會return undefined 再filter過濾一下
const disabledList = data.map(ele => ele.disabled && ele.title).filter(Boolean)
複製代碼
e.g.2
組合數據,這個例子主要是描述一種業務場景,能夠看到data中的product字段從我的理解的意義上講,price應該和title && author是一個級別的。如今咱們就實現咱們的想法
const data = [
{
title: 'egg',
author: 'chicken',
product: {
price: 100,
age: 2
}
},
{
title: 'dog',
author: 'dog',
product: {
price: 1000,
age: 0.5
}
}
]
const newArray = data.map(ele => {
return {
...ele,
...ele.product || {} // 兼容沒有product狀況
}
})
// 上面的函數獲得的結果就知足了咱們自身的需求 ...擴展運算符後面會講
{
title: 'egg',
author: 'chicken',
price: 100,
age: 2
product: {
price: 100,
age: 2
}
}
複製代碼
forEach
函數相似於上面的map
同樣,接收一個函數,對數組中的每一個元素執行相同的操做,和filter/map不一樣的是 forEach 沒有返回值
forEach()
對於空數組是不會執行回調函數的
array.forEach(callback[, thisObject]);
const data = [
{
title: 'test1',
disabled: false,
},
/*...省略100個*/
{
title: 'test100',
disabled: true,
}
]
// map 函數 當條件不知足時會return undefined 再filter過濾一下
const disabledList = data.map(ele => ele.disabled && ele.title).filter(Boolean)
/***************************************************/
// 上面的例子使用了filter和map兩個遍歷 使用forEach一遍就能夠實現 更高效
let arr = []
data.forEach(ele =>{
if(ele.disabled) arr.push(ele.title)
})
複製代碼
some
中文意思是一些,在JS中表示數組中當有一個數據知足條件時返回true
some()是對數組中每一項運行給定函數,若是該函數對任一項返回true,則返回true。
some接收一個函數做爲參數,函數有三個參數:
e.g.1
const data = [1,2,3,4,5,6,8]
console.log(data.some(ele => ele > 4)) // true
console.log(data.some(ele => ele < 4)) // true
console.log(data.some(ele => ele > 8)) // false
console.log(data.some(ele => ele >= 2)) // true
console.log(data.some(ele => ele < 1)) // false
複製代碼
e.g.2
const data = [
{ id: 2, count: 200 },
{ id: 4, count: 300 },
{ id: 6, count: 100 },
{ id: 8, count: 700 },
]
console.log(data.some(ele => ele.count > 700)) // false
console.log(data.some(ele => ele.count > 600)) // true
複製代碼
every()是對數組中每一項運行給定函數,若是該函數對每一項返回true, 則返回true。
every接收一個函數做爲參數,函數有三個參數:
const data = [
{ id: 2, count: 200 },
{ id: 4, count: 300 },
{ id: 6, count: 100 },
{ id: 8, count: 700 },
]
console.log(data.every(ele => ele.count > 700)) // false
console.log(data.every(ele => ele.count < 900)) // true
複製代碼
arr.reduce(callback,[initialValue])
複製代碼
// 經典面試題: 使用reduce同時實現map和filter
// 例子: 找出全部double後大於50的數
const doubledOver50 = num => num.reduce((finalList, ele) => {
const number = ele * 2
if (number > 50) {
finalList.push(ele)
}
return finalList
}, [])
doubledOver50(numbers) // [30, 40]
複製代碼
** reduce還有不少妙用,能夠掘金搜一下哈
這個是ES10的方法,實現數組扁平化,flat函數接收一個值指定要提取嵌套數組的結構深度,默認值爲 1,返回一個包含將數組與子數組中全部元素的新數組。
因爲是ES10的方法,使用的話須要考慮一下兼容性問題,貼上MDN地址:Array.prototype.flat()
let arr1 = [1, 2, [3, 4]];
arr1.flat(); // [1, 2, 3, 4]
let arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat(); // [1, 2, 3, 4, [5, 6]]
let arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2); // [1, 2, 3, 4, 5, 6]
//使用 Infinity 做爲深度,展開任意深度的嵌套數組
arr3.flat(Infinity); // [1, 2, 3, 4, 5, 6]
複製代碼
扁平化與空項
flat()
方法會移除數組中的空項:
let arr4 = [1, 2, , 4, 5];
arr4.flat(); // [1, 2, 4, 5]
複製代碼
indexOf()
接收一個參數,並查找該元素在數組中的下標,遍歷方向是從前向後遍歷
let arr = [1,2,3,4,5,6,7]
const index = arr.indexOf(2) // 1
複製代碼
lastIndexOf()接收一個參數,並查找該元素在數組中的下標, 與indexOf
不一樣的是遍歷方向是從後向前遍歷
let arr = [1,2,3,4,5,2,7]
const index = arr.lastIndexOf(2) // 5
複製代碼
find()
找到數組中第一個符合條件的數據
find()接收一個函數做爲參數, 函數的可選參數有
e.g.1:
let students = [
{ name: 'tom', age: 18 },
{ name: 'jeck', age: 20 },
{ name: 'bob', age: 19 }
]
let monitor = students.find(ele => ele.age > 18) // {name: 'jeck', age: 20} [返回第一個符合條件的數據並結束循環]
複製代碼
查找第一個符合條件的元素的下標,和find
的區別就是find
返回元素, findIndex
返回下標
array.findIndex(callback, thisValue)
複製代碼
let students = [
{ name: 'tom', age: 18 },
{ name: 'jeck', age: 20 },
{ name: 'bob', age: 19 }
]
let monitor = students.findIndex(ele => ele.age > 18) // 1 [返回第一個符合條件的數據的下標並結束循環]
複製代碼
Object.assign()
方法用於將全部可枚舉屬性的值從一個或多個源對象複製到目標對象。它將返回目標對象。
工做中用的最多的就是合併兩個對象了,可是大多數狀況下可使用…
擴展運算符代替
對於Object.assign()
是否能實現深拷貝,答案是否。具體緣由點我
下面的例子僅僅只是介紹一下對象合併
let obj1 = { a: 1 }
let obj2 = { b:2 }
let obj3 = Object.assign(obj1, obj2) // {a: 1, b: 2}
let obj4 = Object.assign({}, obj1, obj2, obj3) // {a: 1, b: 2}
// 注意:對象的合併是從右向左進行,在上面的例子中,若是obj2中有和obj3同樣的key 那麼obj2中key對應的val會被obj3中對應的val覆蓋掉
複製代碼
Object.keys()
方法會返回一個由一個給定對象的自身可枚舉屬性組成的數組,數組中屬性名的排列順序和使用 for...in
循環遍歷該對象時返回的順序一致 。
// 數組
var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']
// 類數組對象
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']
// 隨機鍵排序的類數組對象
var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj)); // console: ['2', '7', '100']
複製代碼
一般使用Object.keys()
代替for...in
來遍歷對象
let obj = {
a: 1,
b: 2
}
let keys = Object.keys(obj).map(ele => ele += 'aaaaa' /* 能夠分別對每一個key作一些改造 */)
複製代碼
Object.values()
方法返回一個給定對象自身的全部可枚舉屬性值的數組,值的順序與使用for...in
循環的順序相同 ( 區別在於 for-in 循環枚舉原型鏈中的屬性 )。
var obj = { foo: 'bar', baz: 42 };
console.log(Object.values(obj)); // ['bar', 42]
// 類數組對象
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.values(obj)); // ['a', 'b', 'c']
// 隨機鍵排序的類數組對象
var an_obj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.values(an_obj)); // ['b', 'c', 'a']
複製代碼
一般使用Object.values()
代替for...in
來遍歷對象取value
let obj = {
a: 1,
b: 2
}
let values = Object.values(obj).map(ele => ele++ /* 能夠分別對每一個value作一些改造 */)
複製代碼
在開發工做中,不少場景下均可以使用…
簡化代碼,下面列了一些使用場景
Math.max (求數組最大值)
// e.g.1 求數組最大值
let data = [1,2,3,4,5,6,7,8]
const big = Math.max(...data) // 8
// e.g.2 取庫存量最多商品的庫存
let data = [
{
name: '橘子',
stock: 100
},
{
name: '橙子',
stock: 300
},
{
name: '蘋果',
stock: 700
}
]
// 結合map使用(map返回一個新數組)
const big = Math.max(...data.map(ele => ele.stock)) // 700
// (其實這個例子用sort方法就能實現,只是舉個例子)
複製代碼
Math.min
// e.g.1 取最小值
// e.g.1 求數組最大值
let data = [1,2,3,4,5,6,7,8]
const big = Math.min(...data) // 1
複製代碼
Array.from
// e.g.1 數組去重
let data = [1,1,2,3,4,4,5,6]
const arr = [...new Set(data)] // [1,2,3,4,5,6]
複製代碼
字符串轉數組
// e.g.1 將一個字符串轉成數組
const arr = [...'hello'] // [‘h’, 'e', 'l', 'l', 'o']
複製代碼
合併數組
// e.g.1 合併兩個數組
let arr1 = [1,2,3,4,5,6]
let arr2 = [1,2,3,4,5,6]
let arr2 = [...arr1, ...arr2] // [1,2,3,4,5,6,1,2,3,4,5,6]
複製代碼
合併對象
let data1 = {
name: '王二麻子',
age: 12,
class: '2(1)班'
}
let data2 = {
name: '王二麻子',
hobby: '王者榮耀'
}
let w2mz = {...data1, ...data2}
// 輸出:
{
name: '王二麻子',
age: 12,
class: '2(1)班',
hobby: '王者榮耀'
}
// ** 注意: 當出現重複的key的時候,後面的key對應的val會覆蓋掉前面的key對應的val
複製代碼
充當函數省略參數 …other
…other 在函數體內使用other的時候, other是一個由省略參數組成數組 e.g.1
const sum = (a, b, ...num) => {
let total = num.reduce((prev, current) => current + prev, 0)
return a + b + total
}
sum(1, 2, 3, 4, 5, 6, 7, 8, 9)
複製代碼
e.g.2
// 實現一個累加器 要求 能夠傳任意個參數 函數返回一個全部參數的累加和
const sum = (...num) => num.reduce((prev, current) => current + prev, 0)
console.log(sum(1, 2, 3, 4)) // 10
複製代碼
有錯別字或者理解有誤的地方大佬們指出來哈。千萬不要: he~ tui(我能夠發語音😊)