目录
类型(Types)
对象 (Object)
数组 (Arrays)
字符串 (String)
函数 (Functions)
属性 (Properties)
变量 (Variables)
置顶解析(Hoisting)
条件表达式(Conditional Expressions & Equality)
代码块(Blocks)
注释 (Comments)
空格 (WhiteSpace)
ECMScript变量可能包含2中不同数据类型的值:基本类型值和引用类型值
string
number
boolean
null
undefined
var foo=1, bar=foo; bar=9; console.log(foo,bar); //=> 1,9
引用类型的值是保存在内存中的对象。javascript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间,所以我们实际操作的是对象的引用,而不是实际的对象。
object
array
function
我们可以通过下面的实例代码来了解:
var foo=[1,2], bar=foo; bar[0]=9; console.log(bar[0],foo[0]); // =>9,9
1 推荐使用对象字面量的方式来创建对象
//不推荐的方式 var obj=new Object(); //推荐的方式 var obj={};
2 不要使用保留字作为对象的key
//不好的是使用方式 var man={ class:'super', }; // 好的使用方式 var man={ klass:'super', defaults:{clack:'kent'}, hidden:true };
(1) 使用字面量的方式创建数组
//不推荐的方式 var items=new Array(); //推荐的方式 var items=[];
(2) 如果你不知道数组的长度
var someStack=[]; //不推荐的方式 someStack[someStack.length]='abcdefg'; //推荐的方式 someStack.push('abcdefg');
(3) 当你要复制数组的时候,请使用slice
var len=items.length, copyItem=[], i; // 不推荐的方式 for(i=0;i<len;i++){ copyItem[i]=items[i]l } //推荐的方式 copyItem=items.slice();
使用单引号‘ ’修饰字符串
//bad String str="Bob Para"; // good String str='Bob Para';
函数表达式
//匿名函数表达式 var anonymous=function(){ return true; } //命名函数表达式 var named=function named(){ return true; } //立即执行函数表达式 (function(){ console.log('hello world'); })();
千万不要再block代码块(类似 if try while 等等)里面定义函数,但是你可以在block代码块里定义函数表达式。
// bad 不推荐的方式 if(currentUser){ function(){ console.log('bad'); } } // good 推荐的方式 if(currentUser){ var test=function test(){ console.log('good'); } }
不要给函数参数命名为arguments,这样就会覆盖函数本身自带的arguments关键字
//bad 不要这么定义函数 function demo(arguments,name){ ... }
使用逗号,访问属性
var luck={ jedi:true, age:28 } //bad var isJedi=luck['jedi']; // good var isJedi=luck.jedi;
坚持一直使用var来声明变量
坚持使用单var 来声明多个变量
//bad var items=getItems(); var flag=true; var ball='z'; //good var items=getItems(), flag=true, ball='z';
当声明多个变量的时候,把没有赋值的变量放在最后
//bad var i,len, items=getItems(), flag=true; //good var items=getItems(), flag=true, i,len;
变量声明在最顶部,这可以帮我们避免变量hosting的问题
//bad function(){ test(); console.log("logger....."); var name=getName(); if(name==='test'){ return false; } return name; } //good function(){ var name=getName(); test(); console.log("logger...."); if(name==='test'){ return false; } return name; }
现在我们就来看看一些变量置顶解析的问题
function example(){ console.log(temp); // } function example(){ console.log(temp); var temp=true; // undefined } 其实上面的例子,实际代码是这样的,这样就能理解为什么是undefined了。 这里也还需要注意一下,变量声明可以置顶,但是赋值不会置顶。 把代码翻译一下其实就是这样的: function example(){ var temp; console.log(temp); temp=true; } 这个例子就是我们要说的hosting:变量置顶解析,函数声明也存在置顶解析,但是函数表达式不能置顶解析,我们看下面的例子。 function example(){ test(); // test function test(){ console.log('test'); } } function example(){ test(); // var test=function test(){ console.log('test'); } }
使用=== 和 !== 替换 == 和 !=
其他类型的值转boolean(Boolean(ojb))类型规则:
1、Boolean(obj) ==>true
2、Boolean(undefined) ==>false
3、Boolean(null) ==>false
4 Boolean(true)==> true Boolean(false)==>false
5 字符串除‘’为false外,其余均为true :Boolean("str")==>true Boolean('')==>false
6 number类型的除 +0 -0 NaN外,其余均为true
那我们就来看看怎么在代码中活用上面的转换吧
//bad if(name!==''){ .... } //good 我以前就是上面那种写法,看来以后我就可以改用这种写法了 if(name){ .. } //bad if(
多行代码块请使用大括号{ }
//bad if(test) return false; //good if(test)return false; //good if(test){ return false; } //bad function() { return false;} function (){ return false; }
多行注释使用/** ......*/,指出方法 参数和返回值的类型,在注释前,留一个空行