1、數據類型:原始類型(primitive type) 和對象類型(object type) 原始類型包括數字、字元串和布爾值; 除數字、字元串、布爾值、null(空)、undefined(未定義),其它都屬於對象類型。 也可以分為可變(mutable)類型和不可變(immutable)類型。數字、 ...
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 1console.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()獲得一個原始值,因此它將拋出一個類型錯誤異常。
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 變數被刪除