JS高階程式設計第3章--精簡版

X1aoYE發表於2019-07-12

前言:純手打!!!按照自己思路重寫!!!這次是二刷了,想暑假做一次完整的筆記,但用本子來寫筆記的話太貴了,可能哪天還丟了。。所以還是部落格好==


 第三章:基本概念(語法、資料型別、流控制語句、函式)


3.1 語法:

  ECMAScript的語法大量借鑑了C及其他語言。

3.1.1 區分大小寫

3.1.2 識別符號:

  指的是變數、函式、屬性的名字、函式的引數。注意:首字元必須是一個字母、下劃線、或者美元$符號。

  ES識別符號采用駝峰大小寫格式(首字母小寫,其他單詞的首字母大寫,如:setData),不可以把關鍵字、保留字、true、false、null作為識別符號。

3.1.3 註釋:

  單行註釋: //

  塊級註釋: /* *內容 */

3.1.4 嚴格模式:對某些不安全的操作丟擲錯誤

  在指令碼中啟動嚴格模式,可以在其頂部寫一行程式碼:"use strict"

3.1.5 語句:

  以分號結尾,其實也可以不寫,但最好寫。。。

3.2 關鍵字和保留字:(這些都不可以作為識別符號)

  關鍵字大致為:  break、else、new、var、 case、  finally 、 return、 void 、 catch  、for  、switch 、 while 、 continue、  function  、this 、 with 、default 、 if 、 throw 、 delete 、 in 、  try 、do 、 instranceof、  typeof。。。

  保留字大致位: abstract 、 enum   、int 、 short 、 boolean  、export  、interface、  static、  byte  、extends 、 long 、 super 、 char 、 final  、native  、synchronized 、 class  、float 、 package  、throws 、 const  、goto  、private 、transient 、 debugger 、 implements  、protected 、 volatile 、 double  、import  、public、class、entends、super、const、export、import、let、public。。。、

3.3 變數:

  • var message;   即定義一個變數,該變數成為該變數作用域中的區域性變數,此變數未初始化,會儲存一個值----undefined、
  • var message = "hi";
  • message = "hi";   全域性變數

3.4 資料型別:

  • 五種簡單資料型別(即基本資料型別):Undefined、Null、Boolean、Number、String
  • 一種複雜資料型別:Object

3.4.1 typeof操作符:

  檢測給定變數的資料型別——typeof

  • “undefined”——如果這個值未定義;
  • “boolean”——如果這個值是布林值;
  • “string"——如果這個值是字串;
  • ”number“——如果這個值是數值;
  • ”object”——如果這個值是物件或者null;
  • “function"——如果這個值是函式!!!雖然函式是物件,但可以通過typeof區分是不是函式。

  如:var message = "some string";

    alert(type of message);  //"string"

    alert(type of null);  //”object"

3.4.2 Underfined型別:

      var message; var message1 = undefined; var age

   alert(message == undefined);  //true

   alert(message);  //undefined

      alert(age);  //產生錯誤

      alert(message1 == underfined);  //true

3.4.3 Null型別:

   null值表示一個空物件指標,所以用typeof檢測會返回“object”。

   var car = null;

   alert(typeof car);  //"object"

   !!!注意 undefined值是派生自null值的,所以 alert(null == undefined);  //true

3.4.4 Boolean型別:

  該型別只有兩個字面值:true和false。

資料型別

轉換為true的值

轉換為false的值

Boolean

true

false

String

任何非空字串

" "(空字串)

Number

任何非0數字值(包括無窮大)

0和NaN

Object

任何物件

null

Undefined

n/a(不適用)

undefined

  這些轉換規則對理解流控制語句(如if語句)自動執行相應的Boolean轉換非常重要:

  var mesage = "Hello World";

  if (message) {  // 這個message自動轉換了對應的Boolean值——ture

    alert("Value is true");

  }

3.4.5 Number型別:

  數值字面量格式:(在進行算術計算時,所有八進位制和十六進位制表示的數值最終都將被轉換成十進位制數值)

  • 十進位制整數:var intNum = 55;
  • 八進位制:(嚴格模式下無效)第一位是0,然後是八進位制數字序列(0~7),若超過7,則第一位的0被忽略,

   後面的數值被當作十進位制來看,var octalNum1 = 070;  //八進位制的56          var octalNum2 = 079;  //無效的八進位制,解析為79

  • 十六進位制:前2位必須是0x,後跟任何十六進位制數字(0~9及A~F 字母可大小寫)
  浮點數值: 簡單的不說,說說 var floatNum = 3.125e7;  //等於31250000,即3.125乘以10的七次方。
  0.1 + 0.2 結果不是0.3,而是0.30000000000000004,所以在進行算術計算時其精確度遠遠不如整數,所以最好不要做以下測試:
  if (a + b == 0.3) {
    alert ("You got 0.3" );
  }
  
  數值範圍:有規定最大最小值,若超出,則轉換成負無窮(-Infinity),正無窮(Infinity)。
  
  NaN:即非數值,它是一個特殊的數值。表示一個本來要返回數值的運算元未返回數值的情況(這樣子就不會丟擲錯誤)
     任何涉及NaN的操作都會返回NaN,NaN與任何值都不相等,包括NaN本身。 alert (NaN == NaN);  //false
     !!!所以ES定義了 isNaN() 函式,這個函式接受一個任何型別的引數,函式可以幫我們確定這個引數是否“不是數值”,某些不是數值的值會被自動直接地轉換為數值。
     alert (isNaN(NaN));  //true,表示這個不是數值
     alert (isNaN(10));  //false,表示10是數值
        alert (isNaN(“10”));  //false,表示可以被轉換成數值10
     alert (isNaN(“blue"));  //true,表示這個不能轉換成數值
     alert (isNaN(true));  //false,表示可以轉換成數值1
 
  數值轉換:有三個函式可以把非數值轉換成數值
 

  Number() 可以用於任何資料型別,轉型函式將其轉換為數值。

    • var num1 = Number(”Hello Wordl“);  //NaN,即字串中若包含除了數字的字元,則將其轉換為NaN
    • var num2 = Number(” “);        //0
    • var num3 = Number(”000011“);        //11,前面的0被忽略
    • var num4 = Number(true);   //1
    • var num5 = Number(null);  //0
    • var num6 = Number(undefined);  //NaN
    • 如果是物件,則呼叫物件的valueOf()方法,然後依照前面的規則轉換返回的值。若轉換的結果是NaN,則呼叫物件的toString()方法,然後再次依照前面的規則轉換返回的字串。

  parseInt():處理整數的時候常用:

    • var num1 = parseInt(”1234blue“);  //1234,忽略blue
    • var num2 = parseInt(” “);        //NaN,和Number()不同,因為parseInt()會拼命找第一個非空格字元。
    • var num3 = parseInt(”0xA“, 16);        //10(十六進位制數轉十進位制)
    • var num4 = parseInt(22.5);   //22
    • var num5 = parseInt(”070“ ,8);  //56(八進位制數轉十進位制)
    • var num6 = parseInt(”70“ ,10);  //70

  parseFloat() :與parseInt()的相似與區別是  都是從第一個字元開始解析,只認識一個小數點,會忽略一開始的0,只識別十進位制,而十六進位制的字串會被轉換為0

    • var num1 = parseFloat(”1234blue“);  //1234
    • var num2 = parseFloat(”0xA“);  //0,不認識十六進位制~
    • var num3 = parseFloat(”22.4.33“);  //22.4
    • var num4 = parseFloat(”0202.4“);  //202.4
    • var num5 = parseFloat(”3.125e7“);  //31250000

 

3.4.6 string型別:即字串

  可以由雙引號和單引號表示。

  • String資料型別包含一些特殊的字元字面量(轉義序列),用於表示非列印字元。常用的有:

  \n 表示換行,\t 表示製表,\b表示退格,\r表示回車,\\表示斜槓,\'表示單引號,\"表示雙引號,\xnn表示以十六機制程式碼nn表示的一個字元(n為0~F),\unnnn表示以十六進位制程式碼nnnn表示的一個Unicode字元(n為0~F)。

  !!!注意,n個字元長的轉移序列只表示一個字元(在length裡表示1)

  • 將一個值轉換為字串:有兩種方法
    • toString()方法:返回相應值的字串表現,相應值可以是數值、布林值、物件和字串值(返回字串的一個副本)!但null和undefined值沒有這個方法。

        可傳參也可以不傳參,參數列示以n進位制格式(基數)返回數值,預設不填為十進位制。

      var num = 10;

      alert (num.toString());  // "10"

      alert (num.toString(2));  // "1010"

      alert (num.toString(8));  // "12"

      alert (num.toString(10));  // "10"

      alert (num.toString(16));  // "a"

    • String()轉型函式:在不知道要轉換的值是不是null或undefined時可以使用。這個函式可以將任何型別的值轉換為字串!
      • 如果值有toString() 方法,則呼叫該方法並返回相應的結果。
      • var value1 = true;  alert(String(value1));  // “true" ,一個副本
      • var value2 = null;   alert(String(value2));  // "null" ,因為null沒有toString()方法所以String()函式就返回了這個值的字面量"null"。
      • var value3;  alert(String(value3));  // ”undefined“ ,因為undefined沒有toString()方法所以String()函式就返回了這個值的字面量”undefined“。

3.4.7 Object型別:就是物件!即一組資料和功能的集合。

  物件可以通過執行new操作符後跟要建立的物件型別的名稱來建立,即 var o = new Object (); 如果不用給建構函式傳參,也可以這麼寫:var o = new Object;但不推薦。

  關於Object的每個例項的具體屬性和方法,第五、六章再討論。

3.5 操作符:

  是用於運算元據值的操作符,包括算術操作符、位操作符、關係操作符、相等操作符。

3.5.1 一元操作符:

  • 前置操作符: var age = 29; ++age;  age變數的值都是在語句被求值以前改變的。
  • 後置操作符: var price = 29; price++;  price變數的值都是在包含它們的語句被求值之後才執行的。
  • 以上的意思可以從這段程式碼看出:

   var num1 = 2;  var num2 = 20;  var num3 = num1-- + num2;  //等於22,因為是後置,所以在var num3語句裡它不改變先,等到這條語句被求值之後才改變  var num4 = num1 + num2 ;  //等於21,num1=1。

  • 加減前後置操作符不僅可以應用在整數上,還可以應用在字串、布林值、浮動數值和物件上哦!!!
    • var s1 = "2";  s1++;  // 3,包含有效數字字元的字串先轉換為數字值,再執行加減的操作,然後字串變數變成數值變數。
    • var s2 = "x",  s2++;  // NaN,因為不包含數字,不過字串變數還是會變成數值變數NaN;應用一元操作符都會變成NaN!!!
    • var b = false;  b++;  // 1,布林值變成0或1,再執行加減1的操作,然後布林值變數變成數值變數。
    • var f = 1.1;        f--;  //0.10000000000000009
    • var o = {         ;  o--;    //-2

        valueOf : function () {

            return -1;

        }

      }

  • 一元減操作符(-):主要用於表示負數

3.5.2 位操作符:本小節暫不講解。。。。。。。

3.5.3 布林操作符:

  • 邏輯非(!):短路操作符。應用於任何值,返回一個布林值。生動的說就是:alert(!”我是好人“)   //false,返回一個壞人,因為有!存在。
    • alert(!false);  // true
    • alert(!"blue");  // false
    • alert(!0);    // true
    • alert(!NaN);  // true
    • alert(!" ");   // true
    • alert(!12345); //false

   若使用兩個!那就是反過來咯。

  • 邏輯與(&&):全true則true。應用於任何型別的運算元,不僅僅是布林值,但不可以在&&操作中使用未定義的值,不然會導致錯誤,不返回值。遵循以下規則:

   若第一個運算元能決定結果了,那第二個就無視。即第一個是false,那就不看第二個了。若第一個是true,那還是會去看第二個(第二個不可以使用未定義的值)。

   若兩個運算元都是物件,則返回第二個運算元;若第一個運算元是null,則返回null;若第一個運算元是NaN,則返回NaN;若第一個運算元是undefined,則返回undefined;

第一個運算元

第二個運算元

結果

true

true

true

true

false

false

false

true

false

false

false

false

 

  • 邏輯或(||):有true則true,和邏輯與一樣,不可以使用未定義的值

   若第一個運算元能決定結果了,那第二個就無視。即第一個是true,那就不看第二個了。若第一個是false,那還是會去看第二個(第二個不可以使用未定義的值)。

   若兩個運算元都是物件,則返回第一個運算元;若兩個運算元都是null,則返回null;若兩個運算元都是NaN,則返回NaN;若兩個運算元都是undefined,則返回undefined;

第一個運算元

第二個運算元

結果

true

true

true

true

false

true

false

true

true

false

false

false

3.5.4 乘性操作符:乘法、除法和求模,會自動把非數值的操作符轉換位數值(即自動用Number()轉換)

  • 乘法要注意的是: 結果超出ES數值表示範圍,則返回Infinity或-Infinity;若有某一個運算元是NaN,那結果就是NaN;運算元是Infinity,那結果也是Infinity;Infinity乘以0等於NaN。
  • 除法要注意的是: 結果超出ES數值表示範圍,則返回Infinity或-Infinity;若有某一個運算元是NaN,那結果就是NaN;運算元是Infinity,那結果也是Infinity;Infinity除以Infinity等於NaN;0除以0等於NaN。
  • 求模(%)主要需要注意的是:Infinity除以Infinity等於NaN;被除數是0,結果就是0。

3.5.5 加性操作符:加法、減法

  • 加法要注意的是:若有一個運算元是NaN,結果就是NaN;+0加+0等於+0;-0加-0等於-0;+0加-0等於+0;

   !!!最重要的來了,如果兩個運算元都是字串,則將第二個運算元與第一個運算元拼接起來;如果只有一個運算元是字串,則將另外一個運算元轉換為字串,再將第二個運算元與第一個運算元拼接起來。

   如果有一個操作符是物件、陣列或布林值,則呼叫它們的toString() 方法取得相應的字串值;對於undefined和null,則分別呼叫String()函式並取得”undefined“和”null“。

   例題:var num1 = 5;  var num2 = 10;  var message = "The sum of 5 and 10 is" + num1 + num2;  alert(message);  //"The sum of 5 and 10 is 510" ;

      var num1 = 5;  var num2 = 10;  var message = "The sum of 5 and 10 is" + (num1 + num2);  alert(message);  //"The sum of 5 and 10 is 15" ;

      var result1 = 2 + true;  // 3,因為true被Number()函式轉換成1

  •  減法要注意的是:若有一個運算元是NaN,結果就是NaN;+0減+0等於+0;-0減-0等於+0;+0加-0等於-0;

   !!!最重要的來了,它和加法不一樣,不拿來拼接什麼鬼字串。

   !!! (主要是使用了Number()函式)

   例題:var result1 = 5 - true;  //4

      var result2 = NaN - 1;  //NaN

      var result3 = 5 - 3;  //2

      var result4 = 5 - " ";  //5

      var result5 = 5 - ”2“;  //3

      var result6 = 5 - null;  //5

3.5.6 關係操作符:大於、小於、小於等於、大於等於:

  相應規則:

  • 若兩個運算元都是陣列,則執行數值比較。
  • 若兩個運算元都是字串,則比較兩個字串對應的字元編碼值。
  • 若有一個運算元是數值,則將另外一個運算元轉換為一個數值,然後執行數值比較。
  • 若有一個運算元是物件,則呼叫這個物件的valueOf()方法再比較,若沒有此方法,則呼叫toString()方法,再比較。
  • 若一個運算元是布林值,則先將其轉換為數值然後再比較。
  • 任何數和NaN比較,結果都是false。

  例題:var result = "a" < 3;  //false,字串a不能被轉換成合理的數值,所以”a"被轉換成NaN

     var result1 = "23" < "3";  //true,比較的是字元編碼

     var result2 = "23" < 3;  //false,因為”23“變成了23

3.5.7 相等操作符:==、!= ,===、!== :

  • 相等與不相等:==、!=
    • 相等:相等和不相等是先強制轉型再比較它們的相等性
      • 若兩個運算元相等則返回true,不相等則返回false;
    • 不相等:
      • 若兩個運算元相等則返回false,不相等則返回true;
    • 基本規則:
      • 若有布林值,則先轉換為數值,false=0,true=1;
      • 若有一個是字串,另一個是數值,則先把字串轉換為數值;
      • 若有一個是物件,另一個不是,則呼叫物件的valueOf()方法,用得到的基本型別值再進行比較;
      • null == undefined(相等)
      • 若有一個是NaN,則相等操作符返回false,不相等操作符返回true;即使有兩個都是NaN都一樣,因為NaN不等於NaN;
      • 若兩個都是物件,則比較它們是不是都指向同一物件,是則 相等操作符返回true,否則返回false;
      • null == 0 ,undefined == 0 //false,因為null和undefined在做相等判斷時不進行轉型,所以null、undefined和0是不同型別資料,所以返回false;

表示式

null == undefined、false == 0、NaN != NaN、”5“ == 5、true == 1

true

”NaN“ == NaN、5 == NaN、NaN == NaN、null == 0、undefined == 0

false

  • 全等和不全等:===、!==
    • 比較前不轉換,所以比較的時候看資料型別相不相等
    • 其他規則和相等不相等一樣~~

 

未完、待續。

 

相關文章