ES6数组新加 Buff
欢迎关注本人公众号《迈向大前端》,里面有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的更多相关文章
- JavaScript ES6 数组新方法 学习随笔
		
JavaScript ES6 数组新方法 学习随笔 新建数组 var arr = [1, 2, 2, 3, 4] includes 方法 includes 查找数组有无该参数 有返回true var ...
 - es6数组新特性
		
1.Array.from 从类数组和可遍历对象中创建Array的实例 类数组对象包括:函数中的arguments.由document.getElementsByTagName()返回的nodeList ...
 - es6数组新方法
		
(1)Array.from(aarr,fn,obj) function fn(dr, sd, d) { /*Array.from 类数组转化为数组*/ console.log(arguments) v ...
 - 漫谈数组去重复方法(亮点是ES6的新API)
		
方法1: 利用遍历的思想来进行. <!DOCTYPE html><html lang="en"><head> <meta charset= ...
 - ES6的新方法实现数组去重
		
ES6里新添加了两个很好用的东西,set和Array.from. set是一种新的数据结构,它可以接收一个数组或者是类数组对象,自动去重其中的重复项目. 在这我们可以看见,重复的项目已经被去掉了,包括 ...
 - ES6的新特性(20)—— Module 的加载实现
		
Module 的加载实现 上一章介绍了模块的语法,本章介绍如何在浏览器和 Node 之中加载 ES6 模块,以及实际开发中经常遇到的一些问题(比如循环加载). 浏览器加载 传统方法 HTML 网页中, ...
 - ES6数组扩展
		
前面的话 数组是一种基础的JS对象,随着时间推进,JS中的其他部分一直在演进,而直到ES5标准才为数组对象引入一些新方法来简化使用.ES6标准继续改进数组,添加了很多新功能.本文将详细介绍ES6数组扩 ...
 - ES6常用新特性
		
https://segmentfault.com/a/1190000011976770?share_user=1030000010776722 该文章为转载文章!仅个人喜好收藏文章! 1.前言 前几天 ...
 - ES6的新特性(16)——Generator 函数的语法
		
Generator 函数的语法 简介 基本概念 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同.本章详细介绍 Generator 函数的语法和 API,它的 ...
 
随机推荐
- RPM管理,计划任务与性能监控
			
=========== RPM 软件包管理: 相关命令: rpm -ivh 软件包名称 rpm -e 软件包名称 rpm -U 软件名称 软件包信息查询: 相关命令: rpm -q 查询指定软 ...
 - Android 画闹钟
			
1.今天就来模仿一下这个小闹钟的 2.思路: 先画闹钟的圆盘 ,在通过Path来画指针 两个耳朵其实就是用两个圆被一个大圆截取后留下的,并旋转一定度数后生成 3.直接上代码: public class ...
 - Nutch2.2.1 问题一:索引不能提交
			
按照bin/nutch下的脚步一步一步的执行抓取:Inject,Generate,Fetcher,Parse,Updatedb,Solrindex,SolrDump. 每部其实都可以打出 “bin/n ...
 - docker-compsoe & .netcore & nginx
			
1.引言 紧接上篇.NET Core容器化@Docker,这一节我们先来介绍如何使用Nginx来完成.NET Core应用的反向代理,然后再介绍多容器应用的部署问题. 2. Why Need Ngin ...
 - mysql安装 卸载 查字符集编码
			
下载地址 : https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.11-winx64.zip 解压zip 解压完之后的目录 在里面新建一 ...
 - pageadmin自助建站 网站目录权限的设置方法
			
在用pageadmin网页设计的时候遇到各种问题可以参考官网教程网站目录权限的设置方法 网站目录必须设置读取和写入权限,否则后台解压,删除文件,在线上传等功能都无法正常使用,下面讲解本机和服务器配置目 ...
 - Tomcat源码(一):整体架构
			
由于tomcat的组件较多,处理流程比较复杂 ,这里是 由浅到深来解释tomcat的整体架构 1.首先应该大致了解下tomcat的 /conf/server.xml 配置文件:在tomcat启动的时 ...
 - 序列(DP)(组合数)
			
这是一个DP题. 我们设\(f[i][j][k]\)表示\(i\)序列长度中放入了\(j\)个元素,其中\(k\)是限定的众数的个数:状态转移方程是 \[f[k][i][j]=f[k][i-1][j- ...
 - 【OCP|052】052考试题库又变了,最新052题库收集整理-第15题
			
15.Which two are true about space management in tablespaces? A) Locally managed tablespaces have eit ...
 - Linux 开启路由转发功能
			
想让一台Red Hat Enterprise Linux 7开通iptables的nat转发功能 A服务器:192.168.30.20/24 B服务器:192.168.30.1/24,eth0; 19 ...