设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

20条常见的编码陷阱 你中枪了没?

2012-11-20 14:18| 发布者: 红黑魂| 查看: 3102| 评论: 0|来自: CSDN

摘要: 不管你现在的编程技能有多么的高超,曾经你也是个亦步亦趋,不断的学习的初学者。在编程这条曲折的道路上,我想你肯定犯过一些低级的错误、遇见过一些普通的编码陷阱。本文作者跨越多个语言,为大家总结了20条常规陷 ...

不管你现在的编程技能有多么的高超,曾经你也是个亦步亦趋,不断的学习的初学者。在编程这条曲折的道路上,我想你肯定犯过一些低级的错误、遇见过一些普通的编码陷阱。本文作者跨越多个语言,为大家总结了20条常规陷阱,并提供了解决方案。

JavaScript篇

1.不必要的DOM操作

例如下面这段代码:

  1. // anti-pattern  
  2. for (var i = 0; i < 100; i++){  
  3.    var li = $("<li>").html("This is list item #" + (i+1));  
  4.    $("#someUL").append(li);  

这段代码对DOM进行了100次修改,并且创建了100个不必要的jQuery对象。正确的做法是使用一个文档片段,或者创建一个字符串,把100个<li>元素赋给该字符串。然后附加到HTML中。这样就只需运行DOM一次,代码如下:

  1. var liststring = "";  
  2. for (var i = 100; i > 0; i--){  
  3.    liststring += "<li>This is list item #" + (99- i);  
  4. }  
  5. document.getElementById("someUL").innerHTML(liststring); 

正如上面所描述的一样,下面再提供一个方式,使用数组:

  1. var liststring = "<li>" 
  2. var lis = [];  
  3. for (var i = 100; i > 0; i--){  
  4.    lis.push("This is list item #" + (99- i));  
  5. }  
  6. liststring += lis.join("</li><li>") + "</li>";  
  7. document.getElementById("someUL").innerHTML(liststring); 

这是在JavaScript创建重复HTML最快最简单的方法,无需使用模板库或框架。

2.不一致的变量名和函数名

这个问题是非常重要的,尤其当你在别人的代码上工作时,一定要保持标识符(变量名和函数名)一致,例如下面这段代码:

  1. var foo = "bar";  
  2. var plant = "green";  
  3. var car = "red"

通常,人们并不会设置变量名叫Something,这涉及到命名规则问题,命名应清晰明了,一目了然。很多编程语言地变量命名都使用大写。

下面是对函数的命名:

  1. function subtractFive(number){  
  2.    return number - 5;  

语法结构清晰并且能起到解释性功能。

例如想要对给定的数字加5,仍采用上述命名模式,比如:

  1. function addFive(number){  
  2.    return number + 5;  

有时,你会根据返回值命名,例如该函数要返回一个HTML字符串,那么可以命名为getTweetHTML(),如果函数只是做一些操作,无需返回值,那么可以在前面加一个do前缀。例如doFetchTweets()。

构造函数通常会遵循类原则,大写第一个字母:

  1. function Dog(color){  
  2.    this.color = color;  

命名应带有描述性,比如操作型的函数在前面加do,另外要具备可读性和提示性。

3.在for...Loops中使用hasOwnProperty()方法

JavaScript数组是没有关联的,可以把它当做哈希表,使用循环来遍历对象属性:

  1. for (var prop in someObject) {  
  2.     alert(someObject[prop]); // alert's value of property  

然而,存在的问题是for...in loop是在对象属性链上遍历每个枚举类型的属性,如果你只想使用对象实际拥有的属性,这可能有问题的。那怎么解决呢?你可以使用hasOwnProperty()方法。代码如下:

  1. for (var prop in someObject) {  
  2.     if (someObject.hasOwnProperty(prop)) {  
  3.         alert(someObject[prop]); // alert's value of property  
  4.     }  

4.比较布尔值

把布尔值作为条件进行比较,其实这是在浪费电脑的计算时间。看下面这个例子吧:

  1. if (foo == true) {  
  2.     // do something for true  
  3. else {  
  4.     // do something for false  

其实foo==true这个比较完全是多余的,因为foo已经是布尔类型。直接这样写就行:

  1. if (foo) {  
  2.     // do something for true  
  3. else {  
  4.     // do something for false  

又或者这样写:

  1. if (!foo) {  
  2.     // do something if foo is false  
  3. else {  
  4.     // do something if foo is true  

5.事件绑定

在JavaScript中,事件是个复杂的问题。事件冒泡(event bubbling)和委托正在取代内联事件(inline onclick)操作(一些特殊的“初始页”除外)。

假设你有一个图片网格,需要启动一个modal lightbox窗口。千万不要采取下面的做法,示例采用的是jQuery,如果你使用相似的库或者其他,冒泡机制也同样适合传统的JavaScript。

相关的HTML代码:

  1. <div id="grid-container"> 
  2.    <a href="someimage.jpg"><img src="someimage-thumb.jpg"></a> 
  3.    <a href="someimage.jpg"><img src="someimage-thumb.jpg"></a> 
  4.    <a href="someimage.jpg"><img src="someimage-thumb.jpg"></a> 
  5.    ...  
  6. </div> 

不好的JavaScript写法:

  1. $('a').on('click'function() {  
  2.    callLightbox(this);  
  3. }); 

这段代码假设调用lightbox,里面传递一个anchor元素并且引用全屏图片。与其绑定每个anchor元素还不如直接使用#grid-container元素。

  1. $("#grid-container").on("click""a"function(event) {  
  2.    callLightbox(event.target);  
  3. }); 

在这段代码中,this和event.target都表示anchor元素。同样你也可以在任何父元素上使用。只要保证所定义的元素是事件目标就行(event's target)。

6.避免三元冗余

在JavaScript和PHP中,过度使用三元语句是很常见的事情:

  1. // javascript  
  2. return foo.toString() !== "" ? true : false
  1. // php  
  2. return (something()) ? true : false; 

条件判断的返回值永远只有false和true,言外之意就是你无需把true和false显示添加到三元运算中。相反,你只需简单的返回条件:

  1. // javascript  
  2. return foo.toString() !== ""
  1. // php  
  2. return something(); 

PHP篇

7.适当的时候使用三元操作

If...else语句是大多数语言的重要组成部分。但有些简单的事情,比如根据条件进行赋值,你很有可能会这样写:

  1. if ($greeting)  
  2. {  
  3.     $post->message = 'Hello';  
  4. }  
  5. else 
  6. {  
  7.     $post->message = 'Goodbye';  

其实使用三元操作只需一行代码就可以搞定,并保持了良好的可读性:

  1. $post->message = $greeting ? 'Hello' : 'Goodbye'


酷毙
1

雷人

鲜花

鸡蛋

漂亮

刚表态过的朋友 (1 人)

  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部