让你5分钟掌握9个JavaScript小技巧
译者按: 技巧虽好、重在掌握并使用起来!
- 原文: LearntheseneatJavaScripttricksinlessthan5minutes
- 译者: Fundebug
为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。
1.删除数组尾部元素
一个简单的用来清空或则删除数组尾部元素的简单方法就是改变数组的length属性值。
constarr=[11,22,33,44,55,66]; //truncanting arr.length=3; console.log(arr);//=>[11,22,33] //clearing arr.length=0; console.log(arr);//=>[] console.log(arr[2]);//=>undefined
2.使用对象解构来模拟命名参数
如果你需要将一系列可选项作为参数传入函数,那么你也许倾向于使用了一个对象(Object)来定义配置(Config)。
doSomething({foo:'Hello',bar:'Hey!',baz:42}); functiondoSomething(config){ constfoo=config.foo!==undefined?config.foo:'Hi'; constbar=config.bar!==undefined?config.bar:'Yo!'; constbaz=config.baz!==undefined?config.baz:13; //... }
这是一个陈旧、但是很有效的方法,它模拟了JavaScript中的命名参数。不过呢,在doSomething中处理config的方式略显繁琐。在ES2015中,你可以直接使用对象解构。
functiondoSomething({foo='Hi',bar='Yo!',baz=13}){ //... }
如果你想让这个参数是可选的,也很简单。
functiondoSomething({foo='Hi',bar='Yo!',baz=13}={}){ //... }
3.使用对象解构来处理数组
可以使用对象解构的语法来获取数组的元素:
constcsvFileLine='1997,JohnDoe,US,john@doe.com,NewYork'; const{2:country,4:state}=csvFileLine.split(',');
4.在switch语句中用范围值
可以使用下面的技巧来写满足范围值的switch语句:
functiongetWaterState(tempInCelsius){ letstate; switch(true){ case(tempInCelsius<=0): state='Solid'; break; case(tempInCelsius>0&&tempInCelsius<100): state='Liquid'; break; default: state='Gas'; } returnstate; }
5.await多个async函数
在使用async/await的时候,可以使用Promise.all来await多个async函数。
awaitPromise.all([anAsyncCall(),thisIsAlsoAsync(),oneMore()])
6.创建一个纯(pure)对象
你可以创建一个100%的纯对象,他不从Object中继承任何属性或则方法(比如,constructor,toString()等等)。
constpureObject=Object.create(null); console.log(pureObject);//=>{} console.log(pureObject.constructor);//=>undefined console.log(pureObject.toString);//=>undefined console.log(pureObject.hasOwnProperty);//=>undefined
7.格式化JSON代码
JSON.stringify不止可以将一个对象字符化,还可以格式化输出JSON对象。
constobj={ foo:{bar:[11,22,33,44],baz:{bing:true,boom:'Hello'}} }; //Thethirdparameteristhenumberofspacesusedto //beautifytheJSONoutput. JSON.stringify(obj,null,4); //=>"{ //=>"foo":{ //=>"bar":[ //=>11, //=>22, //=>33, //=>44 //=>], //=>"baz":{ //=>"bing":true, //=>"boom":"Hello" //=>} //=>} //=>}"
8.从数组中移除重复元素
ES2015中,有了集合的语法。通过使用集合语法和Spread操作,可以很容易将重复的元素移除:
constremoveDuplicateItems=arr=>[...newSet(arr)]; removeDuplicateItems([42,'foo',42,'foo',true,true]); //=>[42,"foo",true]
9.平铺多维数组
使用Spread操作,可以很容易去平铺嵌套多维数组:
constarr=[11,[22,33],[44,55],66]; constflatArr=[].concat(...arr);//=>[11,22,33,44,55,66]
可惜,上面的方法仅仅适用于二维数组。不过,通过递归,我们可以平铺任意维度的嵌套数组。
unctionflattenArray(arr){ constflattened=[].concat(...arr); returnflattened.some(item=>Array.isArray(item))? flattenArray(flattened):flattened; } constarr=[11,[22,33],[44,[55,66,[77,[88]],99]]]; constflatArr=flattenArray(arr); //=>[11,22,33,44,55,66,77,88,99]
就这些啦!我希望这些小技巧可以帮你写出更加漂亮的JS代码!如果还不够,那么不妨用Fundebug做你的辅助!
精选评论
EthanBMartin:这个switch的写法很巧妙,不过不推荐。请不要鼓励开发者用这种方式去写JS代码。我们曾经有一个工程师这么写,后来在代码review的时候,造成了很大的阅读苦难。好在我们及时将其重构为更加容易读懂的代码。不妨对比一下用swtich和if的区别:
functiongetWaterState1(tempInCelsius){ letstate; switch(true){ case(tempInCelsius<=0): state='Solid'; break; case(tempInCelsius<100): state='Liquid'; break; default: state='Gas'; } returnstate; } functiongetWaterState2(tempInCelsius){ if(tempInCelsius<=0){ return'Solid'; } if(tempInCelsius<100){ return'Liquid'; } return'Gas'; }
第二种写法有几点优势:
A)代码量更少,更加易读;B)你不需要声明一个局部变量,读者不会一直要去追踪你如何对这个变量做了更改;C)switch(true)真的会让人莫名其妙。
FloSloot:很棒的文章!不过不推荐第六招,除非你一定要使用。因为它的执行效率很慢,而且占用空间更大。因为V8并没有对空对象做优化。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。