start_time: 2024-04-27 04:42:55 +0800

ES6新特性(更新篇)

96
范小饭_
IP属地: 北京
0.1 2017.01.30 18:53 字数 1175

首先感谢Carnia帮我指出ES6箭头函数中this指向的错误,此次主要更新箭头函数中this指向问题。

ECMAScript 6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

ES6新增添很多功能。更加方便我们的使用功能,话不多少。进入主题。

ES6新特性.png

一、关于变量

ES5

1.只有全局作用域变量和函数作用域变量
2.“变量提升”(当程序进入一个新的函数时,会将该函数中所有的变量的声明放在函数开始的位置。仅仅会提升变量的声明,不会提升变量的赋值)

ES6新增:块级作用域变量

1、let定义块级作用域变量

1、没有变量的提升,必须先声明后使用
2、let声明的变量,不能与前面的let,var,conset声明的变量重名

    {   
        {
        //console.log(a)//报错  必须先声明再使用
        let a = 10;//只在当前大括号可以使用
        var b = "abc";//全局作用域变量
        console.log(a);//10
        //let a = 10//报错 Uncaught SyntaxError: Identifier 'a' has already been declared
        console.log(b);//bac
        }
        console.log(b);//abc
        // console.log(a);//报错 只能在大括号中使用
    }

2、const 定义只读变量

1、const声明变量的同时必须赋值,const声明的变量必须初始化,一旦初始化完毕就不允许修改
2、const声明变量也是一个块级作用域变量
3、const声明的变量没有“变量的提升”,必须先声明后使用
4、const声明的变量不能与前面的let, var , const声明的变量重名

    {
        const VERSION = "1.2.3"
        console.log( VERSION )//也只能在括号里使用
    }
    //console.log( VERSION )//VERSION is not defined  报错  也是只读变量

二、关于函数

ES6可以给形参函数设置默认值

就是说,当我们调用函数时,如果设置了默认形参,即使没给函数传入实参,那么函数的实参就是默认形参。

function fun2(a=1,b=2){
    console.log(a,b)//1,2
}
fun2(11,22);//11 22
fun2(100);//100 2

在构造函数中也可是使用的

function Person(name,age,sex="男"){
    this.name = name;
    this.age = age;
    this.sex = sex;
}
var p1 = new Person("张三",20);
console.log(p1)// Person {name: "张三", age: 20, sex: "男"}
var p2 = new Person("赵四",30);
console.log(p2)// Person {name: "赵四", age: 30, sex: "男"}
var p3 = new Person("翠花",20,"女");
console.log(p3)// Person {name: "翠花", age: 20, sex: "女"

箭头函数

//正常函数
var fun3 = function(a){
    console.log(a);
}
//箭头函数
var fun3 = (a)=>{console.log(a);}
fun3(999);

比如我们用箭头函数计算一个1到100的和

var fun4 = ()=>{
    var sum=0;
    for(var i = 0; i<=100; i++){
        sum = sum+i
    }
    return sum;
}
console.log(fun4());//1000
var person = {
    name:"tom",
    sayHi:()=>{
        console.log(this);//window对象
        console.log("hello,everyone. my name is "+this.name);//hello,everyone. my name is window的name
    }
}
person.sayHi();

同时复习一下this的认识

1.在函数体外,this指的就是window对象
2.在函数替内,谁调用函数this就指向谁
3.在构造函数中,this指的是新创建的对象
4.在html标签中,this指的是当前的这个标签元素
5.在ES6中,对于箭头函数,要看它在哪里创建的,和当前函数的作用域。

三、关于数组的展开运算

在数组之前加上三个点(...)

var arr = [1,2,3,4,5];
console.log(arr);//[1, 2, 3, 4, 5]
console.log(...arr)// 1 2 3 4 5

可以根据数组的展开运算用数组给函数批量的传参

function fun5(a,b,c,d,e,f){
    //如果没有展开数组,打印结果如下
    //console.log(a,b,c,d,e,f)//[1, 2, 3, 4, 5] undefined undefined undefined undefined undefine
    console.log(a,b,c,d,e,f)//11 22 33 44 55 66
    //return a+b+c+d+e+f
}
//fun5([1,2,3,4,5])
fun5(...[11,22,33,44,55,66])

四、关于apply和call

apply和call,都是对象本身没有某个属性或者方法,去引用其他对象的属性或方法,也就是说两者都可以改变this的属性

不同之处

apply(this的指向,数组/arguments)
call(this的指向,参数1,参数2,参数3)

var name ="window的name";
var obj = {
    name:"obj的name",
    showName:function(v1,v2,v3){

        console.log(v1,v2,v3)
    }
}
obj.showName();
obj.showName.apply(window,[10,20,30]);//10 20 30
//apply括号里的是谁,调用的前面的函数里面的this就是谁
obj.showName.call(window,10,20,30)//10  20  30
var color = "yellow";
function showColor(){
    console.log(this.color)
}
var obj = {
    color:"red",
}
showColor();//yellow
showColor.apply(obj);//red
showColor.call(obj);//red
showColor.apply(this);//yellow
showColor.call(window);//yellow

五、关于解构赋值

数组的解构赋值

    var [a,b,c]=[11,22,33]
    console.log(a,b,c)//11 22 33

    var [e,[f,g],k] = [1,[2,3],5]
    console.log(e,f,g,k)//1 2 3 5

对象的解构赋值

    var{name,age}={name:"张三",age:"20"}
    console.log(name,age)//张三 20

以前我们互换两个变量的值,需要借助第三个变量,利用解构赋值,就方便很多了

    var f1 = 88;
    var f2 = 99;
    [f1,f2]=[f2,f1];
    console.log(f1,f2)//99 88

解构json

    var jike = {"name":"tom","age":"23","sex":"男"};
    var {name,age,sex}=jike;
    console.log(name,age,sex)//tom 23 男

    function cal(a,b){
        var ret1 = a+b;
        var ret2 = a-b;
        var ret3 = a*b;
        var ret4 = a/b;
        return [ret1,ret2,ret3,ret4]
    }
    var [r1,r2,r3,r4] = cal(10,5);
    console.log(r1,r2,r3,r4)//15 5 50 2

六、string中加入include方法

includes("字符"); 用于判断字符串中是否包含某个字符
存在返回true 不存在返回false

includes("字符",startIndex); 用于判断字符串中下标startIndex是否是某个字符
是返回true 不是返回false

var str = "hello";
console.log( str.includes("e") )//true
console.log( str.includes("e",3) );//false

七、创建对象

ES5中创建对象的几种方法

1.字面量法
2.工厂模式
3.构造函数
4.组合方式 构造函数+原型模式

ES6中创建对象

class 类名{
        //肯定存在一个构造函数
        //如果不写构造函数,有一个默认的构造函数,内容为空
    constructor(){}  //注意:这里不需要逗号
        //下面是函数属性 比如属性有run  dark
    run(){}
    dark(){}
}

举个例子

class Person{
    //肯定存在一个构造函数
    constructor(name,age,sex,nativePlace){
        this.name=name;//注意:这里是分号
        this.age=age;
        this.sex=sex;
        this.nativePlace=nativePlace;
    }
    //下面是函数属性
    eat(){console.log("红烧排骨")}
    study(){console.log("英文")}
    play(){console.log("敲代码")}
}

var sunShine = new Person("fanfan","22","女","黑龙江");
console.log(sunShine)//Person {name: "fanfan", age: "22", sex: "女", nativePlace: "黑龙江"}

八、继承

class Animal{
    constructor(age,sex){
        this.age = age;
        this.sex = sex;
    }
    eat(){
        console.log("吃吃吃")
    }
}
class Dog extends Animal{
    constructor(name,age,sex){
        //super指的是父类,先调用父类的构造函数,然后再去添加属性
        super(age,sex)
        //console.log(super);//不能打印只能使用
        this.name=name;
    }
    bark(){
        console.log("哇哇哇")
    }
    //重写:在子类中重新定义父类中的方法
    // eat(){
    //  console.log("喝喝喝")
    // }
}
var d = new Dog("妞妞","男",5)
console.log(d)
d.bark();
d.eat();
//ES6的继承,有两条继承链,构造函数  和  原型函数条  
console.log( Dog.prototype)//Animal {}
console.log( Dog.constructor==Animal.constructor)//true
console.log( Dog.prototype.__proto__==Animal.prototype)//true

九、Set()和Map()

set()有序列表集合(没有重复)

Set()是指有序列表集合 (set中的元素是没有重复的)

set包含的方法
add()、has()、delete()、clear()等

add()添加

var s = new Set();
s.add(1);
s.add(window);
s.add(true);
s.add(1);
console.log(s);//一共三个元素
console.log(s.size)//数组的长度是3  

delete(value) 删除指定元素

//结合上栗
s.delete(window);
console.log(s)   //1  true
console.log(s.size)   //2

has( value )用来判断指定的值是否在set集合中
存在返回true 不存在返回false

//结合上栗
console.log( s.has(1) )//true

clear() 同来清空set集合的

//结合上栗
s.clear()
console.log(s)//此时为空

举个例子:生成10个1-20的随机数,要求不可以重复

var arr3 = new Set();

 while(arr3.size<10){
    var yuan = parseInt(Math.random() * (20 - 1 + 1) + 1);
    arr3.add(yuan);     
 }
 console.log(arr3)

Map() 用来存放键值对的集合 key/value

var map = new Map();
map.set("name","张三");
map.set("age",20);
console.log(map)    //Map {"name" => "张三", "age" => 20}

get(key)根据key值取得value

console.log( map.get("name"))//张三

has() 判断是否存在某个键值对
存在返回true 不存在返回fasle

console.log( map.has("age") ) //true
 console.log( map.has("age1") ) //false

clear() 清空集合

 
map.clear();
console.log(map);//Map {}

怎么有种戛然而止的感觉。

那就戛然而止吧。

不不不。

拜个晚年。

晚年快乐呀!

不不不。

各位读者老爷~~~新年快乐呀!,给个赞呗

最后编辑于 :2018-03-27 10:00:18
©著作权归作者所有,转载或内容合作请联系作者
序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
783c64db 45e5 48d7 82e4 95736f50533e 沈念sama 阅读 159117 评论 4 赞 362
序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
783c64db 45e5 48d7 82e4 95736f50533e 沈念sama 阅读 67328 评论 1 赞 293
文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
8 开封第一讲书人 阅读 108839 评论 0 赞 243
文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
8 开封第一讲书人 阅读 44007 评论 0 赞 206
正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
388e473c fe2f 40e0 9301 e357ae8f1b41 茶点故事 阅读 52384 评论 3 赞 287
文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
8 开封第一讲书人 阅读 40629 评论 1 赞 219
那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
783c64db 45e5 48d7 82e4 95736f50533e 沈念sama 阅读 31880 评论 2 赞 313
文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
8 开封第一讲书人 阅读 30593 评论 0 赞 198
序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
783c64db 45e5 48d7 82e4 95736f50533e 沈念sama 阅读 34313 评论 1 赞 243
正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
388e473c fe2f 40e0 9301 e357ae8f1b41 茶点故事 阅读 30575 评论 2 赞 246
正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
388e473c fe2f 40e0 9301 e357ae8f1b41 茶点故事 阅读 32066 评论 1 赞 260
序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
783c64db 45e5 48d7 82e4 95736f50533e 沈念sama 阅读 28392 评论 2 赞 253
正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
388e473c fe2f 40e0 9301 e357ae8f1b41 茶点故事 阅读 33052 评论 3 赞 236
文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
8 开封第一讲书人 阅读 26082 评论 0 赞 8
文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
8 开封第一讲书人 阅读 26844 评论 0 赞 195
我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
783c64db 45e5 48d7 82e4 95736f50533e 沈念sama 阅读 35662 评论 2 赞 274
正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
388e473c fe2f 40e0 9301 e357ae8f1b41 茶点故事 阅读 35575 评论 2 赞 270
end_time: 2024-04-27 04:42:55 +0800 Completed in 136.307115ms