目录
类型(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
对象(Objects)
1 推荐使用对象字面量的方式来创建对象
//不推荐的方式
var obj=new Object();
//推荐的方式
var obj={};
2 不要使用保留字作为对象的key
//不好的是使用方式
var man={
class:'super',
};
// 好的使用方式
var man={
klass:'super',
defaults:{clack:'kent'},
hidden:true
};
数组(Arrays)
(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;
}
注释
多行注释使用/** ......*/,指出方法 参数和返回值的类型,在注释前,留一个空行