ES6新增&&ES5严格模式

箭头函数

箭头函数是es6新增的特性,是匿名函数的另一种写法,简化了函数定义

()=>{} 声明一个匿名函数,在参数只有一个的情况下,可以省略(),在函数体只有一句代码的时候,并需要return出来可以省略{}和return;

箭头函数没有this,在箭头函数中this指向上下文this;

由于箭头函数没有this,所以不能被call,apply,bind所改变this指向,他们的第一个参数会被忽略;

箭头函数不能作为构造器,和new在一起会报错;

箭头函数没有prototype 属性;


异步执行和分线程

1 promise对象 详情访问;


2 jquery 中Deferred对象,jquery中于promise对象相似的对象,


使用详情:在函数中,实例话一个deferrde对象,var d=$.deferred(),在异步函数中使用实例化对象调用resolve()方法

最后在函数中将 d.promise()对象返回出去;(也可以直接将实例化对象返回出去所指对象不同);

function f1(){
    var b= $.Deferred();   //实例话Deferred对象;
    setTimeout(()=>{      //模拟异步执行;
        b.resolve("值")   //将值传递出去;    
    },1000)
return b ;  ||return b.promise();
}

然后调用函数 f1().then().catch() //注意 此处并不是原生js中的方法,而是jquery中的方法;此处没有finally函数

或者使用juqery中的其他方法于上面功能相同 f1().done().fail().always();


3 使用fetch()函数

es7新增,用于拉去资源,是基于Prmise对象来实现的,不是基于XMLHttpReequest对象所封装的,是window的方法;

参数方面:fotch()函数有两个参数,第一个参数url,请求的地址, 第二个函数(可选不选默认get请求),请求的配置对象options 里面包含

 method: 请求方式 ,url:  请求地址,headers :请求头,  body:请求体(查询字段);

使用方式: fotch(“url”||{…}).then(res=>{ res.josn()}) //此时 并没有将数据请求成功,服务器将请求报文Response返回;(接口呈现了对一次请求的响应数据)

json() //请求报文的方法,将Response json序列化,并将其读取完成,返回一个Promise对象,将promise对象进行文本解析,得到请求的数据

完整版:fotch(“url”||{…}).then(res=>{ return res.josn()}).then(res=>{console.log(res)}) //此时就可以将数据获取了

参考文档

Response请求报文


4 分线程


在javascript中,只有一个线程,当运算数据过大时,代码会进行堵塞,此时就要进行异步操作或者分线程的形式,解决代码堵塞;

方法  创建Worker对象, 参数是另一个文件的地址,此时,一个分线程就创建完毕了。var work=new worker("./index.js");

关于分线程;

 4.1 再分线程中,代码堵塞也不会影响主线程的运行。

 4.2分线程中没有window对象;全局对象变成DedicatedWorkerGlobalScope对象,对象中的其他对象和属性只读;

 4.3不能使用Dom,bom 等相关操作,DedicatedWorkerGlobalScope对象中包括location对象和navigator对象;

 4.4关于事件,在分线程中,原生的事件大多数不在存在,常用的事件如下:

事件  由于没有windowd对象,此处不能使用window绑定事件,可以使用,DedicatedWorkerGlobalScope对象或者省略;

message   //分线程接受主线程发送的消息;

messageerror // 当分线程无法接受反序列化的消息时调用;

例子:

onmessage=function(e){

    //数据保存在事件对象的data属性中;
    console.log(e.data);
}

API

postMessage(data)  发送的消息给主线程;

主线程于分线程之间的通信(相互传递数据)

主线程使用worker实例化对象调用message事件以达到接受父线程的数据;(使用方式根分线程相同);

worker实例化对象打点postMessage(data);将数据传递到分线程;

5 async 和 await


async和await是ES7提供的异步方案,旨在进一步简化异步请求的代码。

作用:用编写同步代码的方式实现异步请求,async和await本质上是对Promise()对象提供了“语法糖”。让代码更简洁。

async  异步函数的定义方法,注意 通过async定义的并不是异步函数,而是异步函数处理函数;(可以将异步函数书写成同步的函数);

await  操作符用于等待异步执行函数, 它只能在异步函数 async function 内部使用 当代码执行到这里,会暂停代码的执行,(会执行函数外面的代码)。 等待后面执行完才会继续执行函数中的代码 .

在async function 中,默认返回一个promise对象,在函数中,不论返回什么值都是Promise.resolve(“返回的值”);将数据返回出去;

await  后面的异步执行函数,会中断函数的执行,等待异步执行函数执行完毕,才会继续往下执行,

在调用这个async函数后可也配合then();

let 和 const


let  会形成块级作用域 而var 是全局作用域;

const  也是块级作用与,常量一般使用大写字母;

函数中 es6提供了可以有默认值的参数:

function(name,age=10){}   //默认值的但参数一般放在最后一个;

箭头函数和iife   //这个就不多讲了;

es6 属性的简写  ;属性相同的时候,可以直接写一个属性名就可以了;

函数则直接可以写成下面的格式;

let obj={
    name,
    say(){

    },
}

模块化


es6提供了模块化的写法;

improt {} from "./dd/";

export default{
    //默认导出
}
export let a = 10  单个导出  单个导出之后在导入可以进行解构;

解构

把对象里面的属性解构成一个变量

var {a,b,c} = {a:10,b:20,c:30};

Symbol

 es6新增数据类型 Symbol  表示数据或者数据类型是唯一的值;  值类型; Symbol 函数栈不能用 new 命令,因为 Symbol 是原始数据类型,不是对象;

 Symbol 作为对象属性名时不能用.运算符,要用方括号。因为.运算符后面是字符串,所以取到的是字符串 sy 属性,而不是 Symbol 值 sy 属性。

 最大的用法是定义对象的属性的唯一性,还可以定义一些常量定义的时候采用Symbol()方式进行定义,



const COLOR_RED=Symbol("red");   //因为Symbol值是唯一的,所有不会存在重复的常量值;

不能使用for in  for of  进行遍历; 也不会被Object.kes()  所获取;

但可视使用  Object.getOwnPropertySymbols(obj)  //获取所有symbol类型的属性名  只获取symbol类型;

Reflect.ownKeys()  获取所有的keys 包含symbol 属性名;

Symbol.for()  类似单例模式,首先会在全局搜索被登记的 Symbol 中是否有该字符串参数作为名称的 Symbol 值,

如果有即返回该 Symbol 值,若没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索。

symbol.keyFor()   // 返回创建的数据 返回一个已登记的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。

map 对象


map 保存的是键值对,相当于是一个数据字典,任何值都可以作为一个键或者值;

map和object的区别:

一个obejct类型的键只能是字符串或者symbol()类型,但是map键可以任意类型;

对象里面属性是无序的,map中键是有序的;

map的键的大小可以使用size属性获取,object对象里面属性手动计算

object都有自己的原型,自己对象里面属性和对象原型上添加的属性有命名重冲突的现象

var str ="key";

var myMap=new Mpa()

myMap.set(str,"value");   //字符串key和字符串value组成相关联的;

myMap.get(str)   //"value";

myMap.get("key")  //"value";  因为str ="key";  只有值类型可以这样做,引用类型则不可以;

myMap.has(str)   //是否包含这个数据;

myMap.delete(str)  //删除这个数据;

myMap.keys()    //吧所有的key转化成迭代器类型的; (可以使用foro进行迭代)

myMap.values()    //吧所有的value转化成迭代器类型的;

myMap.entries()    //吧所有的key+value转化成迭代器类型的;  返回一个数组;

set 对象


set数据集主要是保存一些唯一性的数据,里面有恒等的数据会被覆盖掉;(引用类型数据相同但地址不同也可以储存)

用set对象存储的数据不论是元素数据或者以后新添加的必须保证唯一性;可用开数组的去重; 

var mySet=new Set();  //创建一个set 对象;

mySet.add()   //为set对象添加值;

mySet.has()   //数据集是否包含这个数据;

迭代器


迭代器是es6引入的新的遍历机制; 其中forof 就是迭代器的一种实现;

for of  只能迭代Array  Set  map String 这四种格式的数据;

其中两个核心概念;

迭代器是一个统一的接口,它的作用是使各种数据结构可以便捷的访问;

        接口:是指定的一种约束,像要链接接口,必须满足这种约束;

迭代器是一个用于遍历数据的指针;

创建一个迭代器 ;Symbol.iterator 指向了结构数据的起始位置;

 () 之后返回的值才是Symbol.iterator类型 而这种类型的数据才可以迭代

使用next()方法进行迭代;

var arr=[1,2,3,4];

var iterator=arr[Symbol.iterator]()  //开始进行迭代;

iterator.next()   //迭代,返回迭代的数据 和是结束成迭代的布尔值 done;


generator函数


可以通过 yield 关键字,把函数的执行流挂起,为改变执行流程提供了可能,从而为异步编程提供解决方案。

基本用法:  在fouciton后面添加*,返回值使用yield 就能将函数执行流挂起;

function* generator(){
    yield 1;
    yield 2;
}

var gen=generator()   //调用函数让指针指向起始位置;

 gen.next()    //让指针指向下一个yield;

 nexr()  //可以进行传参;当 next 传入参数的时候,该参数会作为上一步yield的返回值。第一个next()传入参数无效;

代理函数 proxy;

代理处理一些不可修改 只能读取对象;  本质操作另一个对象来通过代理对象达到一种功能

创建一个代理对象;

var 代理对象={
    get(target,key){
        target 目标对象;
        key  目标对象的key
    },
    set(target,key,value){
        target  目标对象
        key 目标对象的key
        value 目标对象的value
    }
}


var proxy=new proxy("目标对象","代理对象");

proxy.    //调用了代理对象的get方法;

proxy.xxx=xxx  //调用了代理对象的set方法;

es5 严格模式

消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
消除代码运行的一些不安全之处,保证代码运行的安全;
提高编译器效率,增加运行速度;
为未来新版本的Javascript做好铺垫。

1 在严格模式下,一个变量未定义的时候,不能先使用,
2 严格模式下 函数是一个纯函数,里面的this指向的是undefined
3 严格模式下 ,不能使用width()函数
4 严格模式下 函数的参数不能重名
5 严格模式下 想使用八进制的时候需要添加0o标志
6 严格模式下 不能使用eval和arguments为变量名

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值