es6 语法

/---字符串---/

let str="string"
str.includes("c"))     //判断字符串是否包含“c”,是返回true,否者返回false
str.startWith("str")   //判断字符串是否以“str”开头,是返回true,否者返回false
str.endWith("ng")      //判断字符串是否以“ng”结尾
str.repeat(2)          //字符串复制两次 ,返回“stringstring”
'1'.padStart(2 ,'0')   //字符串从头开始补全 长度为2 ,以 '0 '补全, 返回 “01”
‘1’.padEnd(2 ,'0')   //字符串以尾开始补全 长度为2 ,以‘0’补全,返回‘10’
String.raw`Hi\n${1+2}` //阻止正则表达式进行转义


/---数字---/
Number.isInteger(25)           //判断这个是否是一个整数
Number.isSafeInteger(10)       //判断这个数是不是在一个安全范围
Number.MAX_SAFE_INTEGER  数字最大的安全范围
Number.MIN_SAFE_INTEGER  数字最小的安全范围
//数字取整
Math.trunc(4.1)//返回‘4’  Math.trunc(4.9)//返回‘4’

//判断是否是正负数
Math.sign(-5)//返回-1    Math.sign(0)//返回0    Math.sign(5)//返回1    Math.sign("-50")//返回-1    Math,sign("sdfs")//返回NaN 不是一个数字
    

/---map和array的对比---/
let map=new Map();
let array=[];        
//
map.set('t',1)
array.push({t:1})
//
map.has('t');
array.find(item=>item.t)
//
map.set('t',2)
array.forEach(item=>item.t?item.t=2:"")
//
map.delete('t')
let index=array.findIndex(item=>item.t)
array.splice(index,1)

/---set和array的对比---/
let set=new Set();
let array=[];
//
set.add({t:1})
array.push({t:1})
//
set.has({t:1})
array.find(item=>item.t)
//
set.forEach(item=>item.t?item.t=2:"")
array.forEach(item=>item.t?item.t=2:"")
//
set.forEach(item=>item.t?set.delete(item):'')
let index=array.findIndex(item=>item.t)
array.splice(index,1)

/---map,set,object对比---/
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.info(
 map.has('t')
 set,has(item)
 't' in obj
)
//
map.set('t',2)
item.t=2
obj['t']=2
//
map.delete('t')
set.delete(item)
delete obj['t']


/---Proxy用法---/
let obj={
  time:'2017-03-11',
  name:'net',
  _r:123
}
let monitor =new Proxy(obj,{
  //拦截对象属性的获取
  get(target,key){
     return target[key].replace('2017','2019') //把2017改成2019
  },
  //拦截对象设置属性
  set(target,key,value){
     if(key==='name'){
       return target[key]=value;
     }else{
       return target[key];
     }
  },
  //拦截key in object操作
  has(target,key){
    if(key==="name"){
    return target[key]
    }else{
     return false
    }
  },
  //拦截delete
  deleteProperty(target,key){
    it(key.indexOf('_'){
    delete target[key];
    return true;
    }else{
        return target[key];
    }
  },
  //拦截object.key,object.getOwnPropertySymbols,object.getOwnPropertyNames
  ownKeys(target){
    return Object.keys(target).filter(item=>item!='time')
  }

});
console.log(monitor.time)         //monitor属性的获取,这个返回2019-03-11
monitor.time='2018'               //monitor属性的修改,这个没有修改,被拦截了
monitor.name='finghi'             //monitor属性的修改,设置成功
 
console.log('name' in monitor ,'time' in monitor)   //返回 true false

delete monitor.time;              //monitor属性的删除,没有成功,被拦截了
delete monitor._r;                //monitor属性的删除,成功

console.log(Object.keys(monitor));//time被拦截了 返回name _r ,

/---Reflect---/
//Reflect和上面的proxy用法一样,但不需要new
{
  let obj={
    time:'2017-03-11',
    name:'net',
    _r:123
  }

console.log(Reflect.get(obj,'time'))               //返回2017-03-11
Reflect.set(obj,'name','www');                     //设置name属性
console.log(Reflect.has(obj,'name'))               //返回true
}

/---Proxy和Reflect的经典应用场景---/
function validator(targer,validator){
  return Proxy(target,{
    _val=validator,
    set(target,key,value,proxy){
      if(target.hasOwnProperty(key)){
    let va=this._val[key]
    if(!!va(value)){
      return Peflect.set(target,key,value,proxy)
    }else{
      throw Error(`不能设置${key}到${value}`)
    }
      }else{
    throw Error(`${key}不存在`)
      }
    }
  })
}


const personValidators={
  name(val){
    return typeof val==='string'
  }
  age(val){
    return typeof val==='number' && val>18
  }
  mobile(val){
    return typeof val==='number'
  }
}

class Person{
  constructor(name,age){
     this.name=name;
     this.age=age;
     this.modile=123456789
     return validator(this,personValidators)
  }
}

const person =new Person('lilei',30)
console.info(preson);
person.name="Han mei mei"
console.info(person);

 

posted @ 2020-01-30 14:51  到此灬一游丿  阅读(233)  评论(1编辑  收藏  举报