JavaScript编码小技巧分享
三元操作符
如果使用if...else语句,那么这是一个很好节省代码的方式。
constx=20; letbig; if(x>10){ big=true; }else{ big=false; } //这样写... constbig=x>10?true:false;
Short-circuitEvaluation
分配一个变量值到另一个变量的时候,你可能想要确保变量不是null、undefined或空。你可以写一个有多个if的条件语句或者Short-circuitEvaluation。
if(variable1!==null||variable1!==undefined||variable1!==''){ letvariable2=variable1; } //这样写 constvariable2=variable1||'new';
不要相信我,请先相信自己的测试(可以把下面的代码粘贴在es6console)
letvariable1; letvariable2=variable1||''; console.log(variable2==='');//true variable1='foo'; variable2=variable1||''; console.log(variable2);//foo
声明变量
在函数中声明变量时,像下面这样同时声明多个变量可以节省你大量的时间和空间:
letx; lety; letx=3; //or letx,y,z=3;
如果存在
这可能是微不足道的,但值得提及。做“如果检查”时,赋值操作符有时可以省略。
if(likeJavaScript===true) //or if(likeJavaScript)
注:这两种方法并不完全相同,简写检查只要likeJavaScript是true都将通过。
这有另一个示例。如果a不是true,然后做什么。
leta; if(a!==true){ //dosomething... } //or leta; if(!a){ //dosomething... }
JavaScript的for循环
如果你只想要原生的JavaScript,而不想依赖于jQuery或Lodash这样的外部库,那这个小技巧是非常有用的。
for(leti=0;iArray.forEach简写:
functionlogArrayElements(element,index,array){ console.log('a['+index+']='+element); } [2,5,9].forEach(logArrayElements); //logs: //a[0]=2 //a[1]=5 //a[2]=9对象属性
定义对象文字(Objectliterals)让JavaScript变得更有趣。ES6提供了一个更简单的办法来分配对象的属性。如果属性名和值一样,你可以使用下面简写的方式。
constobj={x:x,y:y}; //or constobj={x,y};箭头函数
经典函数很容易读和写,但它们确实会变得有点冗长,特别是嵌套函数中调用其他函数时还会让你感到困惑。
functionsayHello(name){ console.log('Hello',name); } setTimeout(function(){ console.log('Loaded') },2000); list.forEach(function(item){ console.log(item) }) //or sayHello=name=>console.log('Hello',name); setTimeout(()=>console.log('Loaded'),2000); list.forEach(item=>console.log(item));隐式返回
return在函数中经常使用到的一个关键词,将返回函数的最终结果。箭头函数用一个语句将隐式的返回结果(函数必须省略{},为了省略return关键词)。
如果返回一个多行语句(比如对象),有必要在函数体内使用()替代{}。这样可以确保代码是否作为一个单独的语句返回。
functioncalcCircumference(diameter){ returnMath.PI*diameter } //or calcCircumference=diameter=>( Math.PI*diameter; )默认参数值
你可以使用if语句来定义函数参数的默认值。在ES6中,可以在函数声明中定义默认值。
functionvolume(l,w,h){ if(w===undefined) w=3; if(h===undefined) h=4; returnl*w*h; } //or volume=(l,w=3,h=4)=>(l*w*h); volume(2);//24TemplateLiterals(字符串模板)
是不是厌倦了使用+来连接多个变量变成一个字符串?难道就没有一个更容易的方法吗?如果你能使用ES6,那么你是幸运的。在ES6中,你要做的是使用撇号和${},并且把你的变量放在大括号内。
constwelcome='Youhaveloggedinas'+first+''+last+'.'; constdb='http://'+host+':'+port+'/'+database; //or constwelcome=`Youhaveloggedinas${first}${last}`; constdb=`http://${host}:${port}/${database}`;DestructuringAssignment(解构赋值)
constobservable=require('mobx/observable'); constaction=require('mobx/action'); construnInAction=require('mobx/runInAction'); conststore=this.props.store; constform=this.props.form; constloading=this.props.loading; consterrors=this.props.errors; constentity=this.props.entity; //or import{observable,action,runInAction}from'mobx'; const{store,form,loading,errors,entity}=this.props;你甚至可以自己指定变量名:
const{store,form,loading,errors,entity:contact}=this.props;//通过:号来重命名SpreadOperator(扩展运算符)
SpreadOperator是ES6中引入的,使JavaScript代码更高效和有趣。它可以用来代替某些数组的功能。SpreadOperator只是一个系列的三个点(...)。
//Joiningarrays constodd=[1,3,5]; constnums=[2,4,6].concat(odd); //cloningarrays constarr=[1,2,3,4]; constarr2=arr.slice(); //or //Joiningarrays constodd=[1,3,5]; constnums=[2,4,6,...odd]; console.log(nums);//[2,4,6,1,3,5] //cloningarrays constarr=[1,2,3,4]; constarr2=[...arr];不像concat()函数,使用SpreadOperator你可以将一个数组插入到另一个数组的任何地方。
constodd=[1,3,5]; constnums=[2,...odd,4,6];另外还可以当作解构符:
const{a,b,...z}={a:1,b:2,c:3,d:4}; console.log(a);//1 console.log(b);//2 console.log(z);//{c:3,d:4}强制参数
functionfoo(bar){ if(bar===undefined){ thrownewError('Missingparameter!'); } returnbar; } //or mandatory=()=>{ thrownewError('Missingparameter!'); } foo=(bar=mandatory())=>{ returnbar; }Array.find
如果你以前写过一个查找函数,你可能会使用一个for循环。在ES6中,你可以使用数组的一个新功能find()。
constpets=[ {type:'Dog',name:'Max'}, {type:'Cat',name:'Karl'}, {type:'Dog',name:'Tommy'} ] functionfindDog(name){ for(leti=0;ipet.type==='Dog'&&pet.name==='Tommy'); console.log(pet);//{type:'Dog',name:'Tommy'} Object[key]
你知道Foo.bar也可以写成Foo[bar]吧。起初,似乎没有理由应该这样写。然而,这个符号可以让你编写可重用代码块。
functionvalidate(values){ if(!values.first) returnfalse; if(!values.last) returnfalse; returntrue; } console.log(validate({first:'Bruce',last:'Wayne'}));//true这个函数可以正常工作。然而,需要考虑一个这样的场景:有很多种形式需要应用验证,而且不同领域有不同规则。在运行时很难创建一个通用的验证功能。
//objectvalidationrules constschema={ first:{ required:true }, last:{ required:true } } //universalvalidationfunction constvalidate=(schema,values)=>{ for(fieldinschema){ if(schema[field].required){ if(!values[field]){ returnfalse; } } } returntrue; } console.log(validate(schema,{first:'Bruce'}));//false console.log(validate(schema,{first:'Bruce',last:'Wayne'}));//true现在我们有一个验证函数,可以各种形式的重用,而不需要为每个不同的功能定制一个验证函数。
DoubleBitwiseNOT
如果你是一位JavaScript新手的话,对于逐位运算符(BitwiseOperator)你应该永远不会在任何地方使用。此外,如果你不处理二进制0和1,那就更不会想使用。
然而,一个非常实用的用例,那就是双位操作符。你可以用它替代Math.floor()。DoubleBitwiseNOT运算符有很大的优势,它执行相同的操作要快得多。你可以在这里阅读更多关于位运算符相关的知识。
Math.floor(4.9)===4;//true //or ~~4.9===4;//true以上就是JavaScript编码小技巧分享的详细内容,更多关于JavaScript编码技巧的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。