JavaScript中存在問題但卻難以避免的功能特性
一,全局變量1.全局變量可以被任何部分在任意時間改變,復雜化,降低可靠性
2.可能與子程序變量名相同,沖突可能導致程序無法運行,難以調試
三種聲明全局變量模式
1.脫離任何函數的var foo = value
2.直接添加屬性至全局對象,全局對象是所有全局變量的容器,在web瀏覽器中全局對象名為window,window.foo = value
3.直接未經聲明的變量 - 隱式的全局變量 foo = value
二,沒有塊作用域,有函數作用域
函數中定義的參數和變量在函數外部不可見,而在一個函數中任何位置的定義的變量在該函數的任何地方可見。
function f1(){
var a=1;
function f2(){
if(false){
var a=2; //變量基于函數,而非基于語句塊,沒有塊作用域
}
console.log(a); //undefined 未定義
}
f2();
console.log(a);//1
}
f1();
大多數語言中,一般聲明變量都是在第一次用到它的地方,在javascript中是一個壞習慣,因為沒有塊作用域,更好的是在每個函數開頭聲明所有變量。
三,return語句返回一個值,值表達式必須和return在同一行上
return {
status:true
};
返回包含status成員元素的對象。
如果用
return
{
status:true
};
會返回undefined。
四,保留字不能用來命名變量或函數,當保留字被用作對象字面量的鍵值時,必須用引號,而且不能用點表示法,必須使用括號表示法。
var object = {case:value}; //非法
var object = {'case':value}; //ok
object.case = value; //非法
object['case'] = value; //ok
各瀏覽器對保留字使用限制上實現不同,以上語法在FF中合法,但其他瀏覽器不合法;再有不同的保留字行為也不相同。類似int/long/float等保留字在各瀏覽器中都可以做變量名及對象字面量的鍵值。但不建議使用任何保留字。
五,typeof - 識別運算數類型的字符串
但typeof null返回'object',更好的檢測null的方法: my_value === null
對于正則表達式 typeof /a/,一些瀏覽器返回'object',另一些返回'function'
六,parseInt - 將字符串轉換為整數
1.此函數遇到非數字時就停止解析,即parseInt('16')和parseInt('16 abc')產生結果相同,都是16.
2.如果字符串第一個字符是0,則基于八進制解析,而不是十進制。八進制中沒有8,9數字,所以parseInt('08')和parseInt('09')結果為0。此函數可以接收一個基數作為參數,parseInt('08',10)結果為8。
七,浮點數
0.1+0.2不等于0.3
八,NaN
function isNumber(value){
return typeof value === 'number' && isFinite(value);
}
isFinite篩調NaN和Infinity,但是isFinite會試圖把它的運算數轉換為一個數字,如果運算數事實上不是一個數字,就會報錯,所以加上typeof value === 'number'。
九,假值
0,NaN,'',false,null,undefined全部等于假,但它們是不可互換的。