前端日常开发规范

前端日常开发规范

编码规范

1. 可读性 --代码缩进 添加注释

2. 变量和函数命名

  2.1 变量类型透明化 例如car或person。
  2.2 函数名应该以动词开始 , 例如getName()。返回布尔值的函数通常以is开头,比如isEnabled()。
  2.3 变量、函数和方法应该以小写字母开头,使用驼峰大小写(camelCase)形式,如getName()和isPerson。类名应该首字母大写,如Person、RequestFactory。常量值应该全部大写并以下划线相接,比如REQUEST_TIMEOUT。 

3. 变量类型透明化 // 通过初始化标明变量类型

let found = false; // 布尔值 
let count = -1; // 数值 
let name = ""; // 字符串 
let person = null; // 对象

降低耦合性的方式

1. 解耦HTML/JavaScript

避免在JavaScript中创建大量HTML (以下为不推荐的示例)

// HTML紧密耦合到了JavaScript 
function insertMessage(msg) {  
  let container = document.getElementById("container");  
  container.innerHTML = `<div class="msg">  <p> class="post">${msg}</p>  <p><em>Latest message above.</em></p>  </div>`; } 

2. 解耦CSS/JavaScript

现代Web应用程序经常使用JavaScript改变样式,因此虽然不太可能完全解耦CSS和JavaScript,但可以让这种耦合变成更松散。这主要可以通过动态修改类名而不是样式来实现,比如:

// CSS与JavaScript松散耦合 
element.className = "edit"; 

3. 解耦应用程序逻辑/事件处理程序

看下边的例子

function handleKeyPress(event) {  // 处理事件
  if (event.keyCode == 13) {  
    let target = event.target;  
    let value = 5 * parseInt(target.value);  
    if (value > 10) {             // 应用程序逻辑
      document.getElementById("error-msg").style.display = "block";  
      }  
    } 
  } 

优化后的写法

function validateValue(value) {  
  value = 5 * parseInt(value);  
  if (value > 10) {  
    document.getElementById("error-msg").style.display = "block";  
    } 
  }  
function handleKeyPress(event) {  
  if (event.keyCode == 13) {  
    let target = event.target;  validateValue(target.value);  
    } 
  }

把应用程序逻辑从事件处理程序中分离出来有很多好处。首先,这可以让我们以最少的工作量轻松地修改触发某些流程的事件。如果原来是通过鼠标单击触发流程,而现在又想增加键盘操作来触发,那么修改起来也很简单。其次,可以在不用添加事件的情况下测试代码,这样创建单元测试或自动化应用程序流都会更简单。

编码惯例

1. 尊重对象所有权 (意思就是如果你不负责创建和维护某个对象及其构造函数或方法,就不应该对其进行任何修改。)

主要如下内容:

  1. 不要给实例或原型添加属性。
  2. 不要给实例或原型添加方法。
  3. 不要重定义已有的方法。

2. 不声明全局变量

如果有多个变量,可以用对象的形式来定义

3. 不要比较null

JavaScript不会自动做任何类型检查,因此就需要开发者担起这个责任。

function sortArray(values) {  
  if (values != null) { // 不要这样比较!  
  values.sort(comparator);  
  } 
} 
function sortArray(values) {  
  if (values instanceof Array) { // 推荐  
  values.sort(comparator);  
  } 
} 

应该如下这样操作
 如果值应该是引用类型,则使用instanceof操作符检查其构造函数。
 如果值应该是原始类型,则使用typeof检查其类型。
 如果希望值是有特定方法名的对象,则使用typeof操作符确保对象上存在给定名字的方法。

4. 使用常量

依赖常量的目标是从应用程序逻辑中分离数据,以便修改数据时不会引发错误。
需要定义为常量的值:

  1. 重复出现的值:任何使用超过一次的值都应该提取到常量中,这样可以消除一个值改了而另一个值没改造成的错误。这里也包括CSS的类名。
  2. 用户界面字符串:任何会显示给用户的字符串都应该提取出来,以方便实现国际化。
  3. URL:Web应用程序中资源的地址经常会发生变化,因此建议把所有URL集中放在一个地方管理。
  4. 任何可能变化的值:任何时候,只要在代码中使用字面值,就问问自己这个值将来是否可能会变。如果答案是“是”,那么就应该把它提取到常量中。

性能

作用域意识

1. 避免全局查找
示例

function updateUI() {  
  let imgs = document.getElementsByTagName("img");  
  for (let i = 0, len = imgs.length; i < len; i++) {  
    imgs[i].title = '${document.title} image ${i}';  
    }   
    let msg = document.getElementById("msg");  
    msg.innerHTML = "Update complete."; 
  } 

这个函数看起来好像没什么问题,但其中三个地方引用了全局document对象。如果页面的图片非常多,那么for循环中就需要引用document几十甚至上百次,每次都要遍历一次作用域链。
通过在局部作用域中保存document对象的引用,能够明显提升这个函数的性能,因为只需要作用域链查找. 如下所示

function updateUI() {  
  let doc = document;  
  let imgs = doc.getElementsByTagName("img");  
  for (let i = 0, len = imgs.length; i < len; i++) {  
    imgs[i].title = '${doc.title} image ${i}';  
    }   
    let msg = doc.getElementById("msg");  
    msg.innerHTML = "Update complete."; 
    }

2. 不使用with语句

选择正确的方法

1. 避免不必要的属性查找
尽量通过在局部变量中保存值来替代属性查找。
2. 优化循环
(1) 简化终止条件。因为每次循环都会计算终止条件,所以它应该尽可能地快。这意味着要避免属性查找或其他O(n)操作。
(2) 简化循环体。循环体是最花时间的部分,因此要尽可能优化。要确保其中不包含可以轻松转移到循环外部的密集计算。
(3) 使用后测试循环。最常见的循环就是for和while循环,这两种循环都属于先测试循环。do-while就是后测试循环,避免了对终止条件初始评估 ,因此应该会更快。

3. 展开循环
如果循环的次数是有限的,那么通常抛弃循环而直接多次调用函数会更快。
4. 其他性能优化注意事项

  1. 原生方法很快
  2. switch语句很快。
    如果代码中有复杂的if-else语句,将其转换成switch语句可以变得更快。然后,通过重新组织分支,把最可能的放前面,不太可能的放后面,可以进一步提升性能。

语句最少化

1. 多个变量声明

// 一条语句更好 
let count = 5,  
color = "blue", 
values = [1,2,3], 
now = new Date(); 

这里使用一个let声明了所有变量,变量之间以逗号分隔。这种优化很容易做到,且比使用多条语句执行速度更快

2. 插入迭代性值

let name = values[i++]; 

这一条语句完成了前面两条语句完成的事情。因为递增操作符是后缀形式的,所以i在语句其他部分执行完成之前是不会递增的。只要遇到类似的情况,就要尽量把迭代性值插入到上一条使用它的语句中。

3. 使用数组和对象字面量

// 一条语句创建并初始化数组 
let values = [123, 456, 789];  
// 一条语句创建并初始化对象 
let person = {  
  name: "Nicholas",  
  age: 29,  
  sayName() {  
    console.log(this.name);  
  } 
}; 

注意 减少代码中的语句量是很不错的目标,但不是绝对的法则。一味追求语句最少化,可能导致一条语句容纳过多逻辑,最终难以理解

*[注释:] 本篇内容为学习<<JavaScript高级程序设计(第四版) >> 的时候摘录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值