感觉大叔的博文真的是很不错 我打算严格要求自己 按照大叔说的,这样我就会更有规范,更有思想的去工作 去写代码(一入代码深似海)
 
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. Linux-C网络编程之epoll函数

    上文中说到假设从100的不同的地方取外卖,那么epoll相当于一部手机,当外卖到达后,送货员能够通知你.从而达到每去必得,少走非常多路. 它是怎样实现这些作用的呢? epoll的功能 epoll是se ...

  2. Linux、CentOS系统下调整home和根分区大小

    1.首先查看磁盘使用情况 [root@localhost ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 Filesystem Size Used Avail Use% Mounted ...

  3. 接入WebSocket记录 + 一些个人经验

    闲扯 WebSocket 以前没用过,之前写过一篇博客是基于原生socket的(查看)比较复杂,慎入.今天另外一个APP需要接websocket了,然后便找到了facebook的 SocketRock ...

  4. unity postprocessing stack v2的优化

    今天做到33ms了 从45ms 到33ms 后处理占20ms 优化后8ms 去掉两次blit fast mode layer 去掉UI camera 用overlay 层级用sortingorder ...

  5. java压缩 GZIP进行简单压缩,ZIP进行多文件保存

    java压缩  GZIP进行简单压缩,ZIP进行多文件保存 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlhbmdydWkxOTg4/font/5a6 ...

  6. MPTCP 源码分析(四) 发送和接收数据

    简述:      MPTCP在发送数据方面和TCP的区别是可以从多条路径中选择一条 路径来发送数据.MPTCP在接收数据方面与TCP的区别是子路径对无序包 进行重排后,MPTCP的mpcb需要多所有子 ...

  7. taro + iview 实现跨平台开发(App,Wap,微信小程序)

    1.安装 (1)安装脚手架 npm install -g @tarojs/cli taro init myApp (2)H5端运行 npm run dev:h5 taro build --type h ...

  8. Spring 配置dataSource和sessionFactory

    记得导入dbcp和pool的jar包.   <?xml version="1.0" encoding="UTF-8"?> <beans xml ...

  9. RelativeLayout经常使用属性介绍及实例解说

    RelativeLayout是一种相对布局.控件的位置是依照相对位置来计算的.后一个控件在什么位置依赖于前一个控件的基本位置,是布局最经常使用,也是最灵活的一种布局. 下边来看一下他的经常使用属性 这 ...

  10. java之static关键字

    介绍: 1.在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所有对象来说,static成员变量只有一份. 2.用static声明的方法为静态方 ...