York's Blog

JS的数组

浏览器提供的接口叫API

  1. JavaScript window.Array对象是用于构造数组的全局对象(也是函数)

    1
    2
    var a=Array(3) //生成一个length为3的每个都是undefined的数组 [undefined,undefined,undefined]<=>{length:3}
    var a=Array(3,3) //生成一个length为2 的每个都是3的数组 [3,3]

    上面两行体现了JS的不一致性就是垃圾

  2. Number String Boolean 不加new 返回一个基本类型的值,加new返回复杂类型(对象)
    Object Array Function 加new不加new都一样,是返回复杂类型(对象)
  3. var 声明一个变量 ES6: let 声明一个变量,不会变量提升
  4. function 声明一个函数 关键字 等同于 if else var function
  5. Function 全局对象 var f=new Function(‘a’,’b’,’return a+b’)

函数声明方法总结

1
2
3
具名函数 function f(x,y){       匿名函数function (x,y){  
return x,y return x,y
} }

JS中数组的本质

  1. 人类理解:数组就是数据的有序集合
    JS理解:数组就是原型链中有Array.prototype的对象
  2. 数组和对象的本质区别就是__proto__指向的是不是Array.prototype(push pop shift)
  3. 伪数组的定义:如果与Array.prototype没有关系(原型链中没有Array.prototype这一环)或者没有.push .pop .shift方法
    arguments是伪数组

数组最常用的API

Array 的用法全览:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array

a=[‘a’,’b’,’c’,’d’,’e’]

  1. Array.prototype.forEach需要接受一个函数

    1
    2
    3
    4
    5
    6
    7
    a.forEach(function(){}) ==> a.forEach.call(a,function(){})
    a.forEach(function(x,y,z){console.log(x,y,z)}) //x的参数是value,y的参数是key,z就是a自己
    function forEach(array,x){
    for(let i=0;i<array.length;i++){
    x(array[i],i)
    }
    }
  2. Array.prototype.sort默认从小到大
    a.sort接受一个函数,返回的值如果是0,那么位置一样,如果结果是正数,前面的大,放后面,如果结果是负数,前面的小,放前面 sort就是快速排序

    1
    2
    a.sort(function(x,y){return x-y})  //从小到大,把数组自己改变
    a.sort(function(x,y){return y-x) //从大到小
  3. Array.prototype.join

    1
    var a=[1,2,3]   a.join('york')   "1york2york3york" //join把数组变成字符串
  4. Array.prototype.concat
    连接多个数组,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    var a=[1,2,3],b=[4,5,6];  
    var c=a.concat(b);
    console.;log(c); //[1,2,3,4,5,6]

    //a.concat()复制一个数组 利用concat会返回一个新数组
    var a=[1,2,3]
    b=a.concat([])
    console.log(b) //[1,2,3]
    a===b false
  5. Array.prototype.map
    a.map和a.forEach的区别,a.forEach返回undefined,a.map返回把函数返回的每一个值都收集起来组成新的数组
    a.map(function(value,key){return value×2})

  6. Array.prototype.filter
    return的是boolean,如果值是true就要,是false就不要

    1
    2
    3
    var a=[1,2,3,4,5,6,7,8,9,10];
    a.filter(function(value,key){return value>=5})
    [5,6,7,8,9,10]
  7. Array.prototype.reduce
    遍历这个数组,每次取一个结果放在下一个身上

    1
    var a=[1,2,3,4,5,6,7,8,9,10];a.reduce(function(sum,n){return sum+n},0) 求和55

总结

  1. map可以用reduce表示

    1
    var a=[1,2,3] a.reduce(function(arr,n){arr.push(n*2);return arr},[])[2,4,6]
  2. filter可以用reduce表示

    1
    var a=[1,2,3] a.reduce(function(arr,n){if(n%2===0){arr.push(n);return arr},[])[2]

数组题

  1. var students = [‘小明’,’小红’,’小花’] var scores = { 小明: 59, 小红: 99, 小花: 80 } students.sort(???)
    请填写 ??? 使得 students 按分数的高低从大到小排列

    1
    students.sort(function(x,y){return scores[y]-scores[x]})
  2. var a = [1,2,3,4,5,6,7,8,9] a.filter(???).map(???) // [4,16,36,64]

    1. 获取所有偶数
    2. 得到所有偶数的平方
      1
      2
      a.filter(function(value,key){if(value%2===0)return value})
      a.filter(function(value,key){if(value%2===0)return value}).map(function(value,key){return value*value})
  3. var a = [1,2,3,4,5,6,7,8,9] a.reduce(???,???)
    计算所有奇数的和

    1
    a.filter(function(value,key){if(value%2===1)return value}).reduce(function(sum,n){return sum+n},0)
Proudly published with Hexo