标准库 Array

作者: _ClariS_ | 来源:发表于2019-08-01 01:10 被阅读1次
    简单类型与复杂类型的区别
    String、Number、Boolean、Object 另见文章:简单类型与对象(复杂类型)的区别,以下只对 Array 和 Function 进行讲解

    window.Array 全局对象(也是函数)

    • Array(3) // {length:3}
    var a = Array(3) 的内存图 Array(3)
    • Array(3,3) // [3,3]
    Array(3,3) Array(3)和Array(3,3)的不一致性
    • new Array(3) // {length:3}
    • new Array(3,3,) // [3,3]

    由结果可知 Array 加不加 new 结果都一样
    Array 的更多用法见 Array MDN

    window.Function 全局对象(也是函数)

    • Function('x','y','return x+y')
    • new Function('x','y','return x+y')

    由结果可知 Function 加不加 new 结果都一样

    这里简单说一下 function 与 Function 的区别:

    • function 是一个关键字,例如 if、else、var 等
      var 声明一个变量 a,例如var a = 1
      function 声明一个函数 f,例如 function f(){}
    • Function 是一个全局对象(函数对象)
      window.Object
      window.Function
      声明一个函数对象 f,例如 var f = new Function('x','y','x+y')

    函数的声明方法

    1. 具名函数
     function f(x,y){
         return x + y
     }
    
    1. 匿名函数 + var
     var f
     f = function(x,y){
        return x+y 
     }
    
    1. 具名函数 + var
     var f1 
     f1 = function f2(x,y){
         return x+y
     }
     console.log(f2) // undefined
     console.log(f1) // ƒ f2(x,y){ return x+y }
    
    1. window.Function + var
     var f
     f = new Function('x','y','return x+y')
    

    JS 中数组的本质

    人类理解:数组就是数据的有序集合
    JS理解:数组就是原型链中有 Array.prototype 的对象

    数组和对象的区别:

    array.__proto__ = Array.prototype
    object.__proto__ = Object.prototype
    

    即数组和对象分别对应的原型(共用属性)不同

    数组本质上是一个拥有特殊原型链的对象,数组之所以是数组,并不是因为它本身是数组,而是因为我们遍历的时候把这个对象当做数组来进行遍历(用数字下标进行遍历)

    伪数组

    定义:

    • 有 0,1,2,3,4,5...n,length 这些 key 的对象
    • 原型链中没有 Array.prototype

    这样的对象就是伪数组

    目前知道的伪数组有

    1. arguments 对象(打印出函数执行时的参数)
    arguments 对象
    1. document.querySelectAll('div') 返回的对象

    数组的 API

    1. Array.prototype.forEach
    forEach

    理解:forEach 会遍历['a','b','c']这个数组,对数组中的每一项都调用 function(value,key){ console.log(value,key) } 这个函数(调用3次),并且每次在调用这个函数时会传入两个参数,分别是 value 和 key,最后打印出3组不一样的value 和 key。

    问:function forEach(array,x){ }) 传了 array 和 x 两个参数,可为什么
    a.forEach(function(value,key){ }) 只用传 function(value,key){ } (相当于参数 x )这一个参数就可以对 a 这个数组进行遍历呢?

    答:可以将 a.forEach( function(){} ) 理解为a.forEach.call( a,function(){} ),这里数组 a 传入后实际上是用 this 进行获取的

    问:for i 循环和 Array.prototype.forEach 都可以遍历数组,请问它们之间的区别是什么?

    答:for 是关键字,不是函数;Array.prototype.forEach 是一个函数。
      for 循环可以 break 和 continue;Array.prototype.forEach 不支持 break 和 continue。

    1. Array.prototype.sort
    sort

    只有 a.sort() 会改变自身

    1. Array.prototype.join
    join
    1. Array.prototype.concat
      contcat 表示合并


      concat
    2. Array.prototype.toString
      返回一个字符串,表示指定的数组及其元素

    toString
    1. Array.prototype.map
      map 表示映射
    map map与forEach的区别
    1. Array.prototype.filter
      filter 表示过滤
    filter
    1. Array.prototype.reduce
      reduce 表示减少、压缩
    reduce map、filter分别用reduce表示

    其他 API 见 Array MDN

    相关文章

      网友评论

        本文标题:标准库 Array

        本文链接:https://www.haomeiwen.com/subject/slyxdctx.html