目录

  • 数据的重要性能【遍历、转换、生成、查找】
  • 数组遍历

    • ES5中遍历有多少种办法?

      • for循环
      • forEach
      • every
      • for-in
    • ES6新增for-of

      • 为什么es6要新增一个for-of?
      • for-of不能间接遍历对象? —— 对于可迭代接口
    • 劣势和毛病
  • 将伪数组转换成数组

    • 什么是伪数组?
    • ES5的转换
    • ES6的转换
  • 创立新数组

    • ES5
    • ES6

      • Array.from
      • Array.of
      • Array.prototype.fill
  • 数组中查找元素

    • ES5
    • ES6

      • Array.prototype.find
      • Array.prototype.findIndex
  • 函数参数

    • Array.from(arrayLike,mapFn,thisArg)
    • Array.of(element0[,element1...])
    • Array.fill(value,start,end)
    • Array.find(callback[, thisArg])
    • Array.findIndex(callback[, thisArg])
  • ES6-ES10学习幅员

数据的重要性能【遍历、转换、生成、查找】

数组遍历

ES5中遍历有多少种办法?

const arr = [1,2,3,4,5]

for循环

for (let i = 0;i < arr.length; i++) {    console.log(arr[i]) // 1 2 3 4 5}

forEach

数组遍历办法

arr.forEach(function(item){    console.log(item) //1 2 3 4 5})

代码简洁上看,forEachfor循环写法要简洁。

然而forEach不反对reakcontinue,每个元素必须遍历到

// for循环能够应用break管制遍历进行for (let i = 0;i < arr.length; i++) {    if(arr[i] === 2){        break    }    console.log(arr[i]) // 1}// for循环能够应用continue管制遍历跳过for (let i = 0;i < arr.length; i++) {    if(arr[i] === 2){        continue    }    console.log(arr[i]) // 1 3 4 5}//forEach不反对break和continuearr.forEach(function(item){    if(item === 2) {        break // or continue 都会报错 Unsyntactic break 语法不反对    }    console.log(item)})arr.forEach(function(item){    if(item === 2) {        return false //跳过本此循环 相似continue    }    console.log(item) // 1 3 4 5})

every

数组遍历办法

arr.every(function(item){    console.log(item) // 1})// every继不持续遍历取决于返回值,为true则持续遍历,false退出。默认是false// 如果要全副遍历实现 须要返回truearr.every(function(item){    console.log(item)  // 1 2 3 4 5    return true})// 能够通过返回的true or false 来管制循环arr.every(function(item){    if(item === 2) {        return false //相当于for循环中的break    }    console.log(item)  // 1    return true})

for-in

for-in自身是未object遍历的,而不是为数组。尽管能够遍历数组,然而有瑕疵。

for-in中能够应用continuebreak,然而不反对写return,会报错Illegal return statement

// 之所以数组能够用for-in取遍历// 是因为1.数组是对象的一种 2.数组是可遍历的for (let index in arr) {    console.log(index, arr[index])}// 0 1// 1 2// 2 3// 3 4// 4 5//瑕疵一:// 因为arr是一个对象,所以能够定义属性并赋值arr.a = 8for (let index in arr) {    console.log(index, arr[index])}// 再次进行遍历// 0 1// 1 2// 2 3// 3 4// 4 5// a 8  这个时候a不是索引,而是字符串,如果这里咱们还是认为遍历之后只是返回索引就容易呈现bug//瑕疵二:for(let index in arr) {    if(index === 2) {        continue    }    console.log(index, arr[index])}// 0 1// 1 2// 2 3// 3 4// 4 5//为什么能够应用continue然而continue却没有起作用//因为这个时候index是字符串而不是索引//解决办法一:只判断值,不判断类型for(let index in arr) {    if(index == 2) {        continue    }    console.log(index, arr[index])}// 0 1// 1 2// 3 4// 4 5//解决办法二:将index隐式转化成数字类型for(let index in arr) {    if(index * 1 === 2) {        continue    }    console.log(index, arr[index])}// 0 1// 1 2// 3 4// 4 5

for-of(ES6新增)

// item不是下标,间接是值,且能够应用break终止循环for(let item of arr) {    console.log(item) // 1 2 3 4 5}

为什么es6要新增一个for-of?

要判断一个对象是不是可遍历的,不能说其是不是一个数组 or Object。

ES6容许用户自定义数据结构,这种数据结构既不是数组,也不是Object,然而都是可遍历的。这种数据结构进行遍历,不能用数组的也不能用for-in,就须要新增一种for-of去遍历

举例子:

// 定义一个数据结构,想要遍历拿到类别中的最低值const Price = {    A: [1.5, 2.3, 4.5],    B: [3, 4, 5],    C: [0.5, 0.8, 1.2]}for (let key in Price) {    console.log(key, Price[key])    // [1.5, 2.3, 4.5]    // [3, 4, 5]    // [0.5, 0.8, 1.2]}// 应用for-in只能返回数组,无奈间接把三个最低值遍历进去

for-of不能间接遍历对象? —— 对于可迭代接口

for-of能够用来遍历Set构造和Map构造,然而不能够间接遍历object,因为其不是可遍历的对象,Iterable接口没有实现。

上面看一下:数组、Set和Map的原型对象上有迭代器



对象办法下面没有

那么咱们调用一下数组下面的iterator办法

const arr = ['foo', 'bar', 'baz']console.log(arr[Symbol.iterator]())// 返回一个iterator的对象,其原型对象下面有next办法// Array Iterator {}  //  __proto__: Array Iterator//    next: ƒ next()   //    Symbol(Symbol.toStringTag): "Array Iterator"//    __proto__: Objectconst iterator = arr[Symbol.iterator]()console.log(iterator.next()) // { value: 'foo', done: false }console.log(iterator.next()) // { value: 'bar', done: false }console.log(iterator.next()) // { value: 'baz', done: false }console.log(iterator.next()) // { value: undefined, done: true }

能够看到for-of外部的循环规定,外面有一个迭代器。只有对象能够实现Iterable接口就能够应用for-of进行循环。上面对一个对象进行可迭代革新。

劣势和毛病

循环形式劣势毛病特点
for循环反对break和continue不反对return
forEach写法比for简洁明了全副遍历,不反对break和continuereturn false相当于continue
every能够反对相似for的break和continue
for-in能够遍历object遍历数组的时候存在瑕疵不反对return
for-of(ES6新增)能够遍历除数组和object之外可遍历的数据结构,反对break和continue不反对return
  • return只能用在函数体内,呈现在代码的任何中央都会报错

将伪数组转换成数组

什么是伪数组?

简略了解:
具备一些数组的个性:可遍历、有长度。然而不能间接调用数组的API,相似于 argumentsDOM nodeList

严格了解:

  1. 依照索引形式存储数据
  2. 具备length属性
{0:'2',1:'b',length:2} 这种类型都能够称之为伪数组

为什么要将伪数组转换成数组?

如果想要应用数组的API,就须要将伪数组转换为数组

ES5的转换

let args = [].slice.call(arguments) //collection// arguments 只能在函数体内应用// ES6曾经废除arguments的应用let imgs = [].slice.call(document.querySelectorAll('img')) // NodeList

ES6的转换

Array.from

let args = Array.from(arguments)let imgs = Array.from(document.querySelectorAll('img'))

大抵说一下Array.from这个函数

Array.from(arrayLike,mapFn,thisArg)<br/>
第一个参数:伪数组,必须<br/>
第二个参数:遍历函数,非必须<br/>
第三个函数:this对象,非必须

举一个例子:
初始化一个长度为5的数组

//ES5 let array = Array(5)array.forEach(function (item) {    item = 1})console.log(array) // [empty × 5] forEach只会遍历存在的元素//应用for循环能够遍历,然而仍旧是先申明,后赋值for (let i = 0, len = array.length; i < len; i++) {    array[i] = 1}console.log(array) // [1,1,1,1,1]// 先将数组转化为5个空字符串数组,而后每个遍历赋值let arr = Array(6).join(' ').split('').map(item => 1)console.log(array) // [1,1,1,1,1]// ES6//应用Array.from能够达到初始化并填充的成果let array = Array.from({ length: 5 }, function () { return 1 })console.log(array) // [1,1,1,1,1]// 下面之所以第一个参数能够传{ length: 5 },是因为第一个参数应该传伪数组//应用Array.fill能够疾速实现初始化并填充let array = Array(5).fill(1)console.log(array) //[1,1,1,1,1]

创立新数组

ES5

let array = Array(5)let array = ['', ''] //无奈定义长度,只能每个都初始化为空字符串

ES6

Array.from

let array = Array.from({ length: 5 })

Array.of

let array = Array.of(1,2,3,4,5) //参数是依此放进去的元素,能够一个参数能够多个console.log(array) //[1,2,3,4,5]

Array.prototype.fill

let array = Array(5).fill(1) //参数是依此放进去的元素,能够一个参数能够多个console.log(array) //[1,1,1,1,1]
Array.fill(value,start,end)<br/>
第一个参数:填充值<br/>
第二个参数:起始地位,默认为数组的开始<br/>
第三个函数:完结地位,默认为数组的完结<br/>
[start,end)
let array = [1, 2, 3, 4, 5]console.log(array.fill(8, 2, 4)) // [1,2,8,8,5]

数组中查找元素

ES5

查找元素包含看元素在不在数组中,也包含依据某个条件去筛选。

// 一let array = [1, 2, 3, 4, 5]let find = array.filter(function (item) {    return item === 3})console.log(find) // [3]// 能找到没找到都返回一个数组,依据数组的长度判断数组中有或者没有元素let find = array.filter(function (item) {    return item % 2 === 0})console.log(find) // [2,4]// 如果数组中数据特地大,只是要有还是没有,并不要所有的数据// 二// 应用every也能够进行判断然而咱们须要额定定义变量let isExtarray.every(function (item) {    if (item === 3) {        isExt = item        return false    }    return true})console.log(isExt) // 3

ES6

Array.prototype.find

找到查找元素返回其值,找不到返回undefined

let array = [1, 2, 3, 4, 5]let find = array.find(function(item){    return item === 3})console.log(find)  // 2---以后值let find1 = array.find(function(item){    return item === 6})console.log(find1)  // undefined---没有找到let find2 = array.find(function(item){    return item % 2 === 0})console.log(find2)  // 2---找到2就不再持续找了

Array.prototype.findIndex

找到查找元素返回其索引地位,找不到返回-1

let find = array.findIndex(function(item){    return item % 2 === 0})console.log(find)  // 1---索引地位

函数参数

Array.from(arrayLike,mapFn,thisArg)

第一个参数:伪数组,必须<br/>
第二个参数:遍历函数,非必须<br/>
第三个函数:this对象,非必须

Array.of(element0[,element1...])

参数:任意个参数,依此成为数组的元素

Array.fill(value,start,end)

第一个参数:填充值<br/>
第二个参数:起始地位,默认为0<br/>
第三个函数:完结地位,默认为this.length<br/>
[start,end)

Array.find(callback[, thisArg])

第一个参数:回调函数,接管三个参数,element、index、array<br/>
第二个参数:this对象

Array.findIndex(callback[, thisArg])

第一个参数:回调函数,接管三个参数,element、index、array<br/>
第二个参数:this对象

学习幅员