标准库 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

    window.Array 全局对象(也是函数) Array(3) // {length:3} Array(3,3)...

  • 标准库 Array

    Js内存中分stack 和heapstack 中有global/window,对应heap中的一个哈希表,哈希表中...

  • 标准库-Array

    静态方法 Array.isArray()Array.isArray()方法返回一个布尔值, 表示参数是否为数组. ...

  • JS 基础之数组与伪数组

    标准库之window.array. -window.Array 全局对象(也是函数)(1) 创建数组 注意:Arr...

  • JS标准库之Array

    String(1) // ‘1’ ...

  • JS标准库之Array

    push() 可以接收任意数量的参数,把他们逐个添加到数组末尾,并返回修改后数组的长度pop() 从数组末尾移除最...

  • Swift复习系列:下标

    在访问Array或Dictionary时,我们除了可以通过系统的标准函数库,还可以使用下面的方式: array[i...

  • Swift的Copy-on-Write技术

    Copy-on-Write技术 Swift针对标准库中的集合类型(Array、Dictionary、Set)进行优...

  • Swift中值类型赋值操作

    在Swift标准库中,为了提升性能,String、Array、Dictionary、Set采取了Copy On W...

  • 2019-05-17 造轮子

    标准库的扩充 underscore.js 扩充了 Array 和 Object 相关 API moment.js ...

网友评论

    本文标题:标准库 Array

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