读汤姆大叔《深刻理解javascript系列》笔记一编写高质量代码

感受大叔的博文真的是很不错 我打算严格要求本身 按照大叔说的,这样我就会更有规范,更有思想的去工做 去写代码(一入代码深似海)
 
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.你要随时注释你的代码我相信一个良好的程序员都会在每一个功能模块加上本身的注释 不为了别人 为了本身也须要
相关文章
相关标签/搜索