为不同数据结构提供统一访问机制的接口。只要部署了inerator接口,任何数据结构都可以完成遍历操作。
工作原理a)创建一个指针对象,指向当前数据结构的起始位置。
b)第一次调用对象的next方法时,指针自动指向数据结构的第一个成员。
c)接下来,重复调用next方法,指针向后移动,直到指向最后一个成员。
d)对下一个方法的每次调用都返回一个包含value和done属性的对象。
声明一个数组const Xi you =[& # 39;唐僧& # 39;,'启蒙空& # 39;,'猪八戒& # 39;,'沙僧& # 39;];
使用 for...of 遍历数组for(西游的let v){
console . log(v);
}
for(西游中的var I){
console . log(I)
}
let iterator = Xi you[symbol . iterator]();
调用对象的next方法console . log(iterator . next());
console . log(iterator . next());
console . log(iterator . next());
console . log(iterator . next());
console . log(iterator . next());
//声明一个对象 const banji = { name:& # 34;终极类& # 34;, stus:[ & # 39;小明& # 39;, & # 39;萧宁& # 39;, & # 39;小天& # 39;, & # 39;骑士& # 39; ], /添加一个迭代器,返回对象 [symbol。迭代器](){ //索引变量,做出判断,决定返回结果 让index = 0; //保存这个 let _ this = this; //创建指针对象 return { /next方法 next:function(){ if(index
//定义函数
function * gen(){
console . log(111);
yield & # 39;一个人没有耳朵& # 39;;
console . log(111);
yield & # 39;一个没有尾巴& # 39;;
console . log(111);
return & # 39;奇怪& # 39;;
console . log(111);
}
//调用函数
let iterator = gen();
//执行函数
console . log(iterator . next());
console . log(iterator . next());
console . log(iterator . next());
console . log(iterator . next());
//遍历
for(let v of gen()){
console . log(v);
}
function * gen(arg){
console . log(arg);
设一=产量111;
console.log(一个);//BBB
设二=产量222;
console.log(两个);//CCC
让三=收益率333;
console.log(三个);//DDD
}
//获取迭代器对象
let iterator = gen(& # 39;AAA & # 39);
console . log(iterator . next());
//next方法可以传入实际参数
// BBB值,yield后返回222
console . log(iterator . next(& # 39;BBB & # 39));
// CCC值传入,yield后返回333
console . log(iterator . next(& # 39;CCC & # 39));
// DDD值传入且未定义
console . log(iterator . next(& # 39;DDD & # 39;));
1s背部控制台输出111 2s背部输出222 3s背部输出333
function one(){ setTimeout(()= & gt;{ console . log(111); iterator . next(); },1000) } function two(){ setTimeout(()= & gt;{ console . log(222); iterator . next(); },2000) } 函数三(){ setTimeout(()= & gt;{ console . log(333); iterator . next(); },3000) } function * gen(){ yield one(); 产生两个(); 产量三(); } //调用生成器函数 let iterator = gen(); iterator . next();Promise实例化Promise对象const p = new Promise(function(resolve,reject){ settimeout(function(){ //成功 数据库中的用户数据& # 39;; resolve(数据); //失败 let err = & # 39;数据读取失败& # 39;; 拒绝(err); },1000); }); //调用promise对象的then方法[/h //解析成功 p . then(function(value){ console . log(value); //拒绝失败 },function(reason){ console . error(reason); })Promise使用node读取文件
const fs = require(& # 39;fs & # 39);
fs . readfile(& # 39;。/资源/用于学习。md & # 39,(err,data)= & gt;arrow函数使用fs模块下的readFile函数回调 //如果失败,则抛出错误 if(err)throw err; //如果没有错误,输出内容 console . log(data . tostring()); });承诺包裹
//实例化Promise对象 const p = new Promise(function(resolve,reject){ fs . readfile(& # 34;。/资源/用于学习。mda & # 34,(err,data)= & gt;{ //判断是否失败 if(err)reject(err); //如果成功 解析(数据); }); }); p . then(function(value){ console . log(value . tostring()); },function(reason){ console . log(& # 34;阅读失败!!"); });Promise封装Ajax请求//接口地址:https://API.apiopen.top/getjoke const p = new Promise((resolve,reject) = >: { //1。create object const xhr = newxmlhttprequest(); //2。初始化 xhr . open(& # 34;获取& # 34;, & # 34;https://api.apiopen.top/getJ"); //3。send xhr . send(); /4。绑定事件并处理响应结果 xhr。onreadystatechange = function(){ /Judge If(xhr。ready state = = 4){[/h = 200 & & xhr . status & lt;00){ //表示成功 解析(xhr . response); } else { //如果失败 reject(xhr . status); } } } }] /指定回调 p . then(function(value){ console . log(value) },function(reason){ console . error(reason); });then方法调用then方法then方法的返回结果是Promise对象。
对象的状态由回调函数的执行结果决定。
p . then(value = & gt;{ })。然后(value = & gt{ });读取多个文件介绍fs模块
const fs = require(& # 34;fs & # 34);
正常方法
fs . readfile(& # 39;。/资源/用于学习。md & # 39,(err,data1)= & gt;{ fs . readfile(& # 39;。/资源/插秧诗。md & # 39,(err,data 2)= & gt;{ fs . readfile(& # 39;。/资源/阅读。md & # 39,(err,data 3)= & gt;{ let result = data1+& # 39;rn & # 39+data 2+& # 39;rn & # 39+data 3; console.log(结果); }); }); });履行诺言
const p = new Promise((resolve,reject)= & gt;{
fs . readfile(& # 34;。/资源/用于学习。md & # 34,(err,data)= & gt;{
resolve(数据);
});
});
p . then(value = & gt;{
返回新的承诺((resolve,reject)= & gt;{
fs . readfile(& # 34;。/资源/插秧诗。md & # 34,(err,data)= & gt;{
resolve([value,data]);
});
});
})。然后(value = & gt{
返回新的承诺((resolve,reject)= & gt;{
fs . readfile(& # 34;。/资源/阅读。md & # 34,(err,data)= & gt;{
//Press
value . push(data);
resolve(值);
});
})
})。然后(value = & gt{
console . log(value . join(& # 39;rn & # 39));
});
新的数据结构类似于数组,具有唯一的成员值,并实现了迭代器接口,可以通过[扩展操作符]和[for...关于...].
属性和方法
1) size返回集合中元素的数量。
2) add添加新元素以返回当前集合。
3) delete删除元素并返回一个布尔值。
4) has检测集合中是否有元素,并返回一个布尔值。
5) clear 空 set并返回未定义。
声明一个 set设s =新集合();设s2 =新集合([& # 39;大不了& # 39;,'小事& # 39;,'好事& # 39;,'坏事& # 39;,'小事& # 39;]);
输出
console . log(S2 . size);
s2 .添加(& # 39;喜事& # 39;);
s2 .删除(& # 39;坏事& # 39;);
console . log(S2 . has(& # 39;担心& # 39;));
S2 . clear();console . log(S2);
for(let v of S2){ console . log(v);}
实践设arr = [1,2,3,4,5,4,3,2,1];
假设结果= [...新集(arr)];console.log(结果);
//General let arr2 = [4,5,6,5,6]; let结果= [...新设置(arr)]。过滤器(item = & gt{ 设s2 =新集合(arr 2);//4 5 6 if(S2 . has(item)){ 返回true }else{ 返回false } }); //简化 Let result = [...新设置(arr)]。过滤器(item = >:新集合(arr2)。has(项)); console.log(结果);合计总数
let union = [...新集合([...啊,...arr 2])];console . log(union);
let diff = [...新设置(arr)]。过滤器(item = & gt!(新设置(arr2)。has(item)));console . log(diff);
与对象类似,它也是键值对的集合。
但是“key”的范围并不局限于字符串,各种类型的值(包括对象)都可以作为键。Map还实现了迭代器接口,所以可以使用“扩展运算符”和“for … of …”进行遍历。
属性和方法:
1) size返回地图元素的数量
2) set添加一个新元素来返回当前地图。
3) get返回键名对象的键值
4) has检测映射中是否有元素,并返回一个布尔值。
5) clear 空 set并返回未定义。
声明 Map设m = new Map();
添加元素方法1:
m . set(& # 39;姓名& # 39;,'尚硅谷& # 39;);m . set(& # 39;改变& # 39;,function(){ console . log(& # 34;我们可以改变你!!");});
方法二:
let key = { school:& # 39;阿特吉古& # 39;};m.set(key,[& # 39;北京& # 39;,'上海& # 39;,'深圳& # 39;]);
数量console . log(m . size);
删除m . delete(& # 39;姓名& # 39;);
获取console . log(m . get(& # 39;改变& # 39;));console . log(m . get(key));
清空m . clear();
遍历for(let v of m){ console . log(v);//v=[ key: value]}
class使用class关键字,您可以定义类。
ES5 中 类//手机 功能手机(品牌,价格){ 这个。品牌=品牌; this . price = price; } /Add方法 phone . prototype . call = function(){ console . log(& # 34;我可以打电话!!"); } /实例化对象 让华为=新手机(& # 39;华为& # 39;, 5999); Huawei . call(); console.log(华为);类定义构造函数不能修改。当使用新的+类名时,它会自动执行。
//class class shouji { //构造函数名不能修改 构造函数(brand,price) { this。品牌=品牌; this . price = price; } //方法必须使用此语法,不能使用完整形式的ES5 object call(){ console . log(& # 34;我可以打电话!!"); } } 让onePlus =新姬寿(& # 34;1+", 1999); console . log(onePlus);1)类声明类1)类声明类
2)构造函数定义构造函数初始化。
3)扩展继承父类。
4)超级调用父构造方法。
5)静态定义静态方法和属性。
6)父方法可以被覆盖。
静态成员使用static声明的属性实例化属于类但不属于类的对象。
class {
//静态属性
静态名称= & # 39;手机& # 39;;
static change(){
console . log(& # 34;我可以改变世界& # 34;);
}
}
让诺基亚=新手机();
console . log(Nokia . name);
console . log(phone . name);
焦点
Phone.call(这个,品牌,价格);
SmartPhone.prototype =新手机;smart phone . prototype . constructor =智能手机;
//手机 功能手机(品牌,价格){ 这个。品牌=品牌; this . price = price; } phone . prototype . call = function(){ console . log(& # 34;我可以打电话& # 34;); } /smart phone 功能智能手机(品牌,价格,颜色,尺寸){ phone.call(这个,品牌,价格); this . color = color; this . size = size; } /设置子构造函数的原型 smart phone . prototype = new phone; smart phone . prototype . constructor = smart phone; //声明子类 smart phone . prototype . photo = function(){ console . log(& # 34;我可以拍照& # 34;) } smart phone . prototype . play game = function(){ console . log(& # 34;我可以玩游戏& # 34;); } const chuizi =新智能手机(& # 39;哈默& # 39;, 2499, '黑& # 39;, '5.5英寸& # 39;); console.log(垂子); 类继承扩展关键字。
焦点
超级(品牌、价格);
class {
//构造方法
构造器(品牌,价格){
this。品牌=品牌;
this . price = price;
}
/父类的成员属性
call(){
console . log(& # 34;我可以打电话!!");
}
}
类智能手机扩展phone {
//构造方法
构造器(品牌,价格,颜色,尺寸){
super(品牌,价格// Phone.call(this,品牌,价格)
this . color = color;
this . size = size;
}
photo(){
console . log(& # 34;拍照& # 34;);
}
play game(){
console . log(& # 34;玩游戏& # 34;);
}
//子类对父类
call(){
console . log(& # 39;我可以打视频电话& # 39;);
}
}
const小米=新智能手机(& # 39;小米& # 39;, 799, '黑& # 39;, '4.7英寸& # 39;);
// console.log(小米);
Xiaomi . call();
Xiaomi . photo();
小米. play game();set get// get和set
class phone {
getprice(){
console . log(& # 34;价格已读& # 34;);
return & # 39;我爱你& # 39;;
}
set price(new val){
console . log(& # 39;价格已经修改了& # 39;);
}
}
/实例化对象
让s = new Phone();
//console . log(s . price);
s . price = & # 39;免费& # 39;;
//判断两个数是否相等 函数equal (a,b) { if (math。ABS (a-b)<数字。EPSILON){ 返回true } else { 返回false } } console . log(0.1+0.2 = = = 0.3);console.log(等于(0.1 + 0.2,0.3))
const config 1 = {
host:& # 39;本地主机& # 39;,
端口:3306,
名称:& # 39;根& # 39;,
通行证:& # 39;根& # 39;,
测试:& # 39;测试& # 39;
};
const config 2 = {
host:& # 39;http://at guigu . com & # 39;,
端口:33060,
名称:& # 39;atguigu.com & # 39,
通行证:& # 39;我爱你& # 39;,
test 2:& # 39;测试2 & # 39;
}
console . log(object . assign(config 1,config 2));
object . getprototypeof
const school = {
name:& # 39;尚硅谷& # 39;
}
const cities = {
Xiaoqu:[& # 39;北京& # 39;, '上海& # 39;, '深圳& # 39;]
}
object . setprototypeof(学校,城市);
console . log(object . getprototypeof(school));
console.log(学校);
一个大的程序文件,分割成许多小文件,然后把小记录组在一起。
模块化的好处
模块化的优势如下:
1)防止命名冲突
2)代码重用
3)可维护性高
模块化规格产品
ES6之前的模块化规范包括:
1)CommonJS = & gt;NodeJS、Browserify
2)AMD = & gt;模块化开发
3)CMD = & gt;框架
ES6 模块化语法
该功能模块主要由两个命令组成:导出和导入。
export命令用于指定模块的外部接口。
//单独曝光m1 . js
导出let school = & # 39尚硅谷& # 39;;
导出函数teach(){
console . log(& # 34;我们可以教你开发技能& # 34;);
}/m2 . js的统一曝光
let school = & # 39;尚硅谷& # 39;;
function find job(){
console . log(& # 34;我们可以帮你找工作!!");
}
导出{school,find job };//默认曝光m3.js
导出默认{
学校:& # 39;阿特吉古& # 39;,
change:function(){
console . log(& # 34;我们可以改变你!!");
}
}
导入命令用于输入其他模块提供的功能。
将*作为m1从& # 34;。/src/js/m1 . js & # 34;;
将*作为m2从& # 34;。/src/js/m2 . js & # 34;;
将*作为m3从& # 34;。/src/js/m3 . js & # 34;;
console . log(m1);
console . log(m2);
console . log(m3);
从& # 34;导入{学校,教师}。/src/js/m1 . js & # 34;;
从& # 34;。/src/js/m2 . js & # 34;;
从& # 34;导入{默认为m3};。/src/js/m3 . js & # 34;;
从& # 34;导入m3;。/src/js/m3 . js & # 34;;
js引入文件模块介绍jquery文件模块
const $ = require(& # 34;jquery & # 34);
等同于
从& # 39;jquery & # 39;
使用
$('正文& # 39;).CSS(& # 39;背景& # 39;,'粉红& # 39;);
babel对ES6模块化代码转换步骤
array . prototype . includes
Includes方法用于检测数组是否包含元素并返回布尔值。
const明珠=[& # 39;西游记& # 39;,'红楼梦& # 39;,'三国演义& # 39;,'水浒传& # 39;];
法官
console.log(明珠. includes(& # 39;西游记& # 39;));
指数运算符
ES7引入了指数运算符“* *”来实现幂运算,其功能与Math.pow相同
console . log(2 * * 10);
等同于
console.log(Math.pow(2,10));