数组的扩展

一、Array.from()

  1、用于将两类对象转为真正的数组,类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map)。

  2、length属性一定要有

  3、常见的类似数组的对象是DOM操作返回的NodeList集合,以及函数内部的arguments对象

  4、只要是部署了Iterator接口的数据结构,Array.from都能将其转为数组。

  5、如果参数是一个真正的数组,Array.from会返回一个一模一样的新数组。

二、Array.of()方法

  1、Array.of方法用于将一组值,转换为数组。

  2、对Array构造方法的补充    //主要针对一个参数的产生的歧义  new Array(a);表示创建一个数组长度为a的新数组  new Array(a,b)表示创建数[a,b]

  3、Array.of总是返回参数值组成的数组。如果没有参数,就返回一个空数组。

  4、Array.of方法可以用下面的代码模拟实现。

function ArrayOf(){
  return [].slice.call(arguments);
}

三、数组实例的copyWithin()

  1、数组实例的copyWithin方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。也就是说,使用这个方法,会修改当前数组。

  2、Array.prototype.copyWithin(target, start = 0, end = this.length)

  3、它接受三个参数。这三个参数都应该是数值,如果不是,会自动转为数值。

  • target(必需):从该位置开始替换数据。
  • start(可选):从该位置开始读取数据,默认为0。如果为负值,表示倒数。
  • end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示倒数。

  4、简单说就是将使用原数组的元素对原数组进行修改

四、数组实例的find()和findIndex()   //分别返回value 和 index

  1、数组实例的find方法,用于找出第一个符合条件的数组成员。    //find(value,index,arr)  参数依次为当前值,当前下标,原数组;返回值是value

  2、它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined

  3、数组实例的findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1

  4、这两个方法都可以接受第二个参数,用来绑定回调函数的this对象。

  5、另外,这两个方法都可以发现NaN,弥补了数组的IndexOf方法的不足。

五、数组实例的fill方法()

  1、fill方法使用给定值,填充一个数组

  2、fill方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置。

六、数组实例的entries(),keys()和values()     //values有待研究

  1、用于遍历数组。它们都返回一个遍历器对象,可以用for...of循环进行遍历

  2、keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。

七、数组实例的includes()

  1、Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似。该方法属于ES7,但Babel转码器已经支持。

七、数组实例的includes()

  1、Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似。该方法属于ES7,但Babel转码器已经支持。

  2、该方法的第二个参数表示搜索的起始位置,默认为0。如果第二个参数为负数,则表示倒数的位置,如果这时它大于数组长度(比如第二个参数为-4,但数组长度为3),则会重置为从0开始。

  3、没有该方法之前,我们通常使用数组的indexOf方法,检查是否包含某个值。indexOf方法有两个缺点,一是不够语义化,它的含义是找到参数值的第一个出现位置,所以要去比较是否不等于-1,表达起来不够直观。二是,它内部使用严格相当运算符(===)进行判断,这会导致对NaN的误判。

八、数组的空位

  1、数组的空位指,数组的某一个位置没有任何值。比如,Array构造函数返回的数组都是空位。

  2、注意,空位不是undefined,一个位置的值等于undefined,依然是有值的。空位是没有任何值,in运算符可以说明这一点。

  3、ES5对空位的处理,大多数情况下会忽略空位:

  • forEach(), filter(), every()some()都会跳过空位。
  • map()会跳过空位,但会保留这个值
  • join()toString()会将空位视为undefined,而undefinednull会被处理成空字符串。

  4、ES6则是明确将空位转为undefined

  5、Array.from方法会将数组的空位,转为undefined,也就是说,这个方法不会忽略空位。

  6、扩展运算符(...)也会将空位转为undefined

  7、copyWithin()会连空位一起拷贝。

  8、fill()会将空位视为正常的数组位置。

  9、for...of循环也会遍历空位。

转载于:https://www.cnblogs.com/realsoul/p/5514675.html

### 数组扩容的实现方式 数组作为一种固定大小的数据结构,在实际应用中可能无法满足动态需求。因此,通过创建新的更大容量的数组并将原有数据复制到新数组中的方法来实现数组扩容是非常常见的做法。 #### 静态扩容 静态扩容是指手动调整数组的大小。具体来说,当现有数组空间不足时,可以创建一个新的更大的数组,并将旧数组的内容逐一拷贝至新数组中。这种方法虽然简单易懂,但在频繁调用的情况下效率较低[^2]。 以下是基于Java语言的一个简单的静态扩容例子: ```java public class ArrayResizeExample { public static void main(String[] args) { int[] originalArray = {1, 2, 3}; // 创建一个两倍于原始数组长度的新数组 int[] newArray = new int[originalArray.length * 2]; // 将原数组内容复制到新数组 System.arraycopy(originalArray, 0, newArray, 0, originalArray.length); // 扩容后的数组操作... for (int i : newArray) { System.out.print(i + " "); } } } ``` 上述代码展示了如何利用`System.arraycopy()`函数完成从较小数组向较大数组的数据迁移过程[^3]。 #### 动态扩容机制 对于需要频繁变动尺寸的情况,则通常采用动态扩容策略。这种技术背后的核心思想依然是先分配一块较大的内存区域作为临时缓冲区,随后把当前所有有效记录迁移到那里去;只不过这一系列动作往往封装进了某些高级容器类内部自动执行而已——比如ArrayList就是这样一个典型代表。 下面是一个模拟ArrayList工作原理的部分源码片段展示: ```java private Object[] elementData; private int size; // 增加元素的方法 public boolean add(E e){ ensureCapacityInternal(size + 1); elementData[size++] = e; return true; } private void ensureCapacityInternal(int minCapacity){ if(elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA){ elementData = new Object[Math.max(DEFAULT_CAPACITY,minCapacity)]; }else{ grow(minCapacity); } } private void grow(int minCapacity){ int oldCapacity = elementData.length; int newCapacity = oldCapacity+(oldCapacity>>1); if(newCapacity-minCapacity<0) newCapacity=minCapacity; elementData=Arrays.copyOf(elementData,newCapacity); } ``` 这里的关键在于每当尝试超出预设界限添加新成员之前都会触发一次潜在的增长行为(`grow`) ,从而确保有足够的可用空间接纳即将加入的对象实例们。 ### 总结 无论是采取何种形式来进行数组扩展或者说是所谓的“扩容”,其根本目的都是为了适应不断变化的实际业务场景下的存储需求。尽管如此,值得注意的是每次这样的操作都伴随着一定的性能开销成本存在,所以在设计程序之初就应该充分考虑到这一点并作出合理规划以减少不必要的资源浪费现象发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值