let arr5 = ['jspang', '技术胖', '逼逼叨']
for (let item of arr5) {
console.log(index, item)//只输出值
}
for (let item of arr5.keys()) {
console.log(index, item)//只输出索引
}
for (let item of arr5.entries()) {
console.log(item )//一起输出值和索引
}
for (let [index, value] of arr5.entries()) {
console.log(index, value)//分来输出值和索引
}
entries( )实例方法
<!-- entries()实例方式生成的是Iterator形式的数组,那这种形式的好处就是可以让我们在需要时用next()手动跳转到下一个值。进行手动遍历 -->
let arr=['jspang','技术胖','逼逼叨']
let list=arr.entries();
console.log(list.next().value);
console.log('执行完这个,再继续遍历')
console.log(list.next().value);
console.log('执行完这个,再继续遍历')
console.log(list.next().value);
in的方法
let arr=[,,,,,];
console.log(arr.length);
//上边的代码输出了5,但是数组中其实全是空值,这就是一个坑 ES6的in就可以解决这个问题
console.log(0 in arr); //这里的0指的是数组下标位置是否为空。
<!-- 数组的遍历方法 -->
数组的遍历
forEach遍历
let arr=['jspang','技术胖','cc'];
arr.forEach((val,index)=>console.log(index,val));
//for…of…循环:
for (let item of setArr){
console.log(item);
}
size属性
console.log(setArr.size); //3 18去重了一个
forEach循环
setArr.forEach((value)=>console.log(value));
WeakSet的声明
set是一个数组结构 weakSet就是一个对象版的set
不能直接在new 的时候就放入值,将报错 eg let weakObj=new WeakSet({a:'cc',b:'wd'});//报错
let weakObj=new WeakSet();
let obj={a:'cc',b:'乘冲'}
let obj1=obj; obj1和obj用的是同一个内存空间 所以重复不会被添加进去
weakObj.add(obj);
weakObj.add(obj1);
console.log(weakObj);
let obj={a:'cc',b:'乘冲'}
let obj1={a:'cc',b:'乘冲'};
weakObj.add(obj);
weakObj.add(obj1);//obj1产生的内存空间和obj不一样 所以会被添加进去
console.log(weakObj);
第14节:map数据结构
json和map的对比
Map的灵活性要更好,你可以把它看成一种特殊的键值对,但你的key可以设置成数组,值也可以设置成字符串,让它不规律对应起来。
给 var map赋值 key为对象 value为字符串
let json = {
name:'jspang',
skill:'web'
}
console.log(json.name);
var map=new Map();
map.set(json,'iam'); //拿json对象作为key iam字符串作为值
console.log(map);
当然也可key字符串,value是对象。我们调换一下位置,依然是符合map的数据结构规范的。
map.set('jspang',json);
console.log(map);
proxy为代理的意思 是es6用它增强对象和函数的方法
//es5定义对象的方法
let obj={
add:function(){
return val+100;
},
name:"i am cc"
}
//se6proxy的方法
let pro = new Proxy({放对象体},{放预处理机制})
let pro = new Proxy({
add:function(){
return val+100;
},
name:"i am cc"},{
//get 得到数据之前 预处理的事情
get:function(target,key,property){//三个参数是固定的
console.log('come in get')
return target[key]
},
set:function(target,key,value,receiver){
//目标,属性名,要变成的值,原始值
console.log(`setting ${key}=${value}之前的值是${receiver}`)
return target[key]
}
}
);
console.log(pro.name)//打印的是get函数执行的结果
console.log(pro.name = 'cc');//这里打印的是set里面的返回值
apply apply的作用是调用内部的方法,它使用在方法体是一个匿名函数时。
语法:函数名.apply(对象,数组(或者伪数组))
功能:1,调用该函数 2,将this指向第一个参数 3,将第二个参数的数组拆解成一个个的元素,依次作为函数的实参
let target = function () {
return 'I am JSPang';
};
var handler = {
apply(target, ctx, args) {
console.log('do apply');
return Reflect.apply(...arguments); //固定格式 并未完全解释,要自己查文档深究
}
}
var pro = new Proxy(要处理的函数, 放预处理机制);
var pro = new Proxy(target, handler);
console.log(pro());
第16节 promise对象的使用
解决回调地狱
let state=1;
function step1(resolve,reject){
console.log('1.开始-洗菜做饭');
if(state==1){
resolve('洗菜做饭--完成');
}else{
reject('洗菜做饭--出错');
}
}
function step2(resolve,reject){
console.log('2.开始-坐下来吃饭');
if(state==1){
resolve('坐下来吃饭--完成');
}else{
reject('坐下来吃饭--出错');
}
}
function step3(resolve,reject){
console.log('3.开始-收拾桌子洗完');
if(state==1){
resolve('收拾桌子洗完--完成');
}else{
reject('收拾桌子洗完--出错');
}
}
new Promise(step1).then(function(val){
console.log(val);
return new Promise(step2);
}).then(function(val){
console.log(val);
return new Promise(step3);
}).then(function(val){
console.log(val);
return val;
});
第17节:class类的使用
类里面是方法和函数
声明类
class Coder{
name(val){
console.log(val)
}
}
实例化类
let cc = new Coder;
cc.name('cc');
在类里面 多个方法不需要,号隔开
class Coder {
name(val) {
console.log(val)
return val
}
skill(val) {
console.log(this.name('cc') + ":" + val)
}
}
// 实例化类
let cc1 = new Coder;
cc1.skill('web');
类的参数传递
类参数传递 eg: new Coder('val')
与类里面方法的参数传递区分开eg:cc1.skill('web')
<br>
在类的参数传递中我们用constructor( )进行传参
class Coder{
constructor(a,b){
this.a=a;
this.b=b;
}
add(){
return this.a+this.b;
}
}
let cc=new Coder(1,2);
console.log(cc.add());
class的继承
类的一大特点就是继承
class htmler extends Coder{}
let pang=new htmler;
pang.name('cc-extends');
声明一个htmler的新类并继承Coder类,htmler新类里边为空,这时候我们实例化新类,并调用里边的name方法。结果也是可以调用到的。