一、数字变化和Math新增的东西
数字(数值)变化
二进制:(Binary) 0b开头表示二进制
let a = 0b010101 //12
八进制:(Octal) 0o开头表示八进制
let a = 0o666 //438
es6把大部分数字操作的一些方法挂到了Number身上。比如:
Number.isNaN(NaN) 等价于 isNaN()
Number.isFinite(a) 判断是不是数字
Number.isInteger(a) 判断数字是不是整数
Math身上的新增
1、Math.trunc() 截取。只保留整数部分
Math.trunc(4.95) // 4
2、Math.sign() 判断一个数到底是不是正数、负数、0
Math.sign(-5) // -1
Math.sign(5) // 1
Math.sign(0) // 0
Math.sign(-0) // -0
如果是其他值,返回NaN。 Math.sign('abc') // NaN
3、Math.cbrt() 计算一个数立方根
Math.cbrt(27) // 3
等等一些方法
二、ES2018(ES9)新增东西
1、命名捕获
语法: (?<别名>)
let str = '2018-03-20';
let reg = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
console.log(str.match(reg).groups) // {year: '2018', month: '03', day: '20'}
let {year, month, day} = str.match(reg).groups
console.log(year, month, day) // 2018 03 20
2、dotAll模式 (s代表)
之前‘.’在正则里表示匹配任意东西,但是不包括\n
现在'.'和s配合使用可以匹配任意东西
//之前的没有s
let reg = /^\w+.\w+$/
let str = 'welcome-51mmr'
console.log(reg.test(str)) //true
let str = 'welcome\n51mmr'
console.log(reg.test(str)) //false
//现在'.'和s配合用
let reg = /^\w+.\w+$/s
let str = 'welcome-51mmr'
console.log(reg.test(str)) //true
let str = 'welcome\n51mmr'
console.log(reg.test(str)) //true
3、标签函数
定义起来和普通函数没有啥区别,调用时不同
function fn() {}
fn() // 这样调用就是普通函数
fn`aaa` //标签函数使用
//例:
function fn(args) {
return args[0].toUpperCase()
}
console.log(fn`welcome`) // WELCOME
三、Proxy的使用
proxy:代理。扩展(增强)对象一些功能
proxy作用:比如Vue中拦截、预警、上报、扩展功能、统计、增强对象等等。
proxy是设计模式的一种,代理模式
语法:let obj = new Proxy(target, handle);
obj返回一个新的对象
参数一target:表示被代理的对象或函数
参数二handle:对代理的对象做什么操作,是一个对象,里面有很多的方法。比如:
{
set (target, property, value) {}, //设置的时候干的事情,参数分别表示代理的对象,你访问的属性,值
get (target, property) {}, //获取干的事情 ,参数分别表示代理的对象,你访问的属性
deleteProperty(target, property) {}, //删除, 参数分别表示代理的对象,你访问的属性
has(target, property) {}, //问你有没有这个东西时,‘xxx’ in obj, 参数分别表示代理的对象,你访问的属性
apply(target, context, args) {}, //调用函数处理,参数分别表示代理的对象,this的指向,传的值
...
}
/*
使用get方法
实现一个访问一个对象身上的属性,默认不存在返回的是undefined,我希望是如果不存在给个错误(警告)提示
*/
let obj = {
name: 'Tom'
}
let newObj = new Proxy(obj, {
get(target, property){
if (property in target) { //如果你访问的属性在这个代理的对象上
return target[property];
} else {
throw new ReferenceError(`${property}不在此对象上`)
}
}
})
console.log(newObj.name) // Tom
console.log(newObj.age) //报错
/*
使用set方法
*/
let obj = new Proxy({}, {
set(target, prop, value){
if (prop === 'age') {
if(!Number.isInteger(value)){ //判断设置的值是不是整数
throw new TypeError('年龄必须为整数')
}
if(value > 200){
throw new RanngeError('年龄超标了,必须小于200岁')
}
}
target[prop] = value
}
})
obj.a=123
obj.name = 'Tom'
console.log(obj) //{a: 123, name: 'Tom'}
obj.age = 13.5 //报错年龄必须为整数
/*
使用deleteProperty方法
*/
let json = {
a:1,
b:2
}
let newJson = new Proxy(json, {
deleteProperty(target, property){
console.log(`您要删除${property}属性`)
delete target[property]
}
})
delete newJson.a
console.log(newJson) // {b:2}
/*
使用has方法
*/
let json = {
a:1,
b:2
}
let newJson = new Proxy(json, {
has(target, property){
console.log(`判断是否存在调用has方法`)
return property in target
}
})
console.log('a' in newJson) // true
console.log(newJson)
四、Reflect的使用
Reflect:反射。如果需要增强方法的一些功能的话,需要跟反射配合来用
proxy的第二个参数寒冷的里的apply方法要配合Reflect使用
function sum(a,b){
return a+b
}
let newSum = new Proxy(sum, {
apply(target, context, args){ //代理的函数, this的指向,传进来的参数
console.log(target, context, args) 等价于 console.log(...arguments) //function sum(a,b){ return a+b} undefined [2,3]
return Reflect.apply(...arguments)
}
})
console.log(newSum(2,3)) // 5
Reflect.apply(调用的函数,this的指向,参数数组)
可以通过Reflect对象身上直接那袋语言内部的东西。比如:
Reflect.has(Object, 'assign')
Reflect.deleteProperty(json, 'a')
等等