20条常见的编码陷阱之JavaScript篇

供稿:hz-xin.com     日期:2024-05-02

  不管你现在的编程技能有多么的高超 曾经你也是个亦步亦趋 不断的学习的初学者 在编程这条曲折的道路上 我想你肯定犯过一些低级的错误 遇见过一些普通的编码陷阱

   不必要的DOM操作

   例如下面这段代码

  // anti pattern

  for (var i = ; i < ; i++){

  var li = $( <li> ) ( This is list item # + (i+ ))

  $( #someUL ) append(li)

  }

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

  var liststring = ;

  for (var i = ; i > ; i ){

  liststring += <li>This is list item # + ( i)

  }

  document getElementById( someUL ) innerHTML(liststring)

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

  var liststring = <li>

  var lis = [];

  for (var i = ; i > ; i ){

  lis push( This is list item # + ( i))

  }

  liststring += lis join( </li><li> ) + </li> ;

  document getElementById( someUL ) innerHTML(liststring)

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

   不一致的变量名和函数名

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

  var foo = bar ;

  var plant = green ;

  var car = red ;

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

  下面是对函数的命名

  function subtractFive(number){

  return number ;

  }

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

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

  function addFive(number){

  return number + ;

  }

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

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

  function Dog(color){

  lor = color;

  }

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

   在for…Loops中使用hasOwnProperty()方法

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

  for (var prop in someObject) {

  alert(someObject[prop]) // alert s value of property

  }

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

  for (var prop in someObject) {

  if (someObject hasOwnProperty(prop)) {

  alert(someObject[prop]) // alert s value of property

  }

  }

   比较布尔值

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

  if (foo == true) {

  // do something for true

  } else {

  // do something for false

  }

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

  if (foo) {

  // do something for true

  } else {

  // do something for false

  }

  又或者这样写

  if (!foo) {

  // do something if foo is false

  } else {

  // do something if foo is true

  }

   事件绑定

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

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

  相关的HTML代码

  <div id= grid container >

  <a ><img src= someimage thumb jpg ></a>

  <a ><img src= someimage thumb jpg ></a>

  <a ><img src= someimage thumb jpg ></a>

  …

  </div>

   不好的JavaScript写法

  $( a ) on( click function() {

  callLightbox(this)

  })

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

  $( #grid container ) on( click a function(event) {

  callLightbox(event target)

  })

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

   避免三元冗余

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

  // javascript

  return foo toString() !== ? true : false;

  // php

  return (something()) ? true : false;

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

  // javascript

  return foo toString() !== ;

  // php

lishixinzhi/Article/program/Java/JSP/201311/19714



20条常见的编码陷阱之JavaScript篇
答:不必要的DOM操作 例如下面这段代码 // anti pattern for (var i = ; i < ; i++){ var li = $( <li> ) ( This is list item # + (i+ ))( #someUL ) append(li)} 这段代码对DOM进行了 ...

Java面试中有哪些陷阱
答:Java程序员面试常见陷阱一、final finally finalize的区别 1、final修饰符,Java中的关键字,用final修饰变量的必须在声明时就给定初始值,而且不允许被修改;用final修饰方法不允许被重写;用final修饰的类不允许被继承。2、finally...

JAVA编码规范
答:(9) 若不得已进行一些不太雅观的编程,至少应该把那些代码置于一个类的内部。 (10) 任何时候只要发现类与类之间结合得非常紧密,就需要考虑是否采用内部类,从而改善编码及维护工作(参见第14章14.1.2小节的"用内部类改进代码")。

Scala代码编写中常见的十大陷阱
答:case int => println( List of Ints ) case java lang String => println( List of Strings ) case _ => println( Something else ) } 设计错误 Implicit关键字的使用不小心 Implicits非常强大 但要小心 普通类型不能使用隐式...

java如何判断编码是否是utf8编码
答:UTF-8编码规范 及如何判断文本是UTF-8编码的UTF-8的编码规则很简单,只有二条:1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。2)对于n字节...

java 怎么获得文件编码格式
答:Java如何获取文件编码格式1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK。 按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出文件前三...

java中常见的异常类
答:从异常类的继承架构图中可以看出:Exception 类扩展出数个子类,其中 IOException、RunntimeException 是较常用的两种。习惯上将 Error 与 Exception 类统称为异常类,但这两者本质上还是有不同的。Error 类专门用来处理严重影响...

在搜索引擎课抓起的信息中以哪种方哪种形式比较难以抓取的?
答:搜索引擎最常见的一种是Flash 各种跳转也是蜘蛛陷阱之一,除了301转向以外,搜索引擎对其他形式的跳转都比较敏感,如:302跳转,JavaScrt跳转,Flash跳转,Meta 动态URL不利于搜索引擎蜘蛛爬行,应该尽量避免 链接编码是Javascript...

"javasc#ipt:void(0)" 是什么意思
答:这是个病毒,用360专杀先查杀再修复一下~另外检查快速启动栏IE图标,右键点属性,看目标那一项,正确值应为"C:\Program Files\Internet Explorer\IEXPLORE.EXE",看看后面是不是跟了东西?如果有,删掉!

不利于搜索引擎爬行和抓取的蜘蛛陷进有哪些
答:各种跳转也是蜘蛛陷阱之一,除了301转向以外,搜索引擎对其他形式的跳转都比较敏感,如:302跳转,JavaScrt跳转,Flash跳转,Meta Refresh跳转。有些网站用户访问首页时会被自动转向到某个目录下的页面。但大部分这种首页转向看不...