/**
* Created by Administrator on 2017/4/13.
*/
/*---------------------Es6编码规范---------------------*/
//1、块级作用域
//let 取代 var
//在全局环境,不应该设置变量,只应设置常量 const优于let。
const a='1';
const b='1';
{
let a='2';
let b='3';
} //2、静态字符串一律使用单引号或反引号,不使用双引号。动态字符串使用反引号
const c='world';
console.info(`hello ${c}`); //hello world //3、解构赋值
// 使用数组成员对变量赋值时,优先使用解构赋值。
const d=[1,2,3,4];
const [d1,d2,d3,d4]=d;
console.info(d1,d2,d3,d4); //1 2 3 4
//函数的参数如果是对象的成员,优先使用解构赋值
function e({e1,e2}){
console.info(e1,e2);
}
e({e1:'hello',e2:'world'}); //hello world
//对象解构 注: 对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者
//const {name,petName}={"name":"leyi","petName":"jiucaiqiezi"};
//相当于
const {name:name,petName:petName}={"name":"leyi","petName":"jiucaiqiezi"};
console.info(name,petName); //如果函数返回多个值,优先使用对象的解构赋值
function g(){
return {g1:"1",g2:"2",g3:"3"};
}
const {g1,g2,g3}=g();
console.info(g1,g2,g3); //1 2 3 //4、定义对象 单行定义的对象,最后一个成员不以逗号结尾。多行定义的对象,最后一个成员以逗号结尾。
const h={h1:1,h2:2,h3:3};
const i={
i1:1,
i2:2,
}; //对象尽量静态化,一旦定义,就不得随意添加新的属性。。
const j={"name":"leyi",petName:null}; //petName预先定义好
j.petName='jiucaiqiezi';
//如果添加属性不可避免,要使用Object.assign方法
Object.assign(j,{'att3':"att3"});
console.info(j);// {name: "leyi", petName: jiucaiqiezi, att3: "att3"} //如果对象的属性名是动态的,可以在创造对象的时候,使用属性表达式定义
function getKey(ag=true){
return ag?'petName':'xxName';
}
const k={
name:"leyi",
[getKey(false)]:'jiucaiqiezi',
};
console.info(k); //对象的属性和方法,尽量采用简洁表达法
const l={
name:"leyi",
getPetName(val){ //省略function
return l.name+`-----${val}`;
},
};
console.info(l.getPetName('qiezijiucai')); //5、使用扩展运算符(...)拷贝数组
const m=[1,2,3,4,5];
const n= [...m];
console.info(n); //6、立即执行函数可以写成箭头函数的形式
(() => {
console.log('hello world');
})(); //简单的、单行的、不会复用的函数,采用箭头函数。如果函数体较为复杂,行数较多,还是应该采用传统的函数写法。
const o=[1, 2, 3].map(x => x * x);
console.info("o--------",o); function qq(params){
for(let item of params){
console.info(item);
}
}
const q = (...params) => qq.apply(this,params);
q([7,8,9]); //7 8 9 /*---------------------let和const---------------------*/
//let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。 //const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。
const obj1={"name":"leyi"};
//obj1={} 指向新的内存地址就会报错
obj1.petname="qiezijiucai"; //常量本身是可变的
console.info(obj1); /*---------------------数组的扩展---------------------*/
//Array.from()用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象
const p = document.querySelectorAll('p');
Array.from(p).forEach(function (item,index) {
console.info(item,index);
});
//任何有length属性的对象,都可以通过Array.from方法转为数组。
console.info(Array.from({ 0: "a", 1: "b", 2: "c", length: 3 }));//["a", "b", "c"] //转换字符串为数组
console.info(Array.from('jiucaiqiezi'));//["j", "i", "u", "c", "a", "i", "q", "i", "e", "z", "i"] //Array.of()方法用于将一组值,转换为数组。弥补原来数组构造函数Array()的不足
console.info(Array(1));//原先只传递给它一个数字参数,该构造函数将返回具有指定个数、元素为 undefined 的数组
console.info(Array(),Array.of(1),Array.of(1,4,7)); //Array.prototype.copyWithin(target, start = 0, end = this.length)
//数组实例的copyWithin方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员)
console.info([1,2,3,4,5,6,7].copyWithin(0,2));//[3, 4, 5, 6, 7, 6, 7] //find方法,用于找出第一个符合条件的数组成员,它的参数是一个回调函数,所有数组成员依次执行该回调函数
console.info([7,8,9,8].find(item=>item==8)); //8 //findIndex 返回第一个符合条件的数组成员的位置
console.info([7,8,9,8].findIndex(item=>item==8)); //1 //fill方法使用给定值,填充一个数组,fill方法一般用于空数组的初始化。数组中已有的元素,会被全部抹去。第二个和第三个参数,用于指定填充的起始位置和结束位置
console.info([1,2,3].fill('a',2)); //[1, 2, "a"]
console.info(Array.of(1).fill('a'));//["a"] //ES6提供三个新的方法——entries(),keys()和values()——用于遍历数组
for(let [index,value] of [3,4,5].entries()){ //entries()是对键值对的遍历
console.info(index+'------'+value); //0------3 1------4 test.js:208 2------5
}
for(let item of [3,4,5].entries()){
console.info(item); //[0, 3] [1, 4] [2, 5]
}
for(let item of [3,4,5].keys()){
console.info(item); //0 1 2
}
//测试有问题 暂不知道什么原因 报错values is not a function
/*for(let item of [33,44,55].values()){
console.info(item);
}*/ //includes 方法返回一个布尔值,表示某个数组是否包含给定的值
//对比map和set的has map的has 判断键名字 set判断值
//代替 indexOf console.info([7,8,9].indexOf(8)!=-1); //true
console.info([7,8,9].includes(8)); //true //由于空位的处理规则非常不统一,数组避免出现空位,ES6明确将空位转为undefined /*---------------------函数的扩展---------------------*/
//ES6允许为函数的参数设置默认值,即直接写在参数定义的后面。
//定义了默认值的参数,必须是函数的尾部参数,其后不能再有其他无默认值的参数
function fn(x,y=2){
console.info(x,y)
}
fn(1,undefined);//如果传入undefined,将触发该参数等于默认值,null则没有这个效果 //默认值所处的作用域,不是全局作用域,而是函数作用域。
const x=1;
function fn1(x,y=x){
console.info(x); //10
}
fn1(10); const xx=1;
function fn01(y=xx){ //let y=xx xx 参数y = xx形成一个单独的作用域。这个作用域里面,变量xx本身没有定义,所以指向外层的全局变量x。
console.info(xx); //1
}
fn01(); //参数默认值可以与解构赋值,联合起来使用。
function fn2({x,y = 20}){
console.log(x, y);
}
fn2({}); // undefined 20
fn2({x: 1}); // 1, 20 //rest参数是一个数组(...变量名),用于获取函数的多余参数,该变量将多余的参数放入数组中
function fn3(array,...list){ //rest参数之后不能再有其他参数
console.info(list); //[4, 5, 6]
list.forEach(function(item){
array.push(item);
});
console.info(array);
}
fn3([1,2,3],4,5,6);//[1, 2, 3, 4, 5, 6] //扩展运算符
//扩展运算符是三个点(...)。它好比rest参数的逆运算,将一个(数组)转为用逗号分隔的参数序列 function fn4(x,y,z){
return x+y+z
}
const list=[1,2,3];
console.info(...list); //1 2 3
console.info([...list]); //[1, 2, 3]
console.info(fn4(...list)); //6 //代替apply方法
function fn04(x, y, z) {
console.info(args); //[1, 2, 3]
console.info(x,y,z); //1 2 3
} var args = [1, 2, 3];
fn04.apply(null, args); function fn040(x, y, z) {
console.info(...args) //1 2 3
}
var args = [1, 2, 3];
fn040(...args); //利用Math.max方法,求出一个数组最大元素的写法。
console.info(Math.max.apply(null,[1,2,3])); //3
console.info(Math.max(...args));//3 //扩展运算符与正常的函数参数可以结合使用
function fn5(a,b,c,d,e){
console.info(a,b,c,d,e) //1 2 3 4 5
}
const fn5list=[3,4,5];
fn5(1,2,...fn5list); //将一个数组添加到另一个数组的尾部
const fn6Arr=[7,8,9];
const fn6Arr2=[10,11,12];
fn6Arr.push(...fn6Arr2);
console.info(fn6Arr); //扩展运算符还可以将字符串转为真正的数组,任何类似数组的对象,都可以用扩展运算符转为真正的数组。
console.log([..."hello"]); //["h", "e", "l", "l", "o"] //扩展运算符的运用
//合并数组
const arr2=[1,2,3,4],arr3=[5,6,7],arr4=[8,9,10];
console.info([...arr2,...arr3,...arr4]); //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] //与解构赋值结合
const [aa,...bb]=[1,2,3,4,5,6];
console.info(aa,bb); //1 [2, 3, 4, 5, 6]
const [cc,...dd]=[];
console.info(cc,dd); //undefined [] /*箭头函数,ES6允许使用“箭头”(=>)定义函数。
* 函数体内的this对象,绑定定义时所在的对象,而不是使用时所在的对象。
不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
不可以使用arguments对象,该对象在函数体内不存在
* */
const fn7=ag1=>ag1;
//等同于
/*var fn7 = function(ag1) {
return ag1;
};*/
console.info(fn7(1)); //箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分
const fn8=(ag1,ag2)=> ag1+ag2;
console.info(fn8(1,2)); //如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回。
const fn9=(ag1,ag2)=>{
return ag1+ag2
}
console.info(fn9(3,4)); //7 //如果箭头函数直接返回一个对象,必须在对象外面加上括号。
const fn10=(ag1,ag2)=>({ag1:ag1,ag2,ag2});
console.info(fn10(9,10));//{ag1: 9, ag2: 10} //箭头函数的一个用处就是简化回调函数写法
const fn11=[1,2,3,4,5].map(item=>item+1);
console.info(fn11);//[2, 3, 4, 5, 6] /*---------------------Set和Map数据结构---------------------*/
//ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
const s = new Set();
[1,2,3,4,5,5,5,6].forEach(item => s.add(item));
for (let i of s) {
console.log(i);
}
console.info(...s); //1 2 3 4 5 6 const set = new Set([1, 2, 3, 4, 4]);
console.info(...set,set.size); //1 2 3 4 4 console.info(...document.getElementsByTagName('p')); //把类数组转成数组 console.info(...new Set([1,2,3,4,4,4,4])); //可以用于数组去重 console.info(set.add(7)); //添加某个值,返回Set结构本身
console.info(set.has(7)); //返回一个布尔值,表示该值是否为Set的成员。
console.info(set.delete(7));//删除某个值,返回一个布尔值,表示删除是否成功。
set.clear(); //清除所有成员,没有返回值。
console.info(set); //Array.from方法可以将 Set 结构转为数组。
const items = new Set([1, 2, 3, 4, 5,5,5]);
const array = Array.from(items);
console.info(array); //Set结构的实例有四个遍历方法
const set2 = new Set(['red', 'green', 'blue']);
for(let item of set2.values()){
console.info(item); //由于 Set 结构没有键名,只有键值,所以keys方法和values方法的行为完全一致。
}
//返回键值对的遍历器
for(let item of set2.entries()){
console.info(item);
/*
* ["red", "red"]
test.js:228 ["green", "green"]
test.js:228 ["blue", "blue"]
* */
} //使用Set实现并集(Union)、交集(Intersect)和差集
const set3=new Set([1,2,3,4,5]);
const set4=new Set([1,3,4,6,7]);
//并级
console.info(new Set([...set3,...set4])); //交集
var intersect=[...set3].filter((item)=>set4.has(item))
console.info(intersect); //差集
const difference= [...set3].filter((item)=>!set4.has(item));
console.info(difference); //ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键
const map=new Map([['name','leyi'],["petName",'qiezi']]);
console.info(map.size);//2
console.info(map.has('name'));//true
console.info(map.get('name'));//leyi
console.info(map.get('name'));//leyi
map.set({"obj":"halo"},'hallo');
console.info(map);//{"name" => "leyi", "petName" => "qiezi", Object {obj: "halo"} => "hallo"} //Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。
const map2 = new Map();
const k1 = {'a':"a"};
const k2 = {'a':"a"};
map2.set(k1, 111).set(k2, 222);
console.info(map2.get(k1)); // 111
console.info(map2.get(k2));// 222 //Map构造函数接受数组作为参数,执行的过程是
const mapItems3 = [
['name', 'leyi'],
['color', 'red']
];
const map3 = new Map();
mapItems3.forEach(
([key, value]) => map3.set(key, value)
);
console.info(map3); //{"name" => "leyi", "color" => "red"} //数组转为map
const map4 =new Map( [
['name', 'leyi'],
['color', 'red']
]);
console.info([...map4]);//Map 转为数组 //Map 转为对象,如果所有 Map 的键都是字符串,它可以转为对象。
function strMapToObj(map){
let obj={};
for(let [key,value] of map){
obj[key]=value
}
return obj;
}
const map5=new Map().set('name',"leyi").set('color','red');
console.info(strMapToObj(map5)); // {name: "leyi", color: "red"} //对象转为map
function objToMap(obj){
let map6=new Map();
for(let item of Object.keys(obj)){
map6.set(item,obj[item]);
}
return map6;
}
console.info(objToMap({"name":"leyi",'color':"red"}));//{"name" => "leyi", "color" => "red"} //Map 转为 JSON Map 的键名都是字符串,这时可以选择转为对象JSON,Map 的键名有非字符串时,先通过扩展运算符转成数组
const map7=new Map().set('name','leyi');
function mapToJson(map){
let obj={};
for(let [key,value] of map){
obj[key]=value
}
return JSON.stringify(obj);
}
console.info(mapToJson(map7));//{"name":"leyi"}

  

ES6笔记的更多相关文章

  1. ES6笔记(5)-- Generator生成器函数

    系列文章 -- ES6笔记系列 接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还 ...

  2. ES6笔记系列

    ES6,即ECMAScript 6.0,ES6的第一个版本是在2015年发布的,所以又称作ECMAScript 2015 如今距ES6发布已经一年多的时间,这时候才去学,作为一个JSer,羞愧羞愧,还 ...

  3. ES6笔记(1) -- 环境配置支持

    系列文章 -- ES6笔记系列 虽然ES6已经发布一年多了,但在各大浏览器之中的支持度还不是很理想,在这查看ES6新特性支持度 Chrome的最新版本浏览器大部分已经支持,在Node.js环境上支持度 ...

  4. ES6笔记(2)-- let的块级作用域

    系列文章 -- ES6笔记系列 一.函数级作用域 我们都知道,在ES6以前,JS只有函数级作用域,没有块级作用域这个概念 没有块级作用域,有利有弊,利于方便自由,弊于作用域内的变量容易被共享,例如这个 ...

  5. ES6笔记(3)-- 解构赋值

    系列文章 -- ES6笔记系列 解构赋值,即对某种结构进行解析,然后将解析出来的值赋值给相关的变量,常见的有数组.对象.字符串的解构赋值等 一.数组的解构赋值 function ids() { ret ...

  6. ES6笔记(4)-- Symbol类型

    系列文章 -- ES6笔记系列 Symbol是什么?中文意思是标志.记号,顾名思义,它可以用了做记号. 是的,它是一种标记的方法,被ES6引入作为一种新的数据类型,表示独一无二的值. 由此,JS的数据 ...

  7. ES6笔记(6)-- Set、Map结构和Iterator迭代器

    系列文章 -- ES6笔记系列 搞ES6的人也是够无聊,把JS弄得越来越像Java.C++,连Iterator迭代器.Set集合.Map结构都出来了,不知道说什么好... 一.简单使用 1. iter ...

  8. ES6笔记(7)-- Promise异步编程

    系列文章 -- ES6笔记系列 很久很久以前,在做Node.js聊天室,使用MongoDB数据服务的时候就遇到了多重回调嵌套导致代码混乱的问题. JS异步编程有利有弊,Promise的出现,改善了这一 ...

  9. ES6 笔记汇总

    ES6 笔记汇总 二.ES6基础-let和const命令 三.变量的解构赋值 四.字符串的拓展 五.正则表达式的拓展 ...将会持续更新,敬请期待

  10. ES6笔记2

    ES6笔记2 Promise Promise 是 ES6 引入的异步编程的新解决方案,语法上是一个构造函数 一共有3种状态,pending(进行中).fulfilled(已成功)和rejected(已 ...

随机推荐

  1. vue框架导入百度地图API接口的方法

    百度请求API接口:

  2. Codeforces #662C Binary Table

    听说这是一道$ Tourist$现场没出的题 Codeforces #662C 题意: 给定$n*m的 01$矩阵,可以任意反转一行/列($0$变$1$,$1$变$0$),求最少$ 1$的数量 $ n ...

  3. 「SHOI2015」(LOJ2038)超能粒子炮・改

    传送门:Here 一句话题意:给定$ t$次询问,每次读入$n,k,$求$ \sum_{i=0}^kC_n^k\ mod\ 2333$, 其中$ t \leq 100000$,$n,k \leq 10 ...

  4. day 11 - 1 装饰器

    装饰器 装饰器形成的过程:最简单的装饰器——有返回值的——有一个参数——万能参数装饰器的作用:不想修改函数的调用方式 但是还想在原来的函数前后添加功能原则:开放封闭原则语法糖:@装饰器函数名装饰器的固 ...

  5. Javascript - ExtJs - Itemselector

    引入扩展文件 Extjs4.2根目录下: examples \ ux \ css \ images (这是选择按钮的图片资源) examples \ ux \ css \ ItemSelector.c ...

  6. zookeeperCli和Java操作zookeeperAPI

    推荐一个zookeeper可视化工具:zktools.exe eclipse集成的工具: http://www.massedynamic.org/eclipse/updates/ 1.zkCli客户端 ...

  7. Python笔记 【无序】 【三】

    #打开文件 os.open(file, flags[, mode]); file -- 要打开的文件 flags -- 该参数可以是以下选项,多个使用 "|" 隔开: os.O_R ...

  8. Java 类加载机制(阿里面试题)-何时初始化类

    (1)阿里的面试官问我,可以不可以自己写个String类 答案:不可以,因为 根据类加载的双亲委派机制,会去加载父类,父类发现冲突了String就不再加载了; (2)能否在加载类的时候,对类的字节码进 ...

  9. 876. Middle of the Linked List

    1. 原始题目 Given a non-empty, singly linked list with head node head, return a middle node of linked li ...

  10. dubbo源码分析10——服务暴露1_export()方法分析

    ServiceConfig类中的export()方法,是dubbo服务暴露的入口方法,被触发的时机有两个: 1. spring容器初始化完成所有的bean实例后,通过事件机制触发 2. 实现Initi ...