感觉大叔的博文真的是很不错 我打算严格要求自己 按照大叔说的,这样我就会更有规范,更有思想的去工作 去写代码(一入代码深似海)
 
1,尽可能的少用全局变量(污染全局空间,也会和别人的代码 发生冲突造成严重的后果) ---->命名空间模式或者是函数立即自动执行.
 
2.不管是不是在函数内始终用var来声明变量, 例如:
function sum(x, y){
 result = x + y;
//这里创建了一个隐式全局变量
 return result;
}
 
3.避免出现隐式变量 例如在函数中不通过var声明的变量 或者是没有声明的变量. (部分var声明 例如)
function foo(){
var a = b = 0;
//这里a是局部变量,但是b是全局变量
}
就好比   var a = (b = 0); 这行代码一样
PS: 
(1)通过var 创建的全局变量是不能被删除的;
(2)无var创建的隐式全部变量 是可以被删除的 
var  global_var1 = 1;
global_var2 = 2;
delete global_var1; //false
delete global_var2;//true
4.声明变量 不管是局部变量还是全局变量 使用链分配是比较好的做法  例如
var a, b;  (变量的声明尽可能 var  和变量名字空开)--->
5.函数中的变量的置顶解析/预解析 例如:
function(){
alert(name);//undefined 而不是报错是因为 咱们的name变量已经解析只是还没有进行表达式的赋值 所以他的值是有的 就是undefined
var name = 'zero';
}
PS: 最好的办法就是你提前声明你需要的所有变量 并最数值确定的时候进行表达式赋值
 
6.for循环
 
for(var i = 0;i<myarray.length; i++){
// do something  这不是一个好循环 (每次循环都要去读取myarray的长度 如果 myarray 是一个HTMLCollection对象的时候)
// HTMLCollections指的是DOM方法返回的对象,例如:
//document.getElementsByName()
//document.getElementsByClassName()
//document.getElementsByTagName()
//每次查询都要实时查选dom (操作dom是比较昂贵的)
}
优化方案如下:
(1)
for (var i = 0, max = myarray.length; i < max; i++) {
   // 使用myarray[i]做点什么
}
(2)
for (var i = 0, max = myarray.length; i < max; i+=1) {
   // 使用myarray[i]做点什么
}
(3)
var i, myarray = [];
for (i = myarray.length; i–-;) {
   // 使用myarray[i]做点什么
}
 
5. for-in 循环应该用在非数组对象的遍历上  也叫做"枚举"
 
6. hasOwnProperty()方法---->过滤掉从原型链上下来的属性 例如:
  var man = {
   hands: 2,
   legs: 2,
   heads: 1
};

Object.prototype.name='zero';
//console.log(man.name);//zero  在原型中添加了一个name属性并且赋值为zero
 
for (var i in man) {
   if (man.hasOwnProperty(i)) { // 过滤
      console.log(i, ":", man[i]);
   }
}
控制台打印结果为 
hands:2
legs:2
heads:1
(已经把原型中添加的属性过滤掉了)
 
另外一种使用hasOwnProperty()的形式是取消Object.prototype上的方法。像是:
 
for (var i in man) {
   if (Object.prototype.hasOwnProperty.call(man, i)) { // 过滤
      console.log(i, ":", man[i]);
   }
}
 
其好处在于在man对象重新定义hasOwnProperty情况下避免命名冲突。也避免了长属性查找对象的所有方法,你可以使用局部变量“缓存”它。
 
var i, hasOwn = Object.prototype.hasOwnProperty;
for (i in man) {
    if (hasOwn.call(man, i)) { // 过滤
        console.log(i, ":", man[i]);
    }
}
 
PS: 不增加内置原型是最好的。
 
7. 避免隐式类型转换-----> 始终使用===和!==操作符
 
8.避免 eval(); 此方法接受任意的字符串,并当作JavaScript代码来处理 例如:
// 反面示例
var property = "name";
alert(eval("obj." + property));

// 更好的
var property = "name";
alert(obj[property]);

 
9. 不要给setInterval(), setTimeout()和Function()构造函数传递字符串----->请传递函数
 
// 反面示例
setTimeout("myFunc()", 1000);
setTimeout("myFunc(1, 2, 3)", 1000);

// 更好的
setTimeout(myFunc, 1000);
setTimeout(function () {
   myFunc(1, 2, 3);
}, 1000);

 
使用function来代替eval是不错的选择
 
var jsstring = "var un = 1; console.log(un);";
eval(jsstring); // logs "1"

jsstring = "var deux = 2; console.log(deux);";
new Function(jsstring)(); // logs "2"

jsstring = "var trois = 3; console.log(trois);";
(function () {
   eval(jsstring);
}()); // logs "3"

console.log(typeof un); // number
console.log(typeof deux); // "undefined"
console.log(typeof trois); // "undefined"

如果你绝对必须使用eval(),你 可以考虑使用new Function()代替。有一个小的潜在好处,因为在新Function()中作代码评估是在局部函数作用域中运行
eval()和Function构造不同的是eval()可以干扰作用域链,而Function()更安分守己些 例如:
 
(function () {
   var local = 1;
   eval("local = 3; console.log(local)"); // logs "3"
   console.log(local); // logs "3"
}());

(function () {
   var local = 1;
   Function("console.log(typeof local);")(); // logs undefined

}());
 
10.parseInt()下的数值转换 该方法接受另一个基数参数,这经常省略,但不应该---->  为了避免矛盾和意外的结果,总是指定基数参数
 
11.parseInt() 替换方法是将字符串转换成数字,包括:
+"08" // 结果是 8
Number("08") // 8
 
12.代码一定要进行缩进具体缩进多少 一个tab? 两个tab? 还是空格? 要根据团队的规范来执行
 
13.花括号一定不要省略就算你的花括号中只有一条语句 ----->  始终把在与之前的语句放在同一行:
 
function func() {
   return {
      name : "Batman"
   };
}
 
14.空格的使用
 
var d = 0,
    a = b + 1;
if (a && b && c) {
    d = a % c;
    a += d;
}
 
15.大写字母写构造函数:
var adam = new Person(); 
 
16. 构造函数--> 驼峰(Camel)命名法:
MyConstructor()
17.对于函数和方法名称,变量也可以使用小驼峰式命名法
calculateArea()getFirstName()
 
18. 全部单词大写;
var PI = 3.14,
 
19. 使用一个下划线前缀来表示一个私有属性或方法会更容易些
20.你要随时注释你的代码我相信一个良好的程序员都会在每个功能模块加上自己的注释 不为了别人 为了自己也需要
 

读汤姆大叔《深入理解javascript系列》笔记一编写高质量代码的更多相关文章

  1. 汤姆大叔 深入理解JavaScript系列(20):《你真懂JavaScript吗?》答案详解 后六道题答案

    原题目地址:http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html 答案丰富多彩.我只是记录下自己思考了半天全部的答案. 题目一:找出 ...

  2. 我读汤姆大叔的深入理解js(一)

    前言 闲来看看javascript,在圆子里发现了汤姆大叔的文章,先是整体瞄了几眼,感觉不错,然后细细研读.记录下自己的学习历程和个人理解.更重要的是作为笔记 高质量JS代码 在看汤姆大叔的这一系列文 ...

  3. 读汤姆大叔《JavaScript变量对象》笔记

    一段简单的JavaScript代码思考 先看一段简单的代码,打印结果是??为什么why?? 从上述打印结果不难看出,在打印基本变量num.函数表达式fn.函数声明fun时,就已经知道变量num.函数表 ...

  4. (第一章)改善JavaScript,编写高质量代码。

    根据<编写高质量代码改善JavaScript程序的188个建议>这本书,来记录我目前所了解的建议方式. 建议1:警惕Unicode乱码 根据ECMA标准规定JavaScript语言可以使用 ...

  5. 编写高质量代码改善C#程序的157个建议——建议44:理解委托中的协变

    建议44:理解委托中的协变 委托中的泛型变量天然是部分支持协变的.为什么是“部分支持协变”?看下面示例: class Program { public delegate T GetEmployeeHa ...

  6. 编写高质量代码改善C#程序的157个建议——建议28:理解延迟求值和主动求值之间的区别

    建议28:理解延迟求值和主动求值之间的区别 要理解延迟求值(lazy evaluation)和主动求值(eager evaluation),先看个例子: List<, , , , , , , , ...

  7. 编写高质量代码——html、css、javascript

    [编写高质量代码]1.注释的必要性:增加代码的可读性.2.web标准:由一系列的标准组合而成,其核心理念是将网页的结构.样式.行为分离,所以他可分为:结构标准.样式标准和行为标准.3.一个符合标准的网 ...

  8. 我读汤姆大叔的深入理解js(二)

    继续汤姆大叔的js之旅. 揭秘命名函数表达式 函数表达式和函数声明 汤姆大叔在博客中引用ECMA规范:函数声明必须带有标识符,函数表达式可以省略.对于我来说这些概念的东西真是不所适从.还是大叔的实例带 ...

  9. JavaScript手札:《编写高质量JS代码的68个有效方法》(一)(1~5)

    编写高质量JS代码的68个有效方法(一) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...

随机推荐

  1. TortoiseSVN 使用简介

    什么是SVN(subversion)? 有一个简单但不十分精确的比喻:SVN = 版本控制 + 备份服务. 简单的说就是,你可以把SVN看做一个备份服务器,但是更好的是,他可以帮助记住每一次上传的版本 ...

  2. python字符串转日期

    需要两步 为了从字符串中提取时间,并进行比较,因此有了这个问题,如何将字符串转换成datetime类型 1.字符串与time类型的转换 >>> import time>> ...

  3. javascript快速入门25--浏览器中的XML

    打开XML 首先,直接从浏览器中打开XML文件,浏览器会对其进行格式良好性检查,如果不符合XML语法规范则显示出错,如果格式良好,再检查是否包含样式表(CSS或XSL),如果包含样式表,则用样式表格式 ...

  4. SVN服务的部署及使用

      环境说明 系统版本     CentOS 7.2 x86_64   SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是 ...

  5. java动态载入指定的类或者jar包反射调用其方法

    序言 有时候.项目中会用到java动态载入指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大减少,更加的模块化.代码利用率更高.模式中的代理模式就用到java的这一机制. 下 ...

  6. Linux学习笔记 (八)Shell概述

    一.什么是Shell? Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动,挂起,停止甚至是编写一些程序.Shell还是一 ...

  7. web报表工具FineReport经常使用函数的使用方法总结(日期和时间函数)

    web报表工具FineReport经常使用函数的使用方法总结(日期和时间函数) 说明:凡函数中以日期作为參数因子的,当中日期的形式都必须是yy/mm/dd.并且必须用英文环境下双引號(" & ...

  8. Excel 读取

    using UnityEngine; using System.Collections; using NPOI; using Ionic.Zip; using System.IO; using NPO ...

  9. Django——如何处理请求(URL配置和视图)

    URLconfig—— 为了绑定视图函数和URL,我们使用URLconf. URLconf 就像是 Django 所支撑网站的目录. 它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间 ...

  10. 小程序image的13种mode

    注:image组件默认宽度300px.高度225px mode 有效值: mode 有 13 种模式,其中 4 种是缩放模式,9 种是裁剪模式. 缩放: 裁剪:                 文章来 ...