文章目录
箭头函数
箭头函数是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)}) //此时就可以将数据获取了
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为变量名