ES8新特性用法体验
1.字符串填充
本特性是在字符串的的头部和尾部添加新的字符串,且返回具有指定长度的字符串。指定长度是必填字段。
str.padStart(targetLength [, padString])
str.padEnd(targetLength [, padString])
来个必刷题体验一下~~
'wen'.padStart(2); // 'wen'
'wen'.padStart(5); // ' wen'
'wen'.padStart(6, 'bingguo'); // 'binwen'
'wen'.padStart(14,'bingguo'); // 'bingguobingwen'
'wen'.padEnd(2); // 'wen'
'wen'.padEnd(5); // 'wen '
'wen'.padEnd(6, 'bingguo'); // 'wenbin'
'wen'.padEnd(14, 'bingguo'); // 'wenbingguobing'
刷完题,思考一分钟:
只是在字符串的首尾加其他字符串,这种方式是不是不太灵活?以下两种方式在运用上更加随心所欲,灵活变动。
let a = 'wen';
let b = `${a}bingguo`; //'wenbingguo'
let c = `bingguo${a}`; //'bingguowen'
let d = `bing${a}guo`; //'bingwenguo'
var aa = 'wen';
var bb = 'wen'+'bingguo'; //'wenbingguo'
然后又说到这个字符串填充的经典应用场景了,时间格式化:
'9:00'.padStart(5, '0'); //'09:00'
'19:00'.padStart(5, '0'); //'19:00'
'23'.padStart(10, 'YYYY-MM-DD'); //'YYYY-MM-23'
'23'.padStart(10, '2018-03-DD'); //'2018-03-23'
这种格式化时间上午和下午的24小时制还真的方便很多,不需要作是否填0的判断,直接统一加,方便之处用完体验绝佳~~~
2. Object.values和Object.entries函数
ES8新增的这两个方法是对Object.keys()的补充,可以将对象转换成数组,此方法有时在处理后端所给结构的处理非常便捷。
Object.values场景实践
场景一:简单的转数组方法
const obj = { a:{x: 'name'}, b:{y: 1}};
Object.values(obj); //[{x: "name"},{y: 1}]
这个场景只能取到一级目录下面的值,多级目录时,对二级及以上的嵌套层,都是按照原来的方式输出,直接来一段:
let obj2 = {
"code":10000,
"data":{
"list":[{"code":1,"value":"wo"},{"code":2,"value":"he"}],
"total":100,
"item":{"price":100,"activity":1}
}
};
Object.values(obj2);
//数组长度为2,[10000,{"list":[{"code":1,"value":"wo"},{"code":2,"value":"he"}],"total":100,"item":{"price":100,"activity":1}}]
这么看着,这个提取数组就会有点不伦不类了,不过总会有具体的应用场景更好会契合他的特点的,萝卜总会找到坑!!!
场景二:按照key值大小,从小到大在数组中排列
const objNumberical = { 10: '我是第一个', 1: '我是第二个', 3: '我是第三个' };
Object.values(objNumberical);//["我是第二个", "我是第三个", "我是第一个"]
场景三:字符串转数组
Object.values('wenyi'); //["温", "仪"]
Object.values('温仪'); //["w", "e", "n", "y", "i"]
当处理数据类型为string类型,Object.values承担的功能和'wenyi'.split('')
转数组方法功能相同。
Object.entries场景实践
此函数最后提取的结果是对象结构转化的数组结构,原对象的键值对都还在,变为[key,value]的形式。
const obj = { a:{x: 'name'}, b:{y: 1}};
Object.entries(obj); //[["a",{"x":"name"}],["b",{"y":1}]]
目前的我,想不出来应该在怎样的场景下去实践,粗粗略过。。。
3.Object.getOwnPropertyDescriptors函数
es8中Object新成员getOwnPropertyDescriptors,注意与ES5的getOwnPropertyDescriptor区分开。新成员是返回指定对象的自身属性,是在对象内定义的,不是继承来的。
const obj = {
get name() { return 'wenyi'; },
set total(c) { return c}
};
Object.getOwnPropertyDescriptor(obj,'name');
// get 描述对象没有入参
//{
// configurable:true,
// enumerable:true,
// get: function name(){}, //the getter function
// set: undefined
//}
Object.getOwnPropertyDescriptor(obj,'total');
//{
// configurable:true,
// enumerable:true,
// get: undefined,
// set: function total(c){}, //the setter function
//}
描述符的数据,对装饰器比较重要。装饰器是用来修改类的行为的一个函数。稍后解释!!
getOwnPropertyDescriptors主要是为了解决Object.assign()拷贝get属性和set属性的缺陷问题。来一条示例留个印象!!
Object.assign()缺陷举例:
const obj = {
get name() { return 'wenyi'; },
set total(c) { return c}
};
const copyObj = {};
Object.assign(copyObj, obj);
Object.getOwnPropertyDescriptor(copyObj, 'total');
//{
// configurable:true,
// enumerable:true,
// value: undefined,//此时obj对象是有对total属性set赋值方法,并没有被拷贝过去
// writable: true
//}
此时,getOwnPropertyDescriptors结合Object.defineProperties就达到完美正确拷贝!!
const obj = {
get name() { return 'wenyi'; },
set total(c) { return c}
};
const copyObj = {};
Object.defineProperties(copyObj, Object.getOwnPropertyDescriptors(obj)); //更改Object.assign()方法
Object.getOwnPropertyDescriptor(copyObj, 'total');
//{
// configurable:true,
// enumerable:true,
// get: undefined,
// set: function total(c){}, //the setter function
//}
4.装饰器函数(Decorator)
装饰器修改类行为,在编译是发生,所以装饰器是在编译阶段运行代码。简单判断:看写法,判断装饰器!!!
想要编译有装饰器的代码,需要安装babel-plugin-transform-decorators-legacy插件,同时配置.babelrc才行。
//decorator是随意取的名称
@decorator
class wenyi {}
//或者
class wenyi {}
wenyi = decorator(wenyi) || wenyi;
简单示例一:此示例写法是eslint严格模式下的格式
//实例添加属性,需要通过目标类的prototype操作,class类是可以直接操作属性的
function testDecorator (...list) {
return function (target) {
Object.assign(target.prototype, ...list)
}
}
const wenyi = {
handleYuanFang () { console.log('我是添加进来的') }
}
@testDecorator(wenyi)
class AnotherClass {}
let result = new AnotherClass()
result.handleYuanFang() //'我是添加进来的'
装饰器也可以添加某个功能点,写的方法类似,只是无需在目标类基础上操作,此处不多展开,另行学习之~
5.参数列表尾部逗号
ES8对SyntaxError报错的容错处理:允许函数调用或定义时,参数列表最后一个后面还有逗号而不报语法错误。
function valuePrint(var1, var2, var3,) {
console.log(var3)
};
valuePrint(1,2,38,); //38
实践了一下,发现在一般的ES5网页中也并没有发生有逗号报错现象,不知是否是浏览器做了操作处理,如有知道怎么重现报错的步骤和环境,请帮助补充,感激不尽~相互学习,共同进步,共勉!
结语
以上是比较简短的实践内容,在js高速发展的时代下,拥抱新的语法糖,与JS同发展的前端新体验必须时刻准备好接受!!!