一、數據類型
JavaScript的數據類型共分兩類:簡單數據類型 (也稱原始數據類型或基本數據類型)和復雜數據類型(也稱引用數據類型或對象類型)。
2.1 簡單數據類型
簡單數據類型共分5種:Number、Boolean、String、Null、Undefined (ECMAScript6新增:Symbol)
數據類型 | 數據值 | 說明 |
---|---|---|
Undefined | undefined | 當聲明一個變量但是并沒有賦值時,變量的類型是Undefine類型 |
Null | null | 對象指針為空 |
Boolean | true false | true\false兩個值都必須小寫 |
Number | 10 3.14 3. .5 整數與浮點數 | NaN ---- not a number本應該返回數值型數據的函數,如果返回的值不是數值型測返回NaN isNaN()---不是數字返回true 是數字返回false |
String | “Hello” ‘Hello’ “a” ’a’ | 字符串 |
Object | 對象 | 對象 |
2.1.1 Number類型
數值類型共分4種值:整數、浮點數、無窮大、NaN。
對數值來說,最常見的數值字面量是10進制。比如:20, 30, 5.5 這些值都是用10進制表示的。
- 整數: 對整數來說,還可以使用8進制和16進制的整數來表示。8進制的范圍是(0-7), 16進制的范圍是(0-F)。例如:
var num = 25; // 10進制的25
alert(num); //彈出:25
var num1 = 025; // 8進制用0開始。表示一個8進制的25。
alert(num1); // 彈出:21 注意:彈出顯示的時候,總是用10進制的形式。
var num2 = 0x25; // 0x開始表示這個數是16進制。這是個16進制中的25。 注意:這里的x可以大寫X也可以小寫x
alert(num2); //彈出:37
var num3 = 0XAF;
alert(num3); //彈出:175
注意:如果8進制數字超出了進制范圍(比如出現8、9),則自動忽略前導0,把這個數字作為十進制的數字類處理。例如:
var num4 = 089;
alert(num4); //彈出:89。 并不會出現錯誤
- 浮點數: ** 所謂浮點數值,就是該數值中必須包含一個小數點,并且小數點后面必須至少有一位數字。浮點數直接量一般有兩種寫法:直接帶小數點的和使用科學計數法。**
var f1 = 3.14; // 帶小數點的直接量寫法
var f2 = 3.158899e5; //科學計數法: 表示 3.158899 * 10^5
- **無窮大(Infinity): ** ECMAScript并不能儲存所有的數,所以能表示的數有個范圍。所能表示的數最大值和最小值都保存在Number這個內置對象中(后面會詳細介紹什么是對象。)
alert(Number.MAX_VALUE);
alert(Number.MIN_VALUE);
//如果數值超出了最大值和最小值,則用Infinity和-Infinity表示。
alert(1.1 / 0); //彈出:Infinity
alert(-1.1 / 0); //彈出:-Infinity
- **NaN( not a number 不是個數): ** 表示不是一個數字,當0/0 的時候不是無窮大,而是NaN。或者把一個非數字形式的字符串轉換成數字時都會返回NaN。例如:
alert(0 / 0); //彈出:NaN
alert(parseInt("60")); //彈出:60 說明:parseInt("");可以把字符串形式的數字轉換成Number
alert(parseInt("a")); //彈出:NaN
//注意:NaN是個非常特別的東東。因為即使他自己和自己都不相等。
var v = 0 / 0;
alert(v == v); //彈出false
alert(v != v); //彈出true。 所以:可以通過這種方式來判斷這個數是否為NaN
/*
另外:isNaN()函數如果 x 是特殊的非數字值 NaN(或者能被轉換為這樣的值),返回的值就是 true。如果 x 是其他值,
則 返回 false。
*/
alert(isNaN(3));//返回false
alert(isNaN("3")); //返回false
alert(isNaN("blue"));//返回true
alert(isNaN(true));//返回false . true可以轉換成數字1
alert(isNaN(null));//返回false null可以轉換為數字0
alert(isNaN(undefined));//返回true
2.1.2 Boolean類型
Boolean類型的值是程序中用的很多的一種類型。它只有兩個值:true和false。true表示邏輯上的對/正確,false表示邏輯上的錯。
2.1.3 String類型
String指的是用 ""(雙引號) 或 ''(單引號) 括起來的字符序列。字符序列可以由0個或多個字符組成。
例如:”123” “a” ‘name’ ‘blue’ ’nihao’ ’xiaohong‘ ”nihao”。說明:
1、單引號或雙引號要匹配,不能一邊用雙引號,一邊用單引號 ,左右符號要匹配。
2、JavaScript統一每個字符使用Unitcode碼來進行編碼,每個字符占16位(2個字節)。
3. 在其他語言中多用單引號表示一個字符,雙引號表示字節。但是對JavaScript來說,不存在字符類型的數據。
4. 有些字符不可見或有特殊意義,比如換行符,制表符, 雙引號等,則 JavaScript 提供了相應的轉意字符,來表示這些不可見字符。見下表:
代碼 | 輸出 |
---|---|
' | 單引號 |
" | 雙引號 |
& | 和號 |
\\ | 反斜杠 |
\n | 換行符 |
\r | 回車符 |
\t | 制表符 |
\b | 退格符 |
\f | 換頁符 |
2.1.4 Undefined
Undefined 類型只有一個值,即特殊的 undefined 。在使用 var 聲明變量但未對其加以初始化時,
這個變量的值就是 undefined ,例如:
var v;
alert(v); //彈出:undefined。 變量v聲明但是沒有賦值初始化,則為undefined
alert(m); //m沒有定義,直接使用會發生錯誤。
2.1.5 Null
- Null 類型是第二個只有一個值的數據類型,這個特殊的值是 null ( n是小寫)。從邏輯角度來看, null 值表
示一個空對象指針。
- 值 undefined 實際上是從值 null 派生來的,因此 ECMAScript 把它們定義為相等的。
說明:
盡管這兩個值相等,但它們的含義不同。
undefined 是聲明了變量但未對其初始化時賦予該變量的值,null 則用于表示尚未存在的對象。
如果函數或方法要返回的是對象,那么找不到該對象時,返回的通常是null。
alert(null == undefined); // 彈出: true。 待講完面向對象在來理解會更加清晰。大家目前只需要了解即可。
2.2 復雜數據類型
復雜數據類型又稱之為引用數據類型。主要包括三種:對象(object)、函數(function)和數組(array)。
不過,從本質來看,這三種都屬于對象。
關于復雜數據類型,我們在面向對象部分重點詳細介紹。
二、數據類型轉換
數據類型轉換有兩種轉換:自動轉換和強制轉換。
1. 自動類型轉換:
在解釋執行的過程中,會根據需要進行相應的自動類型轉換。比如:需要一個Boolean類型的值,而現在是一個字符串,則會根據相應的規則把字符串自動轉換為Boolean值。
1、轉換成布爾類型
undefined —> false
null —> false
數值 0,0.0,NaN —> false 其他數值—> true
字符串 ""—>false "etef" —> true
其他對象—> true
總結:存在的東東,轉換成true, 不存在的東東轉換成flase
2、轉換成數值類型
undefined —> NaN
null —> 0
字符串——>數值—> "34234"—>34234, "324sdfs3423" —> NaN, "" —> 0
布爾類型——>數值 true->1 false->0
總結:能轉成數字的就轉成對應的數字。不能轉成數字的要么0或1要么NaN
3、轉換成字符串類型
undefined —>"undefined"
null —>"null"
布爾類型 true —>”true” false —>"false"
數值類型轉成字符串 12321 —>"12321" NaN —>"NaN"
總結:字面值是什么就轉成什么
2. 強制類型轉換。
//1、其他類型轉成成字符串。
var a = 10;
alert(a + ""); // 直接和一個長度為0的空字符鏈接
alert(a.toString()); //調用這個變量的toString()方法
alert(String(a)); //使用String轉型函數
//2、字符串轉數字。
var s = "123";
alert(parseInt(s));
alert(parseFloat(s));
/*
注意:使用parseXxx轉換
1、轉換為數字的時候,會忽略前面的空格
2、如果是數組開頭然后是字母,則會只轉前面的數字
3、如果是是字母開頭則返回NaN
4、在使用parseInt的時候,可以傳入第二個參數,表示這個數的進制,然后就轉換成對應的10進制數返回。
*/
alert(parseInt(" 12")); //忽略前面的空白字符
alert(ParseInt("12ab3"); //彈出:12. 從字母后面的統統忽略掉
alert(parseInt("a123")); // 彈出:NaN
//3、使用轉型函數互轉(暫時先了解) var為一個變量或常量都可以
String(var);//其他類型轉字符串
Number(var); //其他類型轉數字
Boolean(var); // 其他類型轉布爾
三、表達式和運算符
3.1 表達式
表達式是用于JavaScript腳本運行時進行計算的式子,可以包含常量、變量、運算符。表達式可以任意復雜。 表達式的值就是經過一系列運算之后的最終值。
var n = 10;
var m = 30;
alert(n + m); // n+m就是一個表達式。
3.2 運算符
運算符也叫操作符。作用是去操作數據值,然后進行各種計算。ECMAScript 操作符的與眾不同之處在于,它們能夠適用于很多值,例如字符串、數字值、布爾值,甚至對象。(不過,在應用于對象時,相應的操作符通常都會調用對象的 valueOf()和(或) toString() 方法,以便取得可以操作的值。 暫時了解 )
3.2.1 算術運算符
+、-、*、/、%。
這幾個運算符都需要兩個數據參與運算。
- + 運算符:運算規則
- 如果兩個都是Number則,則就按照普通的數學加法運算。
- 如果有一個是字符串,就按照字符串的串聯的方式連接。(如果另外一個不是字符串,則先轉換成字符串再連)。
- 如果有一個是NaN,則結果就是NaN。
- 如果同時是Infinity或-Infinity,則結果就是Infinity或-Infinity。
- 如果一個是Infinity另外一個是-Infinity,則結果為NaN。
- - 運算符:運算符規則
- 如果兩個都是Number則,則就按照普通的數學減法運算。
- 如果有一個操作數是字符串、布爾值、null 或undefined,則先在后臺調用Number()轉型函數將其轉換為數值,然后再根據正常減法計算。如果轉換的結果有一個是NaN,則減法的結果就是NaN
- 如果有一個操作數是對象,則調用對象的valueOf()方法以取得表示該對象的數值。如果得到的值是NaN,則減法的結果就是NaN。如果對象沒有valueOf()方法,則調用其toString()方法并將得到的字符串轉換為數值(了解)
- * 運算符:運算符規則。
- 運算規則同減法。
- / 運算符:運算規則
- 就是普通的除法運算,運算規則同 *
- %運算符:運算規則
- 求余(求模)運算。
var v = 10 % 2; // 余0
alert(10 % 3); // 結果 : 1
alert(-10 % 3); // 結果: -1 說明:求余的時候,符號與被除數保持一致。
alert(10 % -3); // 結果: 1
alert(1 % 0.3); // 結果:0.1
3.2.2 一元運算符
- ++自增操作: 對要操作的變量進行+1的操作,并把+1之后的結果重寫賦值給這個變量。可以在變量前也可以在變量后。任何變量都可以使用,但是對非Number類型的變量操作的時候,需要先按照前面的規則轉換成Number然后再自增1.
var a = 10;
var b = a++; //把a的值自增1,a的值變為11. 注意:a++表達式的值,仍然是a自增之前的值,所以b的值是是10
var c = 10;
var d = ++a; //把a的值自增1,a的值變為11. 注意:++a表達式的值,是a自增之后的值,所以d的值是11
var m = "123";
m++; //先把m使new Number(m)之后再轉換進行自增的操作。
- --自減操作: 對要操作的變量進行減1的操作,并把-1之后的結果重新賦值給這個變量。 計算方法同++。
var a = 10;
var b = a--; //把a的值自減1,a的值變為9. 注意:a--表達式的值,仍然是a自減之前的值,所以b的值是是10
var c = 10;
var d = --a; //把a的值自減1,a的值變為9. 注意:--a表達式的值,是a自減之后的值,所以d的值是9
var m = "123";
m--; //先把m使用轉型函數Number(m)之后再轉換進行自減的操作。
3.2.3 賦值運算符和復合賦值運算符
=、+=、-=、*=、/=、%=
使用賦值操作符的注意目的是簡化表達式的書寫,并不會帶來任何的性能的提升。
var n = 10;
n += 4; //等價于 n = n + 4; 運算結束后n的值為14
var m = "6";
m -= 5; // 會先把m轉換成數字之后(m = new Number(m)),再執行 m = m - 5;
3.2.4 比較運算符
>、>=、<、<=、==、===、 !=、!==
比較運算符是對運算符的坐標和右邊的兩個數據進行比較。
- 如果兩個都是數字,就是普通的數字比較。
- 如果有一個是數字,就把另外一個不是數字的使用new Number(var)的方式轉換為數字再比較
- 如果兩個都是字符串,則比較的是字符串中的字符在字母表中的順序。(或者說比較是他們的編碼值)
- 如果有一個是NaN,則結果一定是false。==但是有一種情況,如果比較特殊NaN != NaN則是true。==
==== 和 != 是判斷兩個操作數是否相等。規則:==
- 如果兩個都是簡單類型中的Number類型,直接判斷數值是否相等。
alert(10 == 10.0); // true
- 如果有一個NaN參與比較,則總是不等的。
- null和undefined之間是相等
- 如果有一個操作數是布爾值,則在比較相等性之前先將其轉換為數值—— false 轉換為 0,而
true 轉換為 1; - 如果一個字符串與數值比較,則把字符串轉換成數值之后再比較
- 如果一個對象和一個基本類型比較,則調用對象的valueOf方法,轉變成基本類型之后再比較(暫時先了解)
- 如果連個對象比較,則比較兩個對象是否為同一個對象。是就相同,不是就不同。(暫時先了解)
alert(NaN == false); // fasle
alert(NaN == true); // false
alert(NaN == 1); //false;
alert(NaN == NaN); // fasle
alert(NaN != NaN); // true
alert(null == null); // true
alert(null == undefined); // true
alert(undefined == undefined); // true
alert("1" == 1); //true
alert("1a" == 1); //false “1a"會被轉換為NaN
alert(1 == true); //true 會把true轉成1之后再比較
alert(0 == null); //false null與任何的非null的都不相等
===== !== 全等判斷==
全等在轉換前不做任何的轉換,如果兩個一樣就相等,否則就不等。
alert("1" === 1); //false 一個string類型,一個number類型,所以不等
alert(null === undefined); // false
alert("abc" === "abc"); // true
3.2.5 邏輯運算符
只有三種邏輯運算符:&&、||、! 。而且 && 和|| 都是短路的形式。 注意:不像其他語言有非短路的&、|,也沒有^(異或)
- 邏輯非 ! 。注意:這個是運算符只需要一個數據參與運算。不管參與運算的 是什么數據,最終結果一定是Boolean值.邏輯非的運算邏輯是,不管什么類型,先轉換成Boolean值,再取反得到最終的結果。 取反的意思就是true變false,false變true
alert(!Null); //true。 因為null會轉為fasle,所以取反之后變為true
alert(!0); // true
- 邏輯與 && 。 只要有一個是false,則返回false。(只有兩個都是true的情況下才返回true)。 ==邏輯與&&的結果不一定是Boolean值 以下為特殊情況:==
- 有短路的特點:如果 第一個 是false或者可以轉換成false,則 結果就是第一個 。
- 如果 第一個 是true或者可以轉換成true,則 結果就是第二個 。
var a = 10;
alert(false && a++); //第一個操作數是false,所以最終結果是false。由于短路的關系,所以不會再去計算第二個表達式。
alert(a); // 結果:10
var b = 20;
alert(null && b++); // 第一個操作數是null,結果為null,且不會再去判斷第二個。
alert(b); // 結果:20
var c = 30;
alert(new Number(5) && c++); //結果 30.第一個操作數是對象,所以直接返回第二個操作數。
alert(c); //結果:31
- 邏輯或 || 。 ==只要有一個是true,結果就是true。== 與邏輯與一樣,結果也不一定是Boolean值。特殊情況如下:
- 也有短路的特點:如果 第一個 是true或者能轉換成true,則直接返回第一個,不再去判斷第二個
- 如果 第一個 是false或可以轉換成false,則直接返回第二個。
var a = 10;
alert(true || a++); // 結果true,且不會計算第二個表達式
var b = 20;
alert(new Number(5) || b++); //結果為第一個(5),且不會計算第二個。
var c = 30;
alert(null || c++); //結果為30
3.2.6 三元運算符(條件運算符)
三元運算符的意思是指,需要三個操作數參與運算。
語法:邏輯值(表達式) ? 表達式1 : 表達式2
結果:如果邏輯值是true,則最終返回表達式1的值,如果邏輯值是false,則最終結果返回表達式2的值。
==注意:如果邏輯值不是Boolean值,則先按照轉型函數Boolean()的方式轉變成Boolean,再進行計算==
var a = 0 ? 1 : 2; //結果是2
var b = null ? 1 : 2; //結果是2
var c = "a" ? 1 : 2; //結果是1
3.2.7 typeof操作符
typeof 操作符用來檢測給定的變量的類型。
語法: typeof 變量;
注意:typeof是一個操作符,而不是方法,所以typeof后面的操作數完全不需要添加括號。
var a = "abc";
alert(typeof a); //彈出:string 注意:s是小寫
typeof操作符的計算結果只有一下6種:
- "undefined" ——如果這個值未聲明,或者聲明了但沒有賦值
- "boolean" ——如果這個值是布爾值;
- "string" ——如果這個值是字符串;
- "number" ——如果這個值是數值;
- "object" ——如果這個值是對象或 null ;
- "function" ——如果這個值是函數。
var a;
alert(typeof a); // undefined
alert(typeof b); // undefined
alert(null); //object
alert("abc"); //string
alert(new Object()); //object
alert(new String()); // object
3.2.8 逗號運算符
- 使用逗號操作符可以在一條語句中執行多個操作。
- 逗號操作符還可以用于賦值。在用于賦值時,逗號操作符總會返回表達式中的最后一項
//var a, b, c, d; //使用逗號操作符同時聲明了4個變量。
var a = (1, 2, 3, 4); // a= 4. 逗號操作符返回最后一個值。
alert(a); //彈出: 4
3.3 運算符的優先級
運算符的優先級見下表。從上向下,優先級越來越低。
注意:優先級不用刻意去記,當把我不準優先級的時候,就添加()就可以了。理論上,在一個表達式中括號是沒有任何的限制的。