ES6 基础语法学习
数组扩展
{
let arr = Array.of(1,2,3);
console.log('arry=',arr);
let empty = Array.of();
console.log(empty)
}
{
let arr = Array.from([1,2,3],function (item){
return item *2;
})
console.log(arr);
}
{
console.log('fill-8',[1,'a',undefined].fill(8));
console.log('fill,pos',['a','b','c'].fill(7,0,2));
}
{
for(let index of [1,2,3,].keys()){
console.log('keys',index)
}
for(let index of [1,2,3,].values()){
console.log('values',index)
}
for(let [index,value] of [1,2,3,4].entries()){
console.log(index +": " + value)
}
}
{
console.log([1,2,3,4].find(function (item){
return item >2 ;
}))
console.log([1,2,3,4].findIndex(function (item){
return item >2 ;
}))
}
{
console.log('num',[1,2,3,4].includes(1));
console.log('NaN',[1,2,3,NaN].includes(NaN));
}
解构
{
let a,b,c ;
a = 1 ,b = 2
console.log(a,b)
}
{
let a,b,c;
[a,b,...c] = [1,2,3,4,5,6]
console.log(a,b,c)
}
{
let a,b;
({a,b} = {a:1,b:2} )
console.log(a,b)
}
{
let a,b,c ;
[a,b,c=3] = [1,2,5]
console.log(a,b,c)
}
{
let a = 1,b = 2;
[a,b] = [b,a]
console.log(a,b)
}
{
function f(){
return [1,2];
}
[a,b] = f();
console.log(a,b)
}
{
function f(){
return [1,2,3,4,5];
}
[a,,,b] = f();
console.log(a,b)
}
{
function f(){
return [1,2,3,4,5,6]
}
[a,b,...c] = f();
console.log(a,b,c)
}
{
let obj = {a:123,b:321}
let {b,a} = obj
console.log(b,a)
}
{
let dataJson = {
title: 'abc',
data: [{
dataTitle: 'dataTitle',
name: 'dataName'
}]
}
let {title:newTitle,data: [{dataTitle:title2}]} = dataJson;
console.log(newTitle,title2)
}
对象扩展
{
console.log('字符串',Object.is('abc','abc'),'abc' === 'abc')
console.log('拷贝',Object.assign({a:1},{b:'b'}));
let test = { key:123, o:466};
for( let [k,v] of Object.entries(test)){
console.log(k,v)
}
}
{
let {a,b,...c} = {a:'test',b:'bbb',c:'ddd',e:'eee'}
console.log(a,b,c)
}
函数扩展
{
function test(x,y = 'world'){
console.log(x,y)
}
test('hello');
}
{
let x = 'test';
function test2(x,y=x){
console.log('作用域',x,y)
}
test2();
test2('kill')
}
{
function test3(...args){
for(let v of args ){
console.log('rest',v)
}
}
test3(1,2,3,4);
}
{
console.log(...[1,2,3,4])
}
{
let arrow = v => v*2;
let arrow2 = () => 5;
let a = arrow(3);
console.log(a)
console.log(arrow2());
}
{
function tail(x){
console.log('tail',x);
}
function fx(x){
return tail(x);
}
fx(123);
}
类与对象
{
class Parent{
constructor(name='mukewang'){
this.name = name;
}
}
let v_parent = new Parent();
console.log(v_parent)
}
{
class Parent{
constructor(name='mukewang'){
this.name = name;
}
}
class Child extends Parent {
constructor(name='child'){
super(name);
this.type= '123';
}
}
console.log(new Child());
}
{
class Parent{
constructor(name='mukewang'){
this.name = name;
}
get getName(){
return 'mk' + this.name;
}
set setName(value){
this.name = value;
}
}
let v = new Parent();
console.log(v.getName);
v.setName = '123';
console.log(v.getName);
}
{
class Parent{
constructor(name='mukewang'){
this.name = name;
}
static tell(){
console.log('tell');
}
}
console.log(Parent.tell)
}
{
class Parent{
constructor(name='mukewang'){
this.name = name;
}
static tell(){
console.log('tell');
}
}
Parent.type = 'test';
console.log('静态属性:',Parent.type)
}
generator
{
let tell = function* (){
yield 'a';
yield 'b';
return 'c';
}
let k = tell();
console.log(k.next())
console.log(k.next())
console.log(k.next())
console.log(k.next())
}
{
let obj ={};
obj[Symbol.iterator]=function*(){
yield 1;
yield 2;
yield 3;
};
for(let i of obj){
console.log(i)
}
}
{
let state = function*(){
while(1){
yield 'A';
yield 'B';
yield 'C';
}
}
let status = state();
console.log(status.next())
console.log(status.next())
console.log(status.next())
console.log(status.next())
console.log(status.next())
}
{
let ajax = function*(){
yield new Promise(function(resoleve,reject){
setTimeout(function(){
resoleve({code:1})
},200)
})
}
let pull = function(){
let generator = ajax();
let step = generator.next();
step.value.then(function(d){
if(d.code != 0 ){
setTimeout(function(){
console.log('wait');
pull();
},1000)
}else{
console.log(d)
}
})
}
pull();
}
Iterator
{
let arr = ["hello",'world']
let map = arr[Symbol.iterator]();
console.log(map.next());
console.log(map.next());
console.log(map.next());
}
{
let obj = {
start: [1,3,2],
end:[7,9,8],
[Symbol.iterator](){
let self = this;
let index = 0;
let arr = self.start.concat(self.end);
let len = arr.length;
return {
next(){
if(index < len ){
return {
value: arr[index++],
done: false
}
}else{
return {
value: arr[index++],
done: true
}
}
}
}
}
}
for(let key of obj){
console.log(key)
}
}
js-call-apply-bind 用法
let person1 = {
firstName: 'zhang',
lastName: 'fan',
fullName: function(arg1,arg2){
return this.firstName + " " + this.lastName + " " + arg1 + " " + arg2;
}
}
let person2 = {
firstName: 'tom',
lastName: 'join'
}
let result = person1.fullName.call(person1,'a','b');
console.log(result)
{
let person1 = {
firstName: 'zhang',
lastName: 'fan',
fullName: function(args){
return this.firstName + " " + this.lastName + " " + args[0] + " " + args[1];
}
}
let person2 = {
firstName: 'tom',
lastName: 'join'
}
let result = person1.fullName.apply(person2,['a','b']);
console.log(result)
}
{
let person1 = {
firstName: 'zhang',
lastName: 'fan',
fullName:function(arg1,arg2){
return this.firstName + this.lastName + arg1 + arg2;
},
getFullName:function(args){
return this.firstName + this.lastName + args[0] + args[1];
}
};
let person2 = {
firstName: 'tom',
lastName: 'liming'
}
let result1 = person1.fullName.bind(person2,'a','b')()
let result2 = person1.getFullName.bind(person2,['a','b'])()
console.log(result1)
console.log(result2)
}
{
console.log(Math.max.apply(null,[1,2,3]))
console.log(Math.max.apply(" ",[1,2,3]))
console.log(Math.max.apply(0,[1,2,3]))
}
{
(function(){
var x='hello';
console.log(x)
})();
}
{
const x = (x,y) => x*y;
console.log( x(2,3));
const y = (x,y) => {return x*y};
console.log(y(3,4))
}
{
function findMax(){
var max = -Infinity;
for(var i=0;i<arguments.length;i++){
if(arguments[i]>0){
max = arguments[i];
}
return max;
}
}
console.log(findMax(99,11,33))
}
{
function sumAll(){
let i,sum = 0;
for(i=0;i<arguments.length;i++){
sum += arguments[i];
}
return sum;
}
console.log(sumAll(1,2,3,4))
}
{
var add = (function(){
var count = 0;
return function (){
return count +=1;
}
})();
console.log(add());
console.log(add());
}
map-set 与数组对象的比较
{
let map = new Map();
let array = [];
map.set('t',1);
array.push({t:1})
console.log('map-array',map,array)
let map_exist = map.has('t');
let array_exist = array.find(item=>item.t)
console.log(map_exist,array_exist)
map.set('t',2);
array.forEach(v=> v.t ? v.t = 2 : '');
console.log(map,array)
map.delete('t');
let index = array.findIndex(v=>v.t)
array.splice(index);
console.log(map,array)
}
{
let set = new Set();
let array = [];
set.add({'t':1});
array.push({'t':1});
console.log('set-array',set,array)
let set_exist = set.has('t');
let array_exist = array.find(v=>v.t);
console.log(set_exist,array_exist);
set.forEach(i=> i.t ? i.t = 2 : '');
array.forEach(i => i.t ? i.t = 2 : '');
console.log(set,array)
set.forEach(v=>v.t ? set.delete(v):"");
let index = array.findIndex(v=>v.t);
array.splice(index);
console.log(set,array)
}
{
let item = {'t':1};
let map = new Map();
let set = new Set();
let obj = {};
map.set('t',1)
set.add(item);
obj['t'] = 1;
console.log('map->set->obj',map,set,obj)
console.log({
map_exist: map.has('t'),
set_exist: set.has(item),
obj_exist: 't' in obj
})
map.set('t',2);
item.t = 2;
obj['t'] = 2;
console.log(map,set,obj)
map.delete('t');
set.delete(item);
delete obj['t']
console.log(map,set,obj)
}
{
}
Promise 用法
{
let ajax = function (callback){
console.log('执行');
setTimeout(function (){
callback&&callback.call();
},1000);
}
ajax(function (){
console.log('timeout1')
})
}
{
let ajax = function(){
console.log('执行2')
return new Promise(function (resole,reject){
setTimeout(function(){
resole();
},1000)
})
}
ajax().then(function (){
console.log('promise','timeout2')
})
}
{
let ajax = function(){
console.log('执行3')
return new Promise(function (resole,reject){
setTimeout(function(){
resole();
},1000)
})
}
ajax()
.then(function(){
return new Promise(function(resole,reject){
setTimeout(function(){
resole();
},2000)
})
}).then(function(){
console.log('timeout3')
})
}
{
function loadImg(src){
return new Promise((resolve,reject){
let img = document.createElement('img');
img.src = src;
img.onload = function(){
resolve(img);
}
img.onerror = function(err){
reject(err)
}
})
}
function showImgs(imags){
imags.forEach(img=>{
document.body.appendChild(img);
})
}
Promise.all([
loadImg('1.jpg'),
loadImg('2.jpg')
]).then(showImgs);
}
{
function loadImg(src){
return new Promise((resolve,reject){
let img = document.createElement('img');
img.src = src;
img.onload = function(){
resolve(img);
}
img.onerror = function(err){
reject(err)
}
})
}
function showImgs(img){
let p = document.createComment('p');
p.appendChild(img);
document.body.appendChild(p)
}
Promise.race([
loadImg('1.jpg'),
loadImg('2.jpg')
]).then(showImgs);
}
Proxy 和 Reflect 用法
{
let obj = {
name: 'aa',
title: '标题',
_r: '_r',
time: '2022-09-16'
}
let monitor = new Proxy(obj,{
get(target,key){
return target[key].replace('2022','2023');
},
set(target,key,value){
if( key === 'name'){
return target[key] = value;
}else{
return target[key];
}
},
has(target,key){
if(key === 'name'){
return target[key];
}else{
return false;
}
},
deleteProperty(target,key){
if(key.indexOf('_')> -1 ){
delete target[key];
return true;
}else{
return target[key]
}
},
ownKeys(target){
return Object.keys(target).filter(item=>item!='time')
}
});
console.log(monitor.time);
monitor.time = '2024';
console.log(monitor.time)
monitor.name = 'test';
console.log(monitor)
console.log('has','name' in monitor)
console.log('has','time' in monitor)
delete monitor.time;
console.log('delete',monitor)
delete monitor._r;
console.log('delete',monitor)
console.log('ownKeys',Object.keys(monitor))
}
{
let obj = {
name: 'aa',
title: '标题',
_r: '_r',
time: '2022-09-16'
}
console.log('reflect get =>',Reflect.get(obj,'time'))
Reflect.set(obj,'name','test');
console.log(obj)
console.log(Reflect.has(obj,'name'))
}
{
function validator(target,validator){
return new Proxy(target,{
_validator:validator,
set(target,key,value,proxy){
if(target.hasOwnProperty(key)){
let va = this._validator[key];
if(!!va(value)){
return Reflect.set(target,key,value,proxy);
}else{
throw Error(`不能设置${key} 到 ${value}`)
}
}else{
throw error(`${key}不存在`)
}
}
})
}
const personValidator = {
name(val){
return typeof val === 'string'
},
age(val){
return typeof val === 'number' && val > 18;
},
mobile(val){
return typeof val === 'number' && val.length == 11;
}
}
class Person{
constructor(name,age){
this.name = name;
this.age = age;
this.mobile = 12345678912;
return validator(this,personValidator);
}
}
const person = new Person(1,1);
person.mobile = 12345678912;
console.log(person)
}
set-map 数据结构
{
let list = new Set();
list.add(3);
list.add(5);
console.log(list.size)
}
{
let arr = [1,2,3,4];
let list = new Set(arr);
console.log(list.size)
}
{
let list = new Set();
list.add(1)
list.add(2)
list.add(3)
list.add(1)
console.log(list.size)
}
{
let arr = ['add','update','delete','has'];
let list = new Set(arr);
console.log(list.size)
for(let [k,v] of list.entries()){
console.log(k,v)
}
for(let k of list.keys()){
console.log(k)
}
list.forEach(v=>console.log(v))
}
{
let weakList = new WeakSet();
let obj = {};
weakList.add(obj);
console.log(weakList)
}
{
let map = new Map();
let arr = ['123'];
map.set(arr,456);
console.log(map,map.get(arr))
}
{
let map = new Map([['a',123],['b',456]]);
console.log(map)
console.log(map.size)
console.log(map.delete('a'),map)
}
{
let weakmap = new WeakMap();
let obj = {};
weakmap.set(obj,123);
console.log(weakmap.get(obj))
}
Symbol 作用概念
{
let a1 = Symbol();
let a2 = Symbol();
console.log(a1 === a2)
let a3 = Symbol.for('a3');
let a4 = Symbol.for('a3');
console.log(a3===a4)
}
{
let a1 =Symbol.for('abc')
let obj = {
[a1]:123,
'abc': 345,
'c':456
}
for( let [k,v] of Object.entries(obj)){
console.log(k,v)
}
Object.getOwnPropertySymbols(obj).forEach(v=>{
console.log(obj[v])
})
Reflect.ownKeys(obj).forEach(v=>{
console.log(obj[v])
})
}