1. 程式人生 > >js權威指南學習筆記(一)類型、值和變量

js權威指南學習筆記(一)類型、值和變量

聲明 for black inf 筆記 提升 under election 對象類型

1、數據類型:原始類型(primitive type) 和對象類型(object type)

原始類型包括數字、字符串和布爾值; 除數字、字符串、布爾值、null(空)、undefined(未定義),其它都屬於對象類型。 也可以分為可變(mutable)類型和不可變(immutable)類型。數字、字符串、布爾值、null和undefined屬於不可變類型。 2、 非數字值用NaN表示,函數isNaN()用於判斷一個值是否是非數字,如果參數是NaN或非數字值,返回true。 函數isFinite()在參數不是NaN、Infinity(無窮大)、-Infinity(負無窮大)的時候返回true。 3、全局對象
包括全局屬性(全局變量屬於全局屬性)、全局函數、構造函數、全局對象。 全局函數如isNaN()、parseInt()等,構造函數如Date()、RegExp()、String(), 全局對象如Mah、JSON。 新頁面加載時將會創建一個新的全局對象,並定義初始屬性,如上。 4、包裝對象 定義:存取字符串、數字或布爾值的屬性時創建的臨時對象稱為包裝對象。 null、undefined沒有包裝對象,訪問它們的屬性會造成一個類型錯誤。 字符串、數字和布爾值可以通過String()、Nmber()和Boolean()構造函數來顯式的創建包裝對象。 一般情況下,比如我們在訪問字符串的屬性時,都是通過 ".
" 操作符來訪問,如下: 2 2 1
console.log("hello world".length);
2
console.log("this a string".indexOf("a"));
其實在調用這些方式或屬性時js內部隱式的為我們創建了一個包裝對象。如下: 2 2 1
console.log(new String("hello world").length);
2
console.log(new String
("this a string").indexOf("a"));
隱式和顯式的區別: 兩者並不相等。如下: 4 4 1
var a1 = "test",
2
   a2=new String("test");
3
console.log(a1 == a2);//true
4
console.log(a1 === a2);//false
隱式創建的包裝對象,在使用完後之後就會被拋棄了,如: 2 2 1
test.a = "hello"; //隱式創建包裝對象,用完即時銷毀
2
console.log(test.a); //undefined  新創建一個包裝對象,未初始化
用處: 有的瀏覽器性能不是很好,比如說低版本IE,當頻繁處理字符串、數字時,效率會很低。
所以有時不如直接顯式創建包裝對象,防止瀏覽器過多地創建隱式的包裝對象,提升性能。 4 4 1
//不推薦使用種方法
2
var example = "this is a example";  
3
//推薦使用這種方法,提升性能。
4
var example2 = new String("this is a example");
5、類型轉換 (1)顯式類型轉換 可以通過Boolean()、Number()、String()或Object()函數。 (2)對象轉換為原始值 所以對象都繼承了toString()和valueOf()兩個轉換方法。 對象到字符串的轉換步驟
  • 如果對象具有toString()方法,則調用這個方法。如果它返回一個原始值,這個值轉換為字符串。
  • 如果對象沒有toString()方法,或者這個方法並不返回一個原始值,那麽javascript會調用valueOf()方法,如果存在這個方法,javascript會調用它,如果它返回一個原始值,這個值轉換為字符串。
  • 否則,javascript無法從toString()或valueOf()獲得一個原始值,因此它將拋出一個類型錯誤異常。
對象到數字的轉換步驟 與對象到字符串轉換做相同的事情,只是它會首先嘗試使用valueOf()方法。 如果將對象和一個原始值比較,則轉換遵循對象到原始值的轉換方式進行。 (3)在做算術運算的時候,如果其中一個操作數是對象,javascript會將對象轉換為原始值,不管得到的原始值是否直接使用,都不會進一步轉換為數字或字符串。 如: 5 5 1
var now = new Date(); 
2
typeof(now + 1); //將日期轉換為字符串 (字符串的拼接)
3
typeof(now - 1); //使用對象到數字的轉換
4
now == now.toString() //true:隱式和顯式的字符串轉換
5
now > (now - 1) //將日期轉換為數字(隱式)
默認情況下,日期對象在轉換為原始值時,會優先使用toString()方法(隱式)。在對日期對象執行加法運算時,要顯式的將日期對象轉換為數字,才能運算。 6、作用域 (1)變量作用域 全局變量擁有全局作用域。 在函數體內,局部變量的優先級高於同名的全局變量。 (2)函數作用域 在函數內聲明的所有變量在函數體內始終是可見的。 (3)屬性變量 使用var聲明一個變量時,創建的這個屬性是不可配置的。無法通過delete運算符刪除。 沒有使用嚴格模式給一個未聲明的變量賦值,javascript會自動創建一個全局變量,這種方式創建的變量是可配置屬性,可以刪除它們: 6 1
var trueval = 1; //聲明一個全局變量
2
fakeval = 2; //創建一個全局變量
3
this.fackval2 = 3; //同上
4
delete trueval //false 變量沒有被刪除
5
delete fakeval //true 變量被刪除
6
delete this.fackval2 //true 變量被刪除

js權威指南學習筆記(一)類型、值和變量