感觉大叔的博文真的是很不错 我打算严格要求自己 按照大叔说的,这样我就会更有规范,更有思想的去工作 去写代码(一入代码深似海)
 
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. 处理 WebService 中的 Map 对象

    最近,我们讨论了关于 WebService 的相关问题.目前在 Smart 中,可发布两种类型的 WebService,它们是:SOAP 服务 与 REST 服务,您可以根据需要自由选择. 今天,我要 ...

  2. 当客户端为RemoteAnywhere时Chef-server 使用knife-windows bootstrap的一个问题

    笔者在使用knife-windows bootstrap 一个安装了RemoteAnywhere的节点遇到一个坑: knife bootstrap 192.168.1.245 -r 'role[my_ ...

  3. ZOJ 3526 Weekend Party

    Weekend Party Time Limit: 2 Seconds      Memory Limit: 65536 KB As the only Oni (a kind of fabulous ...

  4. 两个IP实现IIS和Apache公用80端口的设置方法

      1. 打开命令提示符并确保您位于 X:\Inetpub\Adminscripts 文件夹(其中 X 是 IIS 安装驱动器)中.为此,请在命令提示符下键入以下命令行: X: CD \Inetpub ...

  5. python3自己主动爬笑话

    学校的server能够上外网了,所以打算写一个自己主动爬取笑话并发到bbs的东西,从网上搜了一个笑话站点,感觉大部分还不太冷.html结构例如以下: watermark/2/text/aHR0cDov ...

  6. npm install --no-bin-links中的参数“no-bin-links”表示什么意思

    npm install --no-bin-links中的参数"no-bin-links"表示什么意思

  7. java中string和int互相转化 (转)

    1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...

  8. C语言-一个fopen函数中未使用二进制模式(b)引发的血案

    转自:http://blog.csdn.net/hinyunsin/article/details/6401854 最近写了一个网络文件传输模块,为了让这个模块具有更好的移植性,我尽量使用C标准IO ...

  9. mongodb or and 条件拼凑 Query.And Query.Or

    查询 1月 7月 8月 的数据 list - [0] { "$or" : [{ "JobDate" : { "$gte" : ISODate ...

  10. .net面试中的一些常见问题与答案

    1.页面传值的方式及其优缺点?   Session,Application,Cookies,Requst.QueryString,Requst.Form,Server.Transfer(通过Conte ...