1.将undefined看成没有值
产生undefined的情况:
①未赋值的变量的初始值为undefined。
var x ;
X ; //undefined
②访问对象中不存在的属性也会产生undefined。
var obj = {} ;
obj.x ; //undefined
③函数体结尾使用未带参数的return语句,或未使用return语句都会产生undefined。
function f(){
return ;
}
function g(){};
f(); //undefined
g(); //undefined
④未给函数参数提供实参则该函数参数值为undefined。
function f(x){
return x ;
}
f(); //undefined
2.接收关键字参数的选项对象
一个函数起初很简单,然而一段时间后,随着库功能的扩展,该函数的签名会获得越来越多的参数。尝试理解下面的函数调用:
Var alert = new alert(100,75,300,200,
”error”,message,
”blue”,”white”)
幸运的是,JavaScript提供了一个简单的、轻量的惯用法:选项对象。选项对象在应对较大规模的函数签名时运作良好。
var alert = new alert({
x : 100 , y : 75 ,
width : 300 , height : 200 ,
title : “error”, messagr : message ,
titleColor : “blue”, bgColor : “white”
})
选项对象的好处是易于阅读,所有参数都是可选的,调用者可以提供任一可选参数的子集。
extend函数
function extend(target , source){
if(source){
for(var key in source){
var val = source[key];
if(typeof val !== ‘undefined’){
target[key] = val ;
}
}
}
return target ;
}
3.区分数组对象和类数组对象
①API绝不应该重载与其他类型有重叠的类型
②当重载一个结构类型与其他类型时,先测试其他类型。
③当重载其他对象类型时,接收真数组而不是类数组对象。
4.支持方法链
无状态的API的部分能力是将复杂操作分解为更小的操作的灵活性。一个很好的例子是字符串的replace方法。
在无状态方法中返回新对象来支持方法链:
var users = records.map(function(record){
return record.username ;
})
.filter(function(username){
return !!username ;
})
.map(function(username){
return username.toLowerCase() ;
}) ;
有状态的API的方法链有时被称为流畅式。如果更新方法没返回this,那么API的使用者不得不每次重复该对象的名称。例如:
$(“#notification”)
.html(“Server not responding.”)
.removeClass(“info”)
.addClass(“error”) ;