欢迎关注本人公众号《迈向大前端》,里面有15本前端相关的电子书,送给在前端路上迷茫的同学们!

本章篇幅很长,分开来发,这一小篇主要讲ES6数组的Array.of()和Array.from()与传统写法的对比,下一篇是ES6新增的方法和类数组,

创建数组新方法

先来说说ES6之前创建数组遗留的痛点问题,比如说我想创建一个数组,里面包含一个10,应该怎么写呢?用数组字面量和构造函数试试:

//数组字面量式
var arr = [10];
console.log(arr); //10
console.log(arr.length); //1 var arr3 = [];
arr3[0] = 10;
console.log(arr3); //[10] //构造函数式
var arr1 = new Array(10);
console.log(arr1); //(10)[empty*10]
console.log(arr1.length); //10 var arr2 = new Array(10,20);
console.log(arr2); //[10,20]
console.log(arr2.length); //2
console.log(arr2[0]); //10
console.log(arr2[1]); //20

看到了吗?构造函数式是没法创建单个包含有数值的数组的,这里的10代表的数组的长度为10,而不是arr[0]是10,所以在ES6之前只能通过数组字面量来创建,针对这个问题ES6 推出了Array.of() ,来规避这种怪异行为

Array.of()

Array.of()与Array构造函数的工作机制类似,它不存在特例,无论有几个参数,参数什么类型,统统不管,统一把参数作为数组的项来处理。来看看如何使用:

var arr = Array.of(10);
console.log(arr); //[10]
console.log(arr.length); //1
console.log(arr[0]) //10 var arr1 = Array.of(10,'xiaomage',[1,2,3],{'a':1,'b':2});
console.log(arr1); //[10, "xiaomage", Array(3), {…}]

这样就很舒服了。

当我们想着给一个函数传入Array构造函数来创建数组时,是无法达到行为统一的,原因就是 new Array(10)

不是我们想要的效果,但是使用Array.of()就可以解决这个问题。

//ES5的Array
function createArray(creator, value){
let arr = creator(value);
return arr;
};
var newArr = createArray(Array,10);
console.log(newArr); //(10)[empty*10] //ES6的Array.of
function createArray_1(creator, value){
let arr = creator(value);
return arr;
}
var newArr1 = createArray_1(Array.of,10);
console.log(newArr1); //(1)[10]

在ES6之前,当我们遇到一个类数组转成数组的时候又得写一堆代码来实现,先简单说说什么是类数组,

什么是类数组,简单记住三点就行,

第一,它是对象,不是数组,只是看着像数组;

第二,一定含有length属性,没有length属性的是对象而不是类数组 ;

第三,其他属性(索引)不能是负数。

比如: var a = {'1':'aa','2':'bb','4':'cc',length:3}; ,我们常见的类数组有函数的参数arguments。

function func(){
console.log(arguments);
};
func(1,2,3);

那么如何把类数组转换成数组,还是以函数的arguments为例,看看写法:

function func(){
//第一种写法
var arr = [];
for(var i=0;i<arguments.length;i++){
arr.push(arguments[i]);
};
console.log(arr); //[10, "xiaoma", "javascript"] //第二种写法
var arr1= Array.prototype.slice.call(arguments);
console.log(arr1); //[10, "xiaoma", "javascript"]
};
func(10,'xiaoma','javascript');

虽然转化还是比较简单的,也得写好几行代码,ES6的Array.from()出来之后可谓是一步到位,简单明了。

Array.from()

Array.from()的语法是Array.from(arrayLike[, mapFn[, thisArg]])。接受三个参数:

第一个:可迭代的对象或者数组;

第二个:映射函数(接受两个参数,数组的每一项和索引),可选;

第三个:执行映射函数时的this对象,可选;

返回值:处理后的数组。

function func(){
console.log(Array.from(arguments)); //[1, 2, 3, "Array.from", Array(3), {…}]
};
func(1,2,3,"Array.from",[4,5,6],{'a':1});

下面在看看有映射函数的情况,

function func(){
var arr = Array.from(arguments,(item ,index)=>{
if(Number.isInteger(item)){
return item*10+100;
}else{
return item;
}
});
console.log(arr); //[110, 120, 130, "Array.from", Array(3), {…}]
};
func(1,2,3,"Array.from",[4,5,6],{'a':1});

分析一下,拿到数组后再进行了一次map操作,返回想要的值,拆开来看,等价于:Array.from(obj).map(mapFn, thisArg);

function func(){
var arr = Array.from(arguments).map((item ,index)=>{
if(Number.isInteger(item)){
return item*10+100;
}else{
return item;
}
});
console.log(arr); //[110, 120, 130, "Array.from", Array(3), {…}]
};
func(1,2,3,"Array.from",[4,5,6],{'a':1});

如果映射函数处理对象,那么第三个参数this就派上用场了。

var obj = {
name:'xiao ma ge',
sayHello(value){
return value + this.name;
}
};
function func(){
return Array.from(arguments,obj.sayHello,obj)
}
var arr = func('hello ');
console.log(arr); //["hello xiao ma ge"]

用Array.from()能够将所有含有Symbol.iterator属性的可迭代对象转换为数组:

let obj1 = {
*[Symbol.iterator](){
yield 10;
yield 100;
yield 1000;
}
}; var arr = Array.from(obj1,(item,index)=>{
return item*10+1;
});
console.log(arr); //[101, 1001, 10001]

好了,这一部分基本上就说完了,欢迎关注本人公众号《迈向大前端》,里面有15本前端相关的电子书,送给在前端路上迷茫的同学们!,下面是我的公众号,扫码即可领取!

ES6数组新加 Buff的更多相关文章

  1. JavaScript ES6 数组新方法 学习随笔

    JavaScript ES6 数组新方法 学习随笔 新建数组 var arr = [1, 2, 2, 3, 4] includes 方法 includes 查找数组有无该参数 有返回true var ...

  2. es6数组新特性

    1.Array.from 从类数组和可遍历对象中创建Array的实例 类数组对象包括:函数中的arguments.由document.getElementsByTagName()返回的nodeList ...

  3. es6数组新方法

    (1)Array.from(aarr,fn,obj) function fn(dr, sd, d) { /*Array.from 类数组转化为数组*/ console.log(arguments) v ...

  4. 漫谈数组去重复方法(亮点是ES6的新API)

    方法1: 利用遍历的思想来进行. <!DOCTYPE html><html lang="en"><head> <meta charset= ...

  5. ES6的新方法实现数组去重

    ES6里新添加了两个很好用的东西,set和Array.from. set是一种新的数据结构,它可以接收一个数组或者是类数组对象,自动去重其中的重复项目. 在这我们可以看见,重复的项目已经被去掉了,包括 ...

  6. ES6的新特性(20)—— Module 的加载实现

    Module 的加载实现 上一章介绍了模块的语法,本章介绍如何在浏览器和 Node 之中加载 ES6 模块,以及实际开发中经常遇到的一些问题(比如循环加载). 浏览器加载 传统方法 HTML 网页中, ...

  7. ES6数组扩展

    前面的话 数组是一种基础的JS对象,随着时间推进,JS中的其他部分一直在演进,而直到ES5标准才为数组对象引入一些新方法来简化使用.ES6标准继续改进数组,添加了很多新功能.本文将详细介绍ES6数组扩 ...

  8. ES6常用新特性

    https://segmentfault.com/a/1190000011976770?share_user=1030000010776722 该文章为转载文章!仅个人喜好收藏文章! 1.前言 前几天 ...

  9. ES6的新特性(16)——Generator 函数的语法

    Generator 函数的语法 简介 基本概念 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同.本章详细介绍 Generator 函数的语法和 API,它的 ...

随机推荐

  1. mybatis--mapper配置总结

    mapper介绍 mapper使用规则:按业务划分,一个业务模块相关的sql均定义在一个mapper文件 mapper的xml格式: doctype: <!DOCTYPE mapper PUBL ...

  2. PostgreSQL按年月日分组

    Select EXTRACT(year from cast(joindate as timestamp)) as Year, EXTRACT(month from cast(joindate as t ...

  3. 判断客户端是iOS还是Android,判断是不是在微信浏览器打开

    bool flag = false; string agent = System.Web.HttpContext.Current.Request.UserAgent.ToLower(); string ...

  4. .CHM文件使用问题

    1.查看时内容为空---解除锁定 解决方案:选中xx.CHM,右键点击属性,常规选项卡中点击“解除锁定”.OK了 2.内容显示乱码---修改浏览器编码 IE中的查看 > 编码 > 自动选择 ...

  5. 201621123023《Java程序设计》第4周学习总结

    一.本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 继承.多态.覆盖.重载 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不需要出现过多的字. 二.书面作业 1. 面 ...

  6. day10学python socket用户交互+MD5加密

    socket用户交互+MD5加密 利用socket从client传输文件指令于server 再返还字节大小与内容 socketserver的使用(重要) 注意: ##client.recv(1024) ...

  7. 为什么要使用rem

    为什么要使用rem 今天2019年4月16号更新,模仿网易移动端的的写法: html { font-size: 13.33333vw } @media screen and (max-width:32 ...

  8. “全栈2019”Java第四十八章:重写方法Override

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. 从零开始用 Flask 搭建一个网站(四)

    前言 从零开始用 Flask 搭建一个网站(三) 介绍了网页前端与后端.前端与前端之间数据的交流.本节主要介绍一下如何应用 Flask-OAuthlib, 使用 Flask-OAuthlib 就可以轻 ...

  10. Tomcat安装与使用

    主要讲解Tomcat的 安装与使用,讲解ubuntu版本和windows. 下载与安装: 1)到apache官网.www.apache.org http://jakarta.apache.org(产品 ...