阅读编写可维护的JavaScript一书,写了一些笔记
1.本篇文章:编程风格
2.编程实践
http://blog.csdn.net/github_34514750/article/details/51221995
1.缩进层次:每个层次缩进一个tab键
2.语句结尾记得加上分号,虽然js有ASI(automatic semicolon insertion)自动分号机制,但很可能出错。
3.当一行的长度超过单行最大限制字符数时,可以手动拆成两行。通常我们会在运算符后换行,下一行增加两个层级的缩进。
例外:给变量赋值时,第二行的位置和赋值运算符的位置保持对齐
callAFunction(document,element,window,"some string value",true,123,
navigator);
4.适当加入一些空行
5.命名(变量、常量、构造函数):
js核心是ECMAScript,遵照驼峰式大小写(Camel case)命名法。
变量用名词,函数前缀应当是动词
var myName;
//这是动词,不好的写法,变量看起来像函数
var getCount = 10;
function setName() {
}
常量:使用大写字母和下划线来命名,下划线分隔不同的单词
var MAX_COUNT = 10;
构造函数:遵循大驼峰(Pascal Case),首字母大写
function Person(){
}
6.直接量(直接量是很推荐的做法)
字符串
字符串可以用”“或者‘’,但一般我喜欢用”“,因为java中都是”“,但是”“中的”则需要转义符
多行字符串使用+将字符串分成多行
var name = "wanghuan says \"hello.\"";
var name = 'wanghuan says "hello."';//不需要转义符
var longString = "wmnsdfiwheradm,lajsrrbvmsqwm," +
"qwerfsdf.";
null
undefined
null表示”没有对象”,即该处不应该有值。
undefined表示”缺少值”,就是此处应该有一个值,但是还没有定义。
对象直接量
var book = {
title:"JavaScript",
author:"wanghuan"
};
数组直接量
var numbers = [1,2,3,4];
单行注释
1.独占一行的注释,双斜线后敲入一个空格,注释前总有一个空行,且缩进层次和下一行代码保持一致
if (condition) {
// 注释
allowed();
}
2.在代码行尾部加入注释,双斜线后敲入一个空格,注释前总有间隔
if (condition) {
allowed(); // 注释
}
多行注释
注释和代码之前有一个空行,缩进层次和描述的代码一致,星号后有空格
if (condition) {
/* * 注释 * 注释 * 注释 */
allowed();
}
with
with可以用局部变量和函数的形式来访问特定对象的属性和方法,可以省略掉对象的前缀,但是不推荐使用。
// 很难分辨title和author在什么位置,也很难分辨message是一个局部变量还是book的属性,则不推荐使用
var book = {
title:"wa";
author:"wanghuan";
};
var message = "The book is";
with (book) {
message += title;
message += "by" +author;
}
for循环
尽量避免使用continue,使用if代替,这样可以增加可读性
var values = [1,2,3,4],
i,
len;
for(i = 0,len = values.length;i < len;i++) {
if (i==2) {
continue;
}
process(values[i]);
}
// 较好的写法
var values = [1,2,3,4],
i,
len;
for(i = 0,len = values.length;i < len;i++) {
if (i!=2) {
process(values[i]);
}
}
for-in和for比较
http://blog.csdn.net/github_34514750/article/details/51072812
1.变量
函数内部任意地方定义变量和在函数顶部定义变量是完全一样的。原因如下
function test (items) {
for(var i = 0,len = items.length;i < len;i++) {
doSomething(item[i]);
}
}
//上述等价于下面代码,因为ECMAScript5之前没有块级变量声明,所以让所有函数声明都放在函数头部,更明了清楚
function test (items) {
var i,len;
for(i = 0,len = items.length;i < len;i++) {
doSomething(item[i]);
}
}
var 语句合并,并且没有初始化的变量放在var语句的尾部,合并的语句下载更快,代码更短
var value = 10,
result = value + 10;//初始化的赋值运算符对齐,
i,
len;//没有初始化的变量放在var语句后
2.函数
函数声明
函数声明和变量声明一样,可以被JavaScript引擎提前,所以可以在代码中函数的调用放在函数声明之前。由于这样,我们为了减少JavaScript引擎的工作,我们推荐先声明函数在使用函数。
并且函数声明不应当出现在语句块内
// 函数声明不应当出现在语句块内,可能不按照我们的意图执行
if (condition) {
function doSomething() {
alert("hi");
}
} else {
function doSomething() {
alert("ha");
}
}
函数调用
函数调用括号左右不用空格,和块语句区分开
立即执行函数
// 不好的写法
// 函数会立即执行,value被赋值为一个对象,但这样会让人忽略后边的括号而误认为函数一个函数赋值给了这个变量
var value = function(){ }();
// 好的写法,函数用括号包裹起来
var value = (function(){ }());
严格模式
ECMAScript5引入了严格模式,通过这种方式来谨慎的解析执行js,以减少错误
// 不好的写法-全局的严格变量
"use strict";
function dosomething{
// code
}
// 好得写法
function dosomething{
"use strict";
// code
}
// 想在多个函数下应用严格模式,但是不想写多个"use strict",则用立即函数呀~
(function(){
"use strict";
function dosomething1{
// code
}
function dosomething2{
// code
}
})();
3.运算符
js具有强制类型转换机制
== 和 != 都会强制类型转换,所有有时候我们为了避免强制转换,提高效率,尽可能使用=== 和!==
原型包装类型
原型包装类型的主要作用是让原始值具有对象般的行为,例子如下:
// name其实是一个原始类型不是对象,但却有了和对象一样的行为,可以使用toUpperCase()
//其实是js引擎创建了String类型的新实例,紧接着就销毁了,在此需要时在进行创建
var name = "wanghuan";
consolde.log(name.toUpperCase());//WANGHUAN
// 可见创建新实例之后马上销毁
var name = "wanghuan";
name.first = "ya";
console.log(name.first);// undefined
并且我们应该尽量避免使用原始包装类型,当使用String,Number,Boolean创建对象时,JSHint和JSLint会给出警告