Day 02---變量和數據類型

一、數據類型

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進制表示的。

  1. 整數: 對整數來說,還可以使用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。 并不會出現錯誤
  1. 浮點數: ** 所謂浮點數值,就是該數值中必須包含一個小數點,并且小數點后面必須至少有一位數字。浮點數直接量一般有兩種寫法:直接帶小數點的使用科學計數法。**
var f1 = 3.14;   // 帶小數點的直接量寫法
var f2 = 3.158899e5; //科學計數法:  表示 3.158899 * 10^5
  1. **無窮大(Infinity): ** ECMAScript并不能儲存所有的數,所以能表示的數有個范圍。所能表示的數最大值和最小值都保存在Number這個內置對象中(后面會詳細介紹什么是對象。)
alert(Number.MAX_VALUE);
alert(Number.MIN_VALUE);
//如果數值超出了最大值和最小值,則用Infinity和-Infinity表示。
alert(1.1 / 0); //彈出:Infinity
alert(-1.1 / 0);    //彈出:-Infinity
  1. **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

  1. Null 類型是第二個只有一個值的數據類型,這個特殊的值是 null ( n是小寫)。從邏輯角度來看, null 值表

示一個空對象指針。

  1. 值 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 算術運算符

+、-、*、/、%。

這幾個運算符都需要兩個數據參與運算。

  1. + 運算符:運算規則
  • 如果兩個都是Number則,則就按照普通的數學加法運算。
  • 如果有一個是字符串,就按照字符串的串聯的方式連接。(如果另外一個不是字符串,則先轉換成字符串再連)。
  • 如果有一個是NaN,則結果就是NaN。
  • 如果同時是Infinity或-Infinity,則結果就是Infinity或-Infinity。
  • 如果一個是Infinity另外一個是-Infinity,則結果為NaN。
  1. - 運算符:運算符規則
  • 如果兩個都是Number則,則就按照普通的數學減法運算。
  • 如果有一個操作數是字符串、布爾值、null 或undefined,則先在后臺調用Number()轉型函數將其轉換為數值,然后再根據正常減法計算。如果轉換的結果有一個是NaN,則減法的結果就是NaN
  • 如果有一個操作數是對象,則調用對象的valueOf()方法以取得表示該對象的數值。如果得到的值是NaN,則減法的結果就是NaN。如果對象沒有valueOf()方法,則調用其toString()方法并將得到的字符串轉換為數值(了解)
  1. * 運算符:運算符規則。
  • 運算規則同減法。
  1. / 運算符:運算規則
  • 就是普通的除法運算,運算規則同 *
  1. %運算符:運算規則
  • 求余(求模)運算。
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的操作,并把+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的操作,并把-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 邏輯運算符

只有三種邏輯運算符:&&、||、! 。而且 && 和|| 都是短路的形式。 注意:不像其他語言有非短路的&、|,也沒有^(異或)

  1. 邏輯非 ! 。注意:這個是運算符只需要一個數據參與運算。不管參與運算的 是什么數據,最終結果一定是Boolean值.邏輯非的運算邏輯是,不管什么類型,先轉換成Boolean值,再取反得到最終的結果。 取反的意思就是true變false,false變true
alert(!Null);  //true。  因為null會轉為fasle,所以取反之后變為true
alert(!0);  // true
  1. 邏輯與 && 。 只要有一個是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
  1. 邏輯或 || 。 ==只要有一個是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種:

  1. "undefined" ——如果這個值未聲明,或者聲明了但沒有賦值
  2. "boolean" ——如果這個值是布爾值;
  3. "string" ——如果這個值是字符串;
  4. "number" ——如果這個值是數值;
  5. "object" ——如果這個值是對象或 null ;
  6. "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 運算符的優先級

運算符的優先級見下表。從上向下,優先級越來越低。

注意:優先級不用刻意去記,當把我不準優先級的時候,就添加()就可以了。理論上,在一個表達式中括號是沒有任何的限制的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 表達式 表達式是由數字、運算符、數字分組符號(如括號)、自由變量和約束變量等以能求得數值的有意義排列方法所得的組合...
    劼哥stone閱讀 588評論 0 4
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創建并操作數組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,270評論 0 4
  • 什么是 JavaScript 語言? JavaScript 是一種輕量級的腳本語言。所謂“腳本語言”(script...
    oWSQo閱讀 1,818評論 0 1
  • 某年某月的某一天,一些事情就此定格。也許回首時,都感覺沒必要用文字來記錄。就是瑣碎的、平常的、蒼白的點點滴滴,就是...
    挪威的森林126閱讀 242評論 0 0
  • 1. 概述 數據請采用我的另一篇文章《我的SQL學習》中的數據。環境MySQL5.7,workbench。 2. ...
    云間書吏閱讀 365評論 0 2