主頁 > 企業開發 > JavaScript基礎

JavaScript基礎

2021-02-23 06:47:06 企業開發

 

JavaScript基礎

1- 初識JavaScript

1.1 JavaScript 是什么

  • JavaScript是一種運行在客戶端的腳本語言,現基于Node.js技術進行服務端編程;

    所謂腳本(Script)語言:是運行時不需要編譯,運行程序中由 js 解釋器( js 引擎)逐行來進行解釋并執行,讀到一行,執行一行;

  • 目的是實作邏輯業務與頁面控制,相當于動作;

    所謂邏輯性:就是 實作這個要求的思路 先怎么做后怎么做;

1.2 JavaScript的作用

  • 表單動態校驗(密碼強度檢測) ( JS 產生最初的目的 )

  • 網頁特效

  • 服務端開發(Node.js)

  • 桌面程式(Electron)

  • App(Cordova)

  • 控制硬體-物聯網(Ruff)

  • 游戲開發(cocos2d-js)

1.3 HTML/CSS/JS 的關系

HTML 和 CSS 屬于描述類語言;JS 屬于 編程類語言;

1.4 瀏覽器執行 JS 簡介

瀏覽器分成兩部分:渲染引擎和 JS 引擎

  • 渲染引擎:用來決議HTML和CSS,俗稱內核,比如 chrome瀏覽器的 blink,老版webkit等;

  • JS 引擎:也稱 JS 解釋器,用來讀取網頁中的 JavaScript代碼,處理后運行,如chrome的V8;

    瀏覽器本身并不會執行JS代碼,而是通過內置 JavaScript 引擎(解釋器) 來執行 JS 代碼 ,JS 引擎執行代碼時逐行解釋每一句原始碼(轉換為機器語言),然后由計算機去執行,所以 JavaScript 語言歸為腳本語言,會逐行解釋執行,

1.5 JS 的組成

  1. ECMAScript

    ECMAScript:規定了JS的編程語法和基礎核心知識,是所有瀏覽器廠商共同遵守的一套JS語法工業標準,

    更多參看MDN: MDN手冊

  2. DOM——檔案物件模型

    檔案物件模型(DocumentObject Model,簡稱DOM),是W3C組織推薦的處理可擴展標記語言的標準編程介面,通過 DOM 提供的介面可以對頁面上的各種元素進行操作(大小、位置、顏色等)——元素物件;

  3. BOM——瀏覽器物件模型

    瀏覽器物件模型(Browser Object Model,簡稱BOM) 是指瀏覽器物件模型,它提供了獨立于內容的、可以與瀏覽器視窗進行互動的物件結構,通過BOM可以操作瀏覽器視窗,比如彈出框、控制瀏覽器跳轉、獲取解析度等——瀏覽器視窗;

 

1.6 JS 書寫位置

JS 有3種書寫位置,分別為行內、內嵌和外部,

1.行內式

<input type="button" value="https://www.cnblogs.com/xinxinzi/archive/2021/02/22/點我" onclick="alert('Hello World')" />

 

  • 可以將單行或少量 JS 代碼寫在HTML標簽的事件屬性中(以 on 開頭的屬性),如:onclick

  • 注意單雙引號的使用:在HTML中我們推薦使用雙引號, JS 中我們推薦使用單引號

  • 可讀性差, 在html中撰寫JS大量代碼時,不方便閱讀;

2.內嵌式

<script>
    alert('Hello  World~!');
</script>

 

  • 可以將多行JS代碼寫到 script 標簽中

  • 內嵌 JS 是學習時常用的方式

3.外部JS檔案

<script src="https://www.cnblogs.com/xinxinzi/archive/2021/02/22/my.js"></script>

 

  • 利于HTML頁面代碼結構化,把大段 JS代碼獨立到 HTML 頁面之外,既美觀,也方便檔案級別的復用

  • 參考外部 JS檔案的 script 標簽中間不可以寫代碼

  • 適合于JS 代碼量比較大的情況

    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <!-- 2.內嵌式的js -->
        <script>
            alert('這是我的第一個js');
        </script>
?
        // 3.外部js的寫法,開始和結束標簽間不能寫字
        <script src="https://www.cnblogs.com/xinxinzi/archive/2021/02/22/script.js"> </script>
    </head>
?
    <body>
        <!-- 1.行內式的js 直接寫到元素內部,以on開頭的屬性 外雙內單引號 -->
        <input type="button" value="https://www.cnblogs.com/xinxinzi/archive/2021/02/22/提交" onclick="alert('提交成功')">
    </body>

 

 

2 - JavaScript注釋

JS中的注釋主要有兩種,分別是單行注釋和多行注釋,

1. 單行注釋
// 用來注釋單行文字(  快捷鍵   ctrl  +  /   )
?
2. 多行注釋
/* */  用來注釋多行文字( 默認快捷鍵  alt +  shift  + a )

 


?

更改快捷鍵:vscode → 首選項按鈕 → 鍵盤快捷方式 → 查找 原來的快捷鍵 → 修改為新的快捷鍵 → 回車確認

3 - JavaScript輸入輸出陳述句

為了方便資訊的輸入輸出,JS中提供了一些輸入輸出陳述句,其常用的陳述句如下:

方法說明面向物件
alert(msg) 瀏覽器彈出警示框 用戶
console.log(msg) 瀏覽器控制臺列印輸出資訊 程式員
prompt(info) 瀏覽器彈出輸入框,用戶可以輸入 用戶
  <script>
       // 1.彈出輸入框 輸入內容后默認彈出輸入的內容
        prompt('請輸入你的年齡');
       // 2.alert 彈出警示框 輸出的 展示給用戶的
        alert('這是我的第一個js');
      // 3.console 控制臺輸出列印資訊 給程式員測驗用的 瀏覽器f12控制臺左手第二個
        console.log('這是程式員能看到的');
  </script>

 

 

程式設計基礎

1 - 變數概述

1.1 什么是變數

  • 為什么需要變數?有些資料需要保存,所以需要變數;

  • 變數是什么?變數相當一個容器,用來存盤資料;

  • 本質?變數的本質是程式在記憶體中的一塊存盤空間;

  • 通過變數名找到變數,訪問記憶體;

  • 變數的命名規范:見名知意-駝峰命名法;

1.2 - 變數的使用

  • 變數的宣告

  • 變數的賦值

  • 變數的初始化

    1.宣告變數

var age; // 宣告一個名稱為 age 的變數;本質是 在記憶體中申請一塊存盤空間

 

  • var 是一個 JS關鍵字,用來宣告變數( variable 變數的意思 ),使用該關鍵字宣告變數后,計算機會自動為變數分配記憶體空間,不需要程式員管;

  • age 是程式員定義的變數名,我們要通過 變數名來訪問記憶體中分配的空間;

    2.賦值

age = 10; // 給 age 這個變數賦值為 10    

 

      
  • = 表示賦值,用來把右邊的值賦給左邊的變數空間

  • 變數值是程式員保存到變數空間里的值

    3.變數的初始化

宣告一個變數的同時并賦值, 我們稱之為變數的初始化,

var age  = 18;  // 宣告變數同時賦值為 18

 

案例:

  • 彈出一個輸入框,提示用戶輸入姓名;

  • 彈出一個對話框,輸入 用戶剛才輸入的姓名;

    <script>
        // 1.用戶輸入姓名 存盤到一個myname的變數里 變數是存盤容器
        var myname = prompt('請輸入姓名');
        // 2.輸出這個用戶名
        alert(myname);
        // alert('myname');加了單引號就顯示不出變數名了
    </script>

 

 

1.3 變數語法擴展

1.更新變數

變數被重新復賦值后,它原有的值就會被覆寫,變數值將以最后一次賦的值為準,

var age = 18;
age = 81;   // 最后的結果就是81 因為18 被覆寫掉了 

 

         

2.同時宣告多個變數

同時宣告多個變數時,只需要寫一個 var, 多個變數名之間使用英文逗號隔開,

var age = 10,  name = 'zs', sex = 2;     

 

3.宣告變數特殊情況

情況說明結果
var age ; console.log (age); 只宣告 不賦值 undefined
console.log(age) 不宣告 不賦值 直接使用 報錯
age = 10; console.log (age); 不宣告 只賦值 10 可運行

案例:變數的語法擴展

    <script>
        // 1.更新變數 變數被重新賦值后,以最新一次為準
        var myname = '卡卡西';
        console.log(myname);
        myname = '火影';
        console.log(myname);//最新一次顯示 火影 但之前的因為也輸出了,也會有歷史顯示

        // 2.宣告多個變數,可簡寫 只需寫一個var,變數名間逗號隔開,分號表結束
        // var age = 18;
        // var address = '通遼';
        // var sex = 'nv';
        var age = 18,
            address = '通遼',
                sex = 'nv';

        // 3. 宣告變數的特殊情況
        // 3.1 只宣告 不賦值 結果是?undefined
        var sex;
        console.log(sex); // undefined
        // 3.2 不宣告 不賦值 直接使用某個變數會報錯
        console.log('tel');
        // 3.3 不宣告直接賦值 js 可以使用
        qq = 110;
        console.log(qq); // 110
    </script>

 

案例:交換兩個變數的值

js 是編程語言有很強的邏輯性在里面: 實作這個要求的思路 先怎么做后怎么做

// 思路:引入一個臨時變數temp
    <script>
        var temp;
        var apple1 = '青蘋果';
        var apple2 = '紅蘋果';
        temp = apple1;
        apple1 = apple2;
        apple2 = temp;
        console.log(apple1);
        console.log(apple2);
    </script>

 

1.4 變數命名規范

  • 由字母(A-Za-z)、數字(0-9)、下劃線(_)、美元符號( $ )組成,如:usrAge, num01, _name

  • 嚴格區分大小寫,var app; 和 var App; 是兩個變數

  • 不能 以數字開頭, 18age 是錯誤的

  • 不能 是關鍵字、保留字,例如:var、for、while

  • 變數名必須有意義, MMD BBD nl → age

  • 遵守駝峰命名法,首字母小寫,后面單詞的首字母需要大寫,

 

2 - 資料型別

2.1 資料型別簡介

1.為什么需要資料型別?

在計算機中,不同的資料所需占用的存盤空間是不同的,為了便于把資料分成記憶體所需的大小,充分利用存盤空間,于是定義了不同的資料型別,

2.變數的資料型別?

變數的資料型別決定了以什么樣的型別存盤到計算機的記憶體中,JavaScript 是一種弱型別或者說動態語言,這意味著不用提前宣告變數的型別;在程式運行程序中,變數的資料型別是由 JS引擎根據 = 右邊變數值的資料型別來判斷的,

var age = 10;// 這是一個數字型
var areYouOk = '是的';// 這是一個字串     

 

JavaScript 擁有動態型別,同時也意味著相同的變數可用作不同的型別:

var x = 6;// x 為數字
var x = "Bill";// x 為字串   

 

3.資料型別的分類

  • 簡單資料型別 (Number,String,Boolean,Undefined,Null)

  • 復雜資料型別 (object)

2.2 簡單資料型別

簡單資料型別(基本資料型別)

簡單資料型別說明默認值
Number 數字型,包含整形和浮點型,如21和0.21 0
String 字串型,加了引號的都是字串 “ ”、‘ ’
Boolean 布林值型,回傳值true、false,等價于1和0 false
Undefined var a;宣告變數確沒給值,此時a = undefined undefined
Null var a = null;宣告了變數a為空值 null

1、數字型 Number

  <script>
   
        // 1.存盤整形和浮點型
        var age = 21; // 整數
        var Age = 21.3747; // 小數

          // 2.存盤各進制數值
        var num1 = 010; // 八進制
        var num2 = 0xff; // 十六進制

        // 3.數字型范圍 三個特殊值
        alert(Number.MAX_VALUE); // 最大值
        alert(Number.MIN_VALUE); // 最小值
        alert(Infinity); // 無窮大
        alert(-Infinity); // 無窮小
        alert(NaN); // not a number,代表一個非數值

        console.log('Number.MAX_VALUE * 2'); // Infinity 無窮大
        console.log('-Number.MAX_VALUE * 2'); // -Infinity 無窮小

        console.log('pink老師' - 100);// NaN 非數值

        // 4.isNaN() 判斷 非數字型別 并且回傳一個值 
        // 是數字回傳 false 不是回傳true
        console.log(isNaN(12)); // false
        console.log(isNaN(userName)); // true 
 </script>

 

2、字串型 String

(1)字串型是引號內的任意文本,內部換行需要用轉義字符 如 \ n

    <script>
        // 嵌套原則:外雙內單 或 外單內雙;
        var str = '我是一個"高富帥"的程式員';
        console.log(str);

        // 字串轉義字符  都是用 \ 開頭 但是這些轉義字符寫到引號里面
        var str1 = "我是一個'高富帥'的\n程式員";
        console.log(str1);
    </script>

 

(2)字串轉義符

轉義符解釋說明
\n 換行符,n 是 newline 的意思
\ \ 斜杠 \
' ' 單引號
" ”雙引號
\t tab 縮進
\b 空格 ,b 是 blank 的意思

(3)字串拼接:

  • 多個字串之間可以使用 + 進行拼接, 字串 + 任何型別 = 新字串型別

  • + 號總結口訣:數值相加 ,字符相連

    <script>
        // 1. 檢測獲取字串的長度 length 
        var str = 'my name is andy';
        console.log(str.length); // 15

        // 2. 字串的拼接 + 不同型別也可拼接 但最后是字串型 
        // 數字型是結果 即:數值相加、字符相連
        console.log('沙漠' + '駱駝'); // 字串的 沙漠駱駝
        console.log('pink老師' + 18); // 'pink老師18'
        console.log('pink' + true); // pinktrue
        console.log(12 + 12); // 24
        console.log('12' + 12); // '1212'
    </script>

 

(4)字串拼接加強

  • 經常會將字串和 變數 來拼接,變數可以很方便地修改里面的值

  • 變數是不能添加引號的,因為加引號的變數會變成字串

  • 如果變數兩側都有字串拼接,口訣“引引加加 ”,刪掉數字,變數寫加中間

    <script>
        console.log('pink老師 18 歲');
        //先寫此句,然后洗掉18 引引加加 中間加變數
        
        var age = 18;
        console.log('pink老師' + age + '歲');// 引引加加
    </script>

 

案例:互動編程的三個基本要素

  • 用戶輸入:彈出一個輸入框prompt,讓用戶輸入年齡;

  • 程式內部處理:把用戶輸入的值作為變數保存起來,把剛才輸入的年齡與所要輸出的字串拼接;

  • 輸出結果:使用alert陳述句彈出警示框;

案例:顯示年齡案例

    <script>
        var age = prompt('請輸入你的年齡');
        var str = '你今年已經' + age + '歲了';
        alert(str);
    </script>

 

 

3、布爾型Boolean

  • 布爾型別有兩個值:true 和 false ,其中 true 表示真,而 false 表示假;

  • 布爾型和數字型相加的時候, true 的值為 1 ,false 的值為 0;

console.log(true + 1);  // 2
console.log(false + 1); // 1

 

4、Undefined 和 Null

  • 一個宣告后沒有被賦值的變數會有一個默認值undefined ( 如果進行相連或者相加時,注意結果)

var variable;
console.log(variable);           // 只宣告未賦值 輸出 undefined
console.log('你好' + variable);  // 你好undefined
console.log(11 + variable);    // undefined 和數字相加 輸出 NaN 
console.log(true + variable); //  NaN

 

  • 一個宣告變數給 null 值,里面存的值為空(學習物件時,我們繼續研究null)

var vari = null;
console.log('你好' + vari);  // 你好null
console.log(11 + vari);     // 11
console.log(true + vari);   //  1

 

2.3 獲取變數資料型別

1.typeof 獲取檢測變數的資料型別

    <script>
        var num = 18;
        console.log(typeof num); // number
        var str = 'pink';
        console.log(typeof str); // string
        var flag = true;
        console.log(typeof flag); // boolean
        var vari = undefined;
        console.log(typeof vari); // undefined
        var timer = null;
        console.log(typeof timer); // object

        // prompt 取過來的值是 字符型的
        var age = prompt('請輸入您的年齡');
        console.log(age);
        console.log(typeof age); // string
    </script> 

 

也可以通過控制臺的顏色判斷資料型別;黑色是字串;

2.字面量

字面量表示如何表達這個值,一眼看上去知道這個屬于什么型別的值,

    <script>
        console.log(18);// 數字字面量
        console.log('18');// 字串字面量
        console.log(true);// 布爾字面量
        console.log(undefined);
        console.log(null);
    </script>

 

 

2.4 資料型別轉換

什么是資料型別轉換?就是把一種資料型別的變數轉換成另一種資料型別,通常會實作3種方式的轉換:

  • 轉換為字串型別

  • 轉換為數字型

  • 轉換為布爾型

1.轉換為字串

方式說明案例
加號拼接字串 和字串拼接的結果都是字串 var num = 1;alert(num + '我是字串');也稱隱式轉換
toString( ) 轉成字串 var num = 1;alert(num.toString( ));
String( )強制轉換 轉成字串 var num = 1;alert(String(num));
    <script>
        // 1. 把數字型轉換為字串型變數 .toString()
        var num = 10;
        var str = num.toString();
        console.log(str);
        console.log(typeof str);
        // 2. 我們利用 String(變數)   
        console.log(String(num));
        // 3. 利用 + 拼接字串的方法實作轉換效果 隱式轉換
        console.log(num + '');
    </script>

 

2.轉換為數字型(重點)

方式說明案例
parseInt(string)函式 將string型別轉換成整數數值型 parseInt('78')
parseFloat(string)函式 將string型別轉換成浮點數值型 parseFloat('78.21')
Number()強制轉換函式 將string型別轉換成數值型 Number('12')
js隱式轉換(- * /) 利用算數運算隱式轉換為數值型 '12' - 0
    <script>
        var age = prompt('請輸入你的年齡');
        // 1. parseInt(變數) 可以把字符型的轉換成數字型 得到的是整數
        console.log(parseInt(age));
        console.log(parseInt('3.14')); // 整數 3
        console.log(parseInt('120px')); // 整數 120 單位px被去掉
        console.log(parseInt('rem120px')); // NaN 首字母檢測不是數字

        // 1. parseFloat(變數) 可以把字符型的轉換成浮點型 得到的是浮點數
        console.log(parseFloat('3.14')); // 3.14
        console.log(parseFloat('120px')); // 單位也會去掉

        // 3. Number(變數)
        var str = '123';
        console.log(Number(str));
        console.log(Number('12'));

        // 4. 利用了算術運算 - * / 隱式轉換(不能 +)
        console.log('12' - 0); // 數字型 12,先把數字轉為數字型在-
        console.log('123' - '120'); // 3

        console.log('123' + '120'); // 123120 + 是字串拼接,
    </script>

 

 

案例:輸出年齡

思路:

  • 彈出一個輸入框(prompt),讓用戶輸入出生年份(用戶輸入)

  • 把用戶輸入的值用變數保存起來,用今年年份減去變數值,就是現在的年齡(程式內部處理)

  • 彈出警示框(alert),把計算的結果輸出(輸出結果)

    <script>
        var year = prompt('請輸入你的出生年份');
        var age = 2020 - year;// year是字串 減法隱式轉換 成數字型
        alert('你今年已經 ' + age + ' 歲了');
    </script>

 

案例:簡單加法器

要求:計算兩個數的值,用戶輸入第一個值后,繼續彈出第二個輸入框并輸入第二個值,最后彈出視窗顯示兩次輸入值相加的結果,

    <script>  
        var num1 = prompt('請輸入第一個值:');
        var num2 = prompt('請輸入第二個值:');
        var result = parseFloat(num1) + parseFloat(num2);
        alert('結果是:' + result);
    </script>

 

3.轉換為布爾型

  • 代表空、否定的值會被轉換為 false ,如 ''、0、NaN、null、undefined ;

  • 其余值都會被轉換為 true;

console.log(Boolean('')); // false
console.log(Boolean(0)); // false
console.log(Boolean(NaN)); // false
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false

console.log(Boolean('小白')); // true
console.log(Boolean(12)); // true

 

 

3 - 識別符號、關鍵字、保留字

3.1 識別符號

標識(zhi)符:就是指開發人員 為變數、屬性、函式、引數取的名字,
識別符號不能是關鍵字或保留字,

3.2 關鍵字

關鍵字:是指 JS本身已經使用了的字,不能再用它們充當變數名、方法名,

包括:break、case、catch、continue、default、delete、do、else、finally、for、function、if、in、instanceof、new、return、switch、this、throw、try、typeof、var、void、while、with 等,

3.3 保留字

保留字:實際上就是預留的“關鍵字”,意思是現在雖然還不是關鍵字,但是未來可能會成為關鍵字,同樣不能使用它們當變數名或方法名,

包括:boolean、byte、char、class、const、debugger、double、enum、export、extends、fimal、float、goto、implements、import、int、interface、long、mative、package、private、protected、public、short、static、super、synchronized、throws、transient、volatile 等,

注意:如果將保留字用作變數名或函式名,那么除非將來的瀏覽器實作了該保留字,否則很可能收不到任何錯誤訊息,當瀏覽器將其實作后,該單詞將被看做關鍵字,如此將出現關鍵字錯誤,

3.4 識別符號命名規范

  • 變數、函式的命名必須要有意義

  • 變數的名稱一般用名詞

  • 函式的名稱一般用動詞

  • 運算子(=)、括號、左右各留一個空格;

    注釋后面打一個空格;

     

4 - 運算子(運算子)

4.1 運算子的分類

運算子(operator)也被稱為運算子,是用于實作賦值、比較和執行算數運算等功能的符號,

JavaScript中常用的運算子有:
    - 算數運算子  + - * / %
    - 遞增和遞減運算子  ++ --
    - 比較運算子  > < >= <= != ==
    - 邏輯運算子  && || !
    - 賦值運算子  =

4.2 算數運算子

1.算術運算子概述

概念:算術運算使用的符號,用于執行兩個變數或值的算術運算,

運算子描述實體
+ 10+20=30
- 10-20=-10
* 10*20=200
/ 10/20=0.5
% 取余數(取模) 回傳除法的余數 9%2=1

2.浮點數的精度問題

浮點數值的最高精度是 17 位小數,但在進行算術計算時其精確度遠遠不如整數,

    var result = 0.1 + 0.2; // 結果是:0.30000000000000004
    console.log(0.07 * 100); // 結果是:7.000000000000001
    // 所以:不要直接判斷兩個浮點數是否相等 !

 

3.運算式和回傳值

運算式:是由數字、運算子、變數等組成的式子

運算式最終都會有一個結果,回傳給開發者,稱為回傳值

 

4.3 遞增和遞減運算子

如果需要反復給數字變數+1或-1可以使用遞增(++)和遞減(--)運算子來完成,
在 JavaScript 中,遞增(++)和遞減(--)既可放在變數前,也可以放變數后面 前置遞增和后置遞增,
注意:前置遞增和后置遞增在單獨使用時,效果是一樣的;在運算式里,有所不同;

遞增運算子

  • 前置遞增運算子 “++變數”:

    使用口訣:先自加,后回傳值 ++num——num = num + 1;

    var  num = 10;
    alert(++num + 10);   // num = 11  11+10=21

 

  • 后置遞增運算子 “變數++”:

    使用口訣:先原值運算,后自加 num++ —— num = num + 1 ;

    var  num = 10;
    alert(10 + num++);  // num = 11 10+10=20

 

案例:遞增運算子:

    <script>
        var a = 10;
        ++a; // ++a  11    a = 11
        var b = ++a + 2; // a = 12
        console.log(b); // 14

        var c = 10;
        c++; // c++ 11 
        var d = c++ + 2; //  c++  = 11+2     c = 12
        console.log(d); // 13

        var e = 10;
        var f = e++ + ++e; // 1. e++ =  10  e = 11  2. e = 12  ++e = 12
        console.log(f); // 10 + 12 = 22
        // 后置自增  先運算式回傳原值 后面變數再自加1
    </script>

 

 

4.4 比較運算子

  • 比較運算子概述

    概念:比較運算子(關系運算子)是兩個資料進行比較時所使用的運算子,比較運算后,會回傳一個布林值(true / false)作為比較運算的結果,

    運算子名稱說明案例結果
    < 小于號 1<2 true
    > 大于號 1>2 false
    >= 大于等于號 2>=2 true
    <= 小于等于號 2<=3 false
    == 判斷號(會轉型) 37==37 true
    != 不等號 37!=37 false
    === !== 全等 要求值和資料型別都一致 37==='37' false

     

  • 等號比較

    符號作用用法
    = 賦值 等號右側的值賦給左側
    == 判斷 判斷兩邊的值是否相等(注意隱式轉換)
    === 全等 判斷兩邊的值和資料型別是否完全相同

    實體:比較運算子

            //1. 我們程式里面的 == 是判斷兩邊值是否相等
            console.log(3 == 5); // false
            console.log('pink老師' == '劉德華'); // flase
            console.log(18 == 18); // true
            console.log(18 == '18'); // true
            console.log(18 != 18); // false
            // 2. 我們程式里面有全等 一模一樣  要求 兩側的值 還有 資料型別完全一致才可以 true
            console.log(18 === 18);
            console.log(18 === '18'); // false

     

4.5 邏輯運算子

  • 邏輯運算子概述

    邏輯運算子是用來進行布林值運算的運算子,其回傳值也是布林值,

    邏輯運算子說明案例
    && "邏輯與" ’與‘ and true && false
    || "邏輯或" ’或‘ or true || false
    "邏輯非" ’非‘ not ! true

    案例:邏輯運算子

            <script>
            // 1. 邏輯與 &&  and 兩側都為true  結果才是 true  只要有一側為false  結果就為false 
            console.log(3 > 5 && 3 > 2); // false
            console.log(3 < 5 && 3 > 2); // true
            // 2. 邏輯或 || or  兩側都為false  結果才是假 false  只要有一側為true  結果就是true
            console.log(3 > 5 || 3 > 2); // true 
            console.log(3 > 5 || 3 < 2); // false
            // 3. 邏輯非  not  ! 
            console.log(!true); // false
        </script>

     

     

  • 短路運算(邏輯中斷)

    邏輯運算子左邊的運算式值可以確定結果時,就不再繼續運算右邊的運算式的值;

    // 1.邏輯與 短路運算
    //如果第一個運算式為真,則回傳運算式2;如果第一個為假,則回傳運算式1;
    console.log(123 && 456);//456
    console.log(0 && 456 + 1 && 2);// 0
    console.log('' && 1 + 2 && 456 * 56789); // ''
    // 慷訓者否定的為假 其余是真  0 ‘’ null undefined NaN 為假;

    // 2.邏輯或 短路運算
    //如果運算式1 結果為真 則回傳運算式1 如果結果為假,則回傳運算式2
    console.log(123 || 456);//123
    console.log(0 && 456 + 1 && 2);//456 繼續向后運行

 

4.6 賦值運算子

概念:用來把資料賦值給變數的運算子,

賦值運算子說明案例
= 直接賦值 var name = '值';
+=、-= 加、減一個數后在賦值 var age = 10; age+=5; // 15
*=、/=、%= 乘、除、取模后再賦值 var age = 2; age*=5; // 10

案例:賦值運算子

    var age = 10;
    age += 5;  // 相當于 age = age + 5;
    age -= 5;  // 相當于 age = age - 5;
    age *= 10; // 相當于 age = age * 10;

 

 

4.7 運算子優先級

優先級運算子順序
1 小括號 ( )
2 一元運算子 ++ -- !
3 算術運算子 先 * / % 后 + -
4 關系運算子 > >= < <=
5 相等運算子 == != === !==
6 邏輯運算子 先 && 后 ||
7 賦值運算子 =
8 逗號運算子 ,
  • 一元運算子里面的邏輯非優先級很高

  • 邏輯與比邏輯或優先級高

 

5 - 流程控制

5.1 流程控制概念

流程控制就是來控制代碼按照一定結構順序來執行
流程控制主要有三種結構:順序結構、分支結構、回圈結構

5.2 順序流程控制

特點:從上到下,依次執行

5.3 分支流程控制

特點:根據不同的條件,執行不同的路徑代碼(多選一的程序)得到不同的結果;

JS 語言提供了兩種分支結構陳述句:if 陳述句、switch 陳述句

5.4 if 陳述句

       // 1. if陳述句 
        // 條件運算式成立 則執行代碼,否則什么也不做
        if (條件運算式) {
            // 條件成立執行的代碼陳述句
        }
        // 2. if else 雙分支陳述句
        // 分支陳述句 2選1程序 最終只有一條陳述句執行
        if (條件運算式) {
            陳述句1;//如果條件成立則執行陳述句1
            }
        else { 陳述句2 };//條件不成立執行陳述句2

         // 3. 多分支陳述句 
        // 最后也是只有一個陳述句執行 else if任意多,都不成立執行 else
        if (條件運算式1) {
            陳述句1;
        } else if (條件運算式2) {
             陳述句2;      
        } else {
            最后的陳述句;
        }

        // 4. 三元運算式 條件運算式 ?運算式1 :運算式2
       // 如果條件運算式為真,則回傳運算式1,否則回傳運算式2,運算式有回傳值
        var num = 10;
        var result = num > 5 ? '是的' : '不是的'; // 我們知道運算式是有回傳值的
        console.log(result);

        // if (num > 5) {
        //     result = '是的';
        // } else {
        //     result = '不是的';
        // }

 

案例:判斷是否閏年 (if ...else...)

// 演算法:能被4整除且不能整除100的為閏年,或者能夠被400整除的就是閏年
    <script>
        var year = prompt('請您輸入年份:');
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
            alert('您輸入的年份是閏年');
        } else {
            alert('您輸入的年份是平年');
        }
    </script>

 

案例:判斷成績級別 (if ...else if ...else...)

// 思路:從大到小的順序,否則 就都輸出了
    <script>
        var score = prompt('請您輸入分數:');
        if (score >= 90) {
        alert('寶貝,你是我的驕傲');
        } else if (score >= 80) {
        alert('寶貝,你已經很出色了');
        } else if (score >= 70) {
        alert('你要繼續加油嘍');
        } else if (score >= 60) {
        alert('孩子,你很危險');
        } else {
        alert('熊孩子,我不想和你說話,我只想用鞭子和你說話');
    </script>

 

案例:數字補0案例 (條件運算式 ? 運算式1 : 運算式2)

// 思路:用戶輸入一個0-59之間的數字,如果小于10,在這個數字前面補0(加0 拼接) 
    <script>
        var time = prompt('請您輸入一個 0 ~ 59 之間的一個數字');
        // 三元運算式 運算式 ? 運算式1 :運算式2 
        var result = time < 10 ? '0' + time : time; 
        alert(result);
    </script>

 

 

5.5 switch分支流程控制

  • switch :開關 轉換 , case :小例子 選項

  • 關鍵字 switch 后面括號內可以是運算式或值, 通常是一個變數,不用數值;

  • 如果運算式與case后面得值 存在匹配全等(===) ,則與該 case 關聯的代碼塊會被執行,并在遇到 break 時停止,整個 switch 陳述句代碼執行結束

  • 如果所有的 case 的值都和運算式的值不匹配,則執行 default 里的代碼

  • 注意: 執行case 里面的陳述句時,如果沒有break,則繼續執行下一個case,不會退出switch

特點:switch后面的運算式是 固定值,通常是變數,優點是可以直接跳轉到特定的case陳述句;

// 思路:利用我們的運算式的值 和 case 后面的選項值相匹配 如果匹配上,就執行該case 里面的陳述句  如果都沒有匹配上,那么執行 default里面的陳述句
    switch(運算式) {
        case value1: 執行陳述句1; break;
        case value2: 執行陳述句2; break;
        default: 最后的陳述句;
    }

 

案例:查詢水果價格 switch()

        // 彈出 prompt 輸入框,讓用戶輸入水果名稱,把這個值取過來保存到變數中,
        // 將這個變數作為 switch 括號里面的運算式,
        // case 后面的值寫幾個不同的水果名稱,注意一定要加引號 ,因為必須是全等匹配,
        // 彈出不同價格即可,

        var fruit = prompt('請您輸入查詢的水果:');
        switch (fruit) {
        case '蘋果':
        alert('蘋果的價格是 3.5/斤');
        break;
        case '榴蓮':
        alert('榴蓮的價格是 35/斤');
        break;
        default:
        alert('沒有此水果');
    }    

 

5.5 switch 陳述句和 if else if 陳述句的區別

  • 一般情況下,它們兩個陳述句可以相互替換

  • switch用于處理case比較確定的情況,如固定值的;進行條件判斷后直接執行到程式的條件陳述句,效率更高;

  • if else更加靈活,常用于范圍判斷(大于 小于);但if else有幾種條件就判斷多少次;分支較少時效率較高;

 

6 - 回圈

回圈的目的:可以重復執行某些代碼

JS三種回圈結構:

  • for回圈:常用于 計數

  • while回圈:復雜一點的條件判斷,比for靈活

  • do...while回圈:比while嚴謹

三個回圈很多情況可以相互轉換;

6.1 for回圈

重復執行某些代碼,通常和計數有關系

    // 1. 語法結構
    for (初始化變數; 條件運算式; 操作運算式) {
        //回圈體
    }

    //1.初始化變數 就是用 var宣告一個普通變數,常用于作為計數器
    //2.條件運算式 用來決定每一次回圈是否繼續執行 終止的條件
    //3.操作運算式 每次回圈最后執行的代碼 常用于計數器變數遞增減

    for (var i = 1; i <= 100; i++) {
        console.log('你好嗎');
    }
    //1.先賦初值 var i = 1 整個回圈只執行一次
    //2.在執行 i <= 100 條件成立執行回圈陳述句 不成立跳出回圈
    //3.條件成立的話 接下來執行console.log('')
    //4.最后執行i++ i++是單獨寫的代碼 遞增  第一輪結束
    //5.接著執行 i <= 100 如果滿足條件 就去執行回圈體 不滿足條件退出回圈 第二輪

 

for回圈執行方式

    <script>
        // 1.for回圈 重復執行相同代碼
        // 讓用戶 控制 輸入的次數
        var num = prompt('請輸入次數');
        for (var i = 1; i <= num; i++) {
            alert('hello world');
            // console.log('hello world');
        }

        // 2.for回圈 重復執行不同的代碼 因為我們有計數器變數 i 的存在 i每次回圈值都會變化
        // 計數器 輸出一個人 1~100歲
        for (var i = 1; i <= 100; i++) {
            console.log('這個人今年' + i + '歲了');
        }
    </script>

 

案例:有關for回圈的演算法

    <script>
    // 1. 求 1~100 之間的整數累加和 演算法:sum = sum + i  5050;   
        var sum = 0;// 求和變數 初始值為0
        for (var i = 1; i <= 100; i++) {
            // sum = sum + i;
            sum += i;
        }
        console.log(sum);

    // 2. 求1~100間的所有數的平均值 需要一個 sum 和的變數 還需要一個平均值 average 的變數  50.5
        var sum = 0;
        var average = 0;
        for (var i = 1; i <= 100; i++) {
            sum = sum + i;
            // sum += i;
        }
        average = sum / 100;
        console.log(average);

   // 3. 求1~100間所有偶數和奇數的和 需要一個偶數和even 和一個奇數和odd
        var even = 0;
        var odd = 0;
        for (var i = 1; i <= 100; i++) {
            if (i % 2 == 0) {
                even = even + i;
            } else {
                odd = odd + i;
            }
        }
        console.log('1~100之間的所有偶數和是' + even);
        console.log('1~100之間的所有奇數和是' + odd);
    </script>

 

案例:求學生成績案例

    <script>
        // 思路:
        // 1. 彈出輸入框輸入總得班級人數(num)
        // 2. 依次輸入學生成績并保存(score)
        // 3. for回圈 彈出的次數與班級總人數之間的關系 i <= num
        // 4. 先求總成績 sum ,之后求平均成績 average 彈出結果
        var num = prompt('請輸入班級的總人數');// num 總的班級人數
        var sum = 0;
        var average = 0;
        for (var i = 1; i <= num; i++) {
            var score = prompt('請輸入第' + i + '個學生成績');
            sum = sum + parseFloat(score);
        }
        average = sum / num;
        alert('班級總成績是' + sum);
        alert('班級的平均分是' + average);
    </script>

 

案例:列印五角星

  <script>
        //     一行列印五個星星 
        // console.log('★★★★★');
        //     回圈列印5次
        // for (var i = 1; i <= 5; i++) {
        //     console.log('★');
        // }
    
    // 1.一行列印五顆星星 追加字串的方法-是一行列印多少個,不是回圈多少次一行一個
        // var str = '';
         // for (i = 1; i <= 5; i++) {
        //     str = str + '★';
        // }
    
    // 2.取決于用戶輸入
        var num = prompt('請輸入星星的個數');
        var str = '';
        for (i = 1; i <= num; i++) {
            str = str + '★';
        }
        console.log(str);
    </script>

 

 

雙重for回圈

雙重for回圈:

    <script>
        // 1.語法結構 
        for (外層的初始化變數; 外層的條件運算式; 外層的操作運算式) {
            for (里層的初始化變數; 里層的條件運算式; 里層的操作運算式) {
                執行陳述句;
            }
        }
        //  內層回圈可以看做外層回圈的回圈體陳述句
        //  外層回圈執行一次,內層回圈 執行全部
        //  總共執行了 i*j 次

        for (var i = 1; i <= 3; i++) {
            console.log('這是外層回圈第' + i + '次');
            for (var j = 1; j <= 3; j++) {
                console.log('這是內層回圈第' + j + '次');
            }
        }
    </script>

 

案例:列印n行n列五角星

    <script>
        var rows = prompt('請你輸入行數:');
        var cols = prompt('請你輸入列數:');
        var str = '';
        for (var i = 1; i <= rows; i++) { // 外層回圈負責 列印i行

            for (var j = 1; j <= cols; j++) { // 內層回圈負責 一行列印j個
                str = str + '★';
            }
            // 如果一行列印完畢j個星星就要另起一行 加 \n
            str = str + '\n'; // 字串拼接 追加字串
        }
        console.log(str);
    </script>

 

案例:列印 倒三角

    <script>
        var str = '';
        for (var i = 1; i <= 10; i++) { //外層回圈控制行數
            for (var j = i; j <= 10; j++) { 
                //內層回圈列印個數不一樣 j=i=1,從1~10列印10個
                str = str + '★';
            }
            // 如果一行列印完畢j個星星就要另起一行 加 \n
            str = str + '\n';
        }
        console.log(str);
    </script>

 

案例:列印九九乘法表(正三角)

       // 一共有9行,但是每行的個數不一樣,因此需要用到雙重 for 回圈
       // 外層的 for 回圈控制行數 i ,回圈9次 ,可以列印 9 行  
       // 內層的 for 回圈控制每行公式  j 
 	  // 核心演算法:每一行 公式的個數正好和行數一致, j <= i;
      // 每行列印完畢,都需要重新換一行
    <script>
        str = '';
        for (i = 1; i <= 9; i++) {
            for (j = 1; j <= i; j++) {
                // str = str + '★';
                // str += i + 'x' + j + '=' + i * j;
                str += j + 'x' + i + '=' + i * j + '\t';
                //為了符合列匹配關系
            }
            str = str + '\n';
        }
        console.log(str);
   </script>

 

for 回圈小結

  • for 回圈可以重復執行某些相同代碼

  • for 回圈可以重復執行些許不同的代碼,因為我們有計數器

  • for 回圈可以重復執行某些操作,比如算術運算子加法操作

  • 雙重 for 回圈,外層回圈一次,內層 for 回圈全部執行

  • for 回圈是回圈條件和數字直接相關的回圈

斷點除錯:

  • 瀏覽器中f12打開除錯器視窗

  • 單擊某條陳述句設定斷點,并重繪瀏覽器

  • 右上角 步進 進行一步步除錯,看程式怎樣運行的

 

6.2 while回圈

while陳述句的語法結構如下:

使用 while 回圈時一定要注意,它必須要有退出條件,否則會成為死回圈

    <script>
        // 1. while 回圈語法結構 while 當...的時候
        // 2.執行思路 當條件運算式為true時 執行回圈體 否則 退出回圈
         while (條件運算式) {
             回圈體
         }
       
        // 3.代碼驗證
        var num = 1;// 初始化變數 計數器
        while (num <= 100) {
            console.log('hello');
            num++; // 操作運算式 完成計數器的更新 防止死回圈 不加限制會變成死回圈 一定要有退出條件
        }

        // 轉換寫法
        for (num = 1; num <= 100; num++) {
            console.log('hello');
        }
    </script>

 

案例:while回圈 輸出人的年齡

    <script>
        // while回圈案例
        // 1.列印人的一生,從1歲到100歲
        var i = 1;
        while (i <= 100) {
            console.log('這個人今年' + i + '歲了');
            i++;
        }

        // 2.計算1~100之間所有的整數和
        var sum = 0;
        var j = 1;
        while (j <= 100) {
            sum = sum + j;
            j++;
        }
        console.log(sum);

        // 3.彈出一個提示框,你喜歡我么? 如果輸入喜歡,就提示結束,否則 一直詢問
        var message = prompt('你喜歡我么?');
        while (message !== '喜歡') {
            message = prompt('你喜歡我么');
        }
        alert('我也喜歡你啊');
    </script>

 

 

6.3 do-while回圈

比while更簡單一些;

while是先判斷后回圈;do...while是先執行,后判斷,至少執行一次;

    <script>
        // 1.語法結構  先回圈,在判斷,至少執行一次
        do {
            //回圈體
        } while (條件判斷);

        // 2.代碼
        var i = 1;
        do {
            console.log('how are you');
            i++;
        } while (i <= 100)
            
        do {
            var message = prompt('你喜歡我么?');
        } while (message !== '喜歡')
         alert('我也喜歡你啊');
    </script>

 

 

6.4 continue、break

1.continue 關鍵字用于立即跳出本次回圈

繼續下一次回圈(本次回圈體中 continue 之后代碼會少執行一次)

案例:吃5個包子,第3個有蟲子,就扔掉第3個,繼續吃第4個第5個包子,代碼實作如下

     for (var i = 1; i <= 5; i++) {
         if (i == 3) {
             console.log('這個包子有蟲子,扔掉');
             continue; // 跳出本次回圈,跳出的是第3次回圈 
          }
          console.log('我正在吃第' + i + '個包子呢');
     }

    //1. 求 1~100 之間,除了能被7整除之外的 整數和
        var sum = 0;
        for (var i = 1; i <= 100; i++) {
            if (i % 7 == 0) {
                continue;// 退出本次回圈 直接跳到 i++
            }
            sum += i;
            console.log(sum);
        }
    </script>

 

2.break 關鍵字用于立即跳出整個回圈(回圈結束)

案例:吃5個包子,吃到第3個發現里面有半個蟲子,其余的不吃了,其代碼實作如下

  for (var i = 1; i <= 5; i++) {
     if (i == 3) {
         break; // 直接退出整個for 回圈,跳到整個for下面的陳述句
     }
     console.log('我正在吃第' + i + '個包子呢');
   }

 

 

7 - 陣列

為什么需要陣列?

普通變數一次只能存一個值;陣列(Array)是一組資料的集合,一次可以存多個值;

7.1 陣列的概念

陣列是指一組資料的集合,其中的每個資料被稱作元素,在陣列中可以存放任意型別的元素,

7.2 創建陣列

JS 中創建陣列有兩種方式:

  • 利用new 關鍵字 創建陣列(物件)

var 陣列名 = new Array() ;
var arr = new Array();   // 創建一個新的空陣列

 

  • 利用陣列字面量創建陣列

var  陣列名 = [];
// 使用陣列字面量方式創建帶初始值的陣列 陣列型別不限
var  陣列名 = [1,'pink',true];// 陣列的初始化

 

7.3 獲取陣列中的元素

索引 (下標) :用來訪問陣列元素的序號(陣列下標從 0 開始),

陣列可以通過索引來訪問、設定、修改對應的陣列元素,可以通過“陣列名[索引]”的形式來獲取陣列中的元素,

        // 4. 我們陣列里面的資料一定用逗號分隔
        // 5. 陣列里面的資料 比如1,2, 我們稱為陣列元素
        // 6. 獲取陣列元素  格式 陣列名[索引號]  索引號從 0開始 
        console.log(arr1);
        console.log(arr1[1]); // pink老師
        console.log(arr1[2]); // true   

 

注意:如果訪問時陣列沒有和索引值對應的元素,則得到的值是undefined

7.4 遍歷陣列

把陣列中的每個元素 從頭到尾 都訪問一次(類似學生的點名)稱為遍歷陣列;

for回圈中的 i 是計數器,當索引號使用,arr[i] 是陣列元素 第i個陣列元素,索引號從0開始

    <script>
        // 1.陣列索引 訪問陣列中某個元素
        var arr = ['red', 'green', 'blue'];
        console.log(arr[0]);// red

        // 2.遍歷陣列 通過for回圈訪問陣列所有元素
        //   因為陣列索引號從0開始,所以i必須從0開始 i < 3
        //   輸出的時候 arr[i] i 計數器 當索引號來用
        var arr = ['red', 'green', 'blue'];
        for (var i = 0; i < arr.length; i++) {
            console.log(arr[i]);
        }
        // 陣列名.length 可以直接獲取陣列長度 動態監測陣列元素的個數
        console.log(arr.length);// 此處陣列的長度是陣列元素的個數,并非索引
    </script>

 

案例:求陣列里面所有元素的和及平均值

    <script>
        // 1.宣告一個求和變數 sum
        // 2.遍歷這個陣列,把里面每個陣列元素 加到sum 里
        // 3.用求和變數 sum 除以陣列的長度得到陣列的平均值
        var arr = [2, 4, 1, 7, 4];
        var sum = 0;
        var average = 0;
        for (i = 0; i < arr.length; i++) {
            // sum+=i;// 加的不是計數器,是陣列里的元素
            sum += arr[i];
        }
        average = sum / arr.length;
        console.log('這組數的和是:' + sum);
        console.log('這組數的平均值是:' + average);
        console.log(sum, average); // 想要輸出多個變數,用逗號分隔即可
    </script>

 

案例:求陣列 [2,6,1,77,52,25,7] 中的最大值

    <script>
        // 1.宣告一個求和變數 max 默認最大值可以取陣列中的第一個元素
        // 2.遍歷這個陣列,把里面每個陣列元素和 max 相比較
        // 3.如果這個陣列元素大于max 就把這個陣列元素存到 max 里面,否則繼續下一輪比較,
        var arr = [2, 6, 1, 77, 52, 25, 7];
        var max = arr[0];// 將陣列第一個值賦值給max
        for (i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        console.log('該陣列里最大的是:' + max);
    </script>

 

案例:將陣列元素轉換為字串,中間用任意字符相連

        // 將陣列 ['red', 'green', 'blue', 'pink'] 轉換為字串,并且用 | 或其他符號分割
        // 1.需要一個新變數用于存放轉換完的字串 str,
        // 2.遍歷原來的陣列,分別把里面資料取出來,加到字串里面,
        // 3.同時在后面多加一個分隔符    
    <script> 
        var arr = ['red', 'green', 'blue', 'pink'];
        var str = '';
        var sep = '|';
        for (i = 1; i < arr.length; i++) {
            str += arr[i] + sep;
        }
        console.log(str);
    </script>

 

注意

  • 此處陣列的長度是陣列元素的個數 ,不是陣列的索引號(下標號),

  • 當我們陣列里面的元素個數發生了變化,這個 length 屬性跟著一起變化;陣列的length屬性可以被修改:

  • 如果設定的length屬性值大于陣列的元素個數,則會在陣列末尾出現空白元素;

  • 如果設定的length屬性值小于陣列的元素個數,則會把超過該值的陣列元素洗掉

7.5 陣列中新增元素

1、通過修改length長度新增陣列元素,通過length長度實作陣列的擴容

2、通過修改陣列索引新增陣列元素,追加陣列元素

    <script>
        // 1.新增陣列元素 修改length長度
        var arr = ['red', 'green', 'blue'];
        console.log(arr.length);
        arr.length = 5;// 陣列長度修改為5 里面應該有5個元素
        console.log(arr);// 后面兩個是空的 undefined

        // 2.新增陣列元素 修改索引號 追加陣列元素
        var arr1 = ['red', 'green', 'blue'];
        arr1[3] = 'pink';
        console.log(arr1);
        arr1[4] = 'hotpink';
        console.log(arr1);
        arr1[0] = 'yellow';// 替換原來的數組元素
        console.log(arr1);

        arr1 = '有點意思';// 不要直接給 陣列名賦值 否則里面的陣列元素都沒有了
        console.log(arr1);
    </script>

 

 

案例:陣列存放0~10個值,回圈追加的方式輸出

    <script>
        var arr = [];// 定義一個空陣列
        for (var i = 0; i < 10; i++) {// 遍歷陣列
            // arr=i;// 不要直接給陣列名賦值 否則以前的元素都沒了
            arr[i] = i + 1;// i是陣列下標 下標為0的陣列對應著 第一個陣列元素
        }
        console.log(arr);
    </script>

 

案例:篩選陣列 篩選陣列中大于10的數存入新陣列

    <script>
        // 方法一
        var arr = [1, 2, 3, 4, 5, 6, 7, 8, 19, 10];
        var newArr = [];// 宣告一個新的陣列存放新資料
        var j = 0;// 方法1 宣告一個新變數
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] >= 10) {
                // 新陣列索引號應該從0開始 依次遞增
                newArr[j] = arr[i];
                // 在舊陣列里找出大于等于10的元素 依次追加給新陣列
                j++;
            }
        }
        console.log(newArr);

        // 方法二
        var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
        var newArr = [];// 宣告一個新的陣列存放新資料
        // 剛開始 newArr.length 就是0
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] >= 10) {
                // 新陣列索引號應該從0開始 依次遞增
                newArr[newArr.length] = arr[i];
            }
        }
        console.log(newArr);
    </script>

 

案例:洗掉陣列指定元素,陣列去重 洗掉陣列中的0

    // 1、需要一個新陣列用于存放篩選之后的資料,
    // 2、遍歷原來的陣列, 把不是 0 的資料添加到新陣列里面(此時要注意采用陣列名 + 索引的格式接收資料),
    // 3、新陣列里面的個數, 用 length 不斷累加,
    <script>
        var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
        var newArray = [];
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] != 0) {
                newArray[newArray.length] = arr[i];
            }
        }
        console.log(newArray);
    </script>

 

案例:翻轉陣列 將陣列中的內容反過來存放

    // 1、宣告一個新陣列 newArr
    // 2、把舊陣列索引號第4個取過來(arr.length - 1),給新陣列索引號第0個元素 (newArr.length)
    // 3、我們采取 遞減的方式  i--
  // 思路:把 舊陣列 的 最后一個元素 取出來給 新陣列 作為第一個  (遞減)  
    <script>
        var arr = ['red', 'green', 'blue', 'pink', 'purple'];
        var newArr = [];
        for (var i = arr.length - 1; i >= 0; i--) {
            newArr[newArr.length] = arr[i];
        }
        console.log(newArr);
    </script>

 

案例:陣列排序 交換相鄰兩個變數(冒泡排序)

冒泡排序:一種演算法,把一系列資料按照一定的順序排列,依次比較相鄰兩個元素;

    <script>
        var arr = [5, 4, 3, 2, 1];
        for (var i = 0; i <= arr.length - 1; i++) { // 外層交換趟數 5個元素交換4趟
            for (var j = 0; j <= arr.length - i - 1; j++) 
                //里層回圈 負責每一趟的交換次數
            {
                // 內部交換2個變數的值 前一個和后面一個陣列元素相比較
                if (arr[j] > arr[j + 1]) {
                    var temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        console.log(arr);
    </script>

 

 

8 - 函式

8.1 函式的概念

函式:就是封裝了一段可被重復呼叫執行的代碼塊

通過此代碼塊可以實作大量代碼的重復使用

8.2 函式的使用

函式使用分為兩步: 宣告函式 和 呼叫函式;

     // 1.宣告函式  函式名 命名為動詞
    // (1) function 宣告函式的關鍵字 全部小寫
     // (2) 函式是做某件事情,函式名一般是動詞 sayHi 
     // (3) 函式不呼叫自己不執行
    function 函式名() {
        //函式體代碼
    }
// 2.呼叫函式 函式名(); // 通過呼叫函式名來執行函式體代碼 函式不呼叫 自己不執行 function sayHi() { console.log('hi~~'); } sayHi();

 

注意:宣告函式本身并不會執行代碼,只有呼叫函式時才會執行函式體代碼,

案例:利用函式封裝計算1-100累加和

        // 1.宣告函式
        function getSum(num1,num2) {
            var sum = 0;// 準備一個變數,保存數字和
            for (var i = num1; i <= num2; i++) {
                sum += i;// 把每個數值 都累加 到變數中
            }
            alert(sum);
        }
        // 2.呼叫函式
        getSum(1,100);

 

8.3 函式的引數

  • 形參:形式上的引數 宣告函式時定義 可看做不用宣告的變數

  • 實參:實際上的引數 函式呼叫時傳遞的 最終實參傳遞給形參

函式引數的運用:

        // 1.函式宣告 宣告形參
        function 函式名(形參1, 形參2, 形參3...) {
            // 函式體
        }
        // 2.函式呼叫 呼叫實參
        函式名(實參1, 實參2, 實參3...); 

        // 宣告函式
        function getSum(num1, num2) {
            console.log(num1 + num2);
        }
        // 呼叫函式
        getSum(1, 3); // 4 先將實參傳遞給形參 在執行函式體
        getSum(6, 5); // 11

 

函式形參和實引數量不匹配時

引數個數說明
實參個數等于形參個數 輸出正確結果
實參個數多于形參個數 值取到形參個數
實參個數小于形參個數 多的形參定義為undefined,結果NaN
注意:在JavaScript中,形參的默認值是undefined,

案例:函式的執行

// 1.函式可以重復相同的代碼
    function cook() {
        console.log('hello');
    }
    cook();

// 2.也可以利用函式的引數 實作函式重復不同的代碼
    function 函式名(形參1,形參2...) { // 宣告的小括號里是形參 形式上的
        
    }
    函式名(實參1,實參2...);// 函式呼叫的小括號里是實參 實際的

    function cook(aru) { // 形參是接收實參的 aru='hello' 相當于一個不用宣告的變數
        console.log(aru);
    }
    cook('hello');// 形參和實參個數盡量相匹配
// 1.利用函式求任意兩個數之間的和
    function getSum(num1,num2) {
        console.log(num1 + num2);
    }
    getSum(1, 3);
    getSum(2, 6);
// 2.利用函式求任意兩個數之間的累加和 function getSum(start, end) { var sum = 0; for (var i = start; i <= end; i++) { sum += i; } console.log(sum); } getSum(1, 100);

 

8.4 函式的回傳值return

return 陳述句

函式只是用來做某件事或實作某種功能,最終的結果需要回傳給函式的呼叫者;
只要函式遇到return 就把后面的結果 回傳給函式的呼叫者  函式名()= return + 后面
   // 宣告函式
    function 函式名(){
        ...
        return  需要回傳的值;
    }
    // 呼叫函式
    函式名();// 此時呼叫函式就可以得到函式體內return 后面的值

    // 宣告函式
    function sum(){
     ...
     return 666;
    }
    // 呼叫函式
    sum(); // 此時sum = 666,return 陳述句會把自身后面的值回傳給呼叫者

 

  • 在使用 return 陳述句時,函式會停止執行,并回傳指定的值

  • 如果函式沒有 return ,回傳的值是 undefined

    // 1.利用函式求任意兩個數之和
        function getResult(num1,num2) {
            return num1 + num2;
        }
        //getResult();// getResult = num1+num2
        console.log(getResult(1,2));

    // 2.利用函式求兩個數中最大值
        function getMax(num1,num2) {
            // if (num1 > num2) {
            //     return num1;
            // } else {
            //     return num2;
            return num1 > num2 ? num1 : num2;
        }
        console.log(getMax(1, 3));

    // 3.利用函式求陣列中的最大值
        function getArrMax(arr) { // arr接收一個陣列
            var max = arr[0];
            for (var i = 1; i<=arr.length; i++) {
                if (arr[i] > max) {
                    max = arr[i];
                }
            }
            return max;
        }
        // getArrMax([1,2,3,4,5]);// 實參是一個陣列
        // 實際開發中,常用一個變數 來接收 函式的回傳結果
        var re = getArrMax([1,2,3,4,5]);
        console.log(re);

 

return函式注意事項:

// 1.return 終止函式
        function getSum(num1, num2) {
            return num1 + num2;
            alert('這條陳述句不被執行');//return結束,后面的代碼不被執行
        }

        // 2.return 只能回傳一個值
        function fn(num1, num2) {
            return num1, num2;// return回傳的結果是最后一個值 num2
        }
        console.log(fn(1, 2));

        // 3.求任意兩個數的 加減乘除結果
        function getResult(num1, num2) { // 想要輸出多個值return 可以回傳陣列
            return [num1 + num2, num1 - num2, num1 * num2, num1 / num2];
        }
        var re = getResult(1, 2);
        console.log(re);

        // 4. 我們的函式如果有return 則回傳的是 return 后面的值,如果函式么有 return 則回傳 undefined
           console.log(fun1()); // 回傳 666
        function fun2() {

        }
        console.log(fun2()); // 函式回傳的結果是 undefined

 

退出回圈

break ,continue ,return 的區別

  • break :結束當前的回圈體(如 for、while)

  • continue :跳出本次回圈,繼續執行下次回圈(如 for、while)

  • return :不僅可以退出回圈,還能夠回傳 return 陳述句中的值,同時還可以結束當前的函式體內的代碼

 

8.5 arguments的使用

當不確定有多少個引數傳遞的時候,可以用 arguments 來獲取,

arguments物件中存盤了傳遞的所有實參,是當前函式的一個內置物件,函式獨有的;

  <script>
        // arguments 的使用  只有函式才有 arguments物件  而且是每個函式都內置好了這個arguments
        function fn() {
            // console.log(arguments); // 里面存盤了所有傳遞過來的實參  arguments = [1,2,3]
            // console.log(arguments.length);
            // console.log(arguments[2]);
            // 我們可以按照陣列的方式遍歷arguments
            for (var i = 0; i < arguments.length; i++) {
                console.log(arguments[i]);
            }
        }
        fn(1, 2, 3);
        fn(1, 2, 3, 4, 5);
        // 偽陣列 并不是真正意義上的陣列
        // 1. 具有陣列的 length 屬性
        // 2. 按照索引的方式進行存盤的
        // 3. 它沒有真正陣列的一些方法 pop()  push() 等等
    </script>

 

注意:在函式內部使用該物件,用此物件獲取函式呼叫時傳的實參,

案例:利用函式求任意個數的最大值

 <script>
        // 利用函式求任意個數的最大值
        function getMax() { // arguments = [1,2,3]
            var max = arguments[0];
            for (var i = 1; i < arguments.length; i++) {
                if (arguments[i] > max) {
                    max = arguments[i];
                }
            }
            return max;
        }
        console.log(getMax(1, 2, 3));
        console.log(getMax(1, 2, 3, 4, 5));
        console.log(getMax(11, 2, 34, 444, 5, 100));
    </script>

 

案例:

<script>
        // 1.利用函式封裝方法 翻轉任意陣列 reverse 翻轉
        function reverse(arr) {
            var newArr = [];
            for (var i = arr.length - 1; i >= 0; i--) {
                newArr[newArr.length] = arr[i];
            }
            return newArr;
        }
        var arr1 = reverse([1, 2, 3, 4, 5]);
        console.log(arr1);

        // 2.利用函式封裝的方法,對陣列排序--冒泡排序
        function sort(arr) {
            for (var i = 0; i < arr.length - 1; i++) {
                for (var j = 0; j < arr.length - i - j; j++) {
                    if (arr[j] > arr[j + 1]) {
                        var temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }
            return arr;
        }
        var arr2 = sort([1, 2, 3, 4, 5]);
        console.log(arr2);

        // 3.判斷閏年
        function isRunYear(year) {
            // 如果是閏年回傳 true 否則回傳false
            var flag = flase;
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                flag = true;
            }
            return flag;
        }
        console.log(isRunYear(2000));
        console.log(isRunYear(1999));
    </script>

 

函式之間可以相互呼叫:

函式內部可以呼叫另一個函式;

    <script>
        // 函式是可以相互呼叫的
        // function fn1() {
        //     console.log(11);
        //     fn2(); // 在fn1 函式里面呼叫了 fn2 函式
        // }
        // fn1();

        // function fn2() {
        //     console.log(22);

        // }
        </script>

 

在同一作用域代碼中,函式名即代表封裝的操作,使用函式名加括號即可以將封裝的操作執行,

案例:輸出當年年的2月份天數

<script>
        // 用戶輸入年份,輸出當年年的2月份天數
        function backDay() {
            var year = prompt('請您輸入年份');
            if (isRunYear(year)) {
                alert('當前年份是閏年 2月份有29天');
            } else {
                alert('當前年份是平年 2月份有28天');
            }
        }
        backDay();
        // 判斷是否為閏年的函式
        function isRunYear(year) {
            var flag = false;
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                flag = true;
            }
            return flag;
        }
    </script>

 

 

8.6 函式的兩種宣告方式

1、自定義函式方式(命名函式)

利用函式關鍵字 function 自定義函式方式

    // 宣告定義方式
    function fn() {...}
    // 呼叫 呼叫函式的代碼既可以放到宣告函式的前面,也可以放在宣告函式的后面
    fn();

 

2、函式運算式方式(匿名函式)

        // var 變數名 = function () { }
        var fun = function () {
            console.log('我是函式運算式');
        }
        fun();

 

  • fun是變數名 不是函式名

  • 函式運算式 宣告方式和 宣告變數差不多,只不過變數里存的是值 而 函式運算式里存的是函式

  • 函式呼叫的代碼必須寫到函式體后面

  • 函式運算式也可以進行傳遞引數

 

9 - 作用域

9.1 作用域概述

作用域:變數能夠起作用和效果的 某個范圍
目的:為了提高程式的可靠性 更重要的作用是減少命名沖突
全域作用域和區域作用域命名不沖突

9.2 作用域的分類

JavaScript(es6前)中的作用域有兩種:

  • 全域作用域

  • 區域作用域(函式作用域)

1.全域作用域

	作用于所有代碼執行的環境(整個script標簽內部)或獨立的js檔案,或者var宣告的,
	如果在函式內部沒有宣告,直接賦值的變數也屬于全域變數,一般不用console.log();
	全域變數只有瀏覽器關閉時才會結束,占資源;

2.區域作用域

	作用于函式內的代碼環境,就是區域作用域(函式作用域) 
	在函式內部的作用域,這個代碼名字只在函式內部起作用 
	function fn { 區域作用域 };
	函式的形參也可以看做區域變數;區域變數在代碼執行完畢后就結束;

3.es6新增塊級作用域

js在es6中新增塊級作用域,塊作用域由 { } 包括 如if{} for{}等
在其他編程語言中(如 java、c#等),在 if 陳述句、回圈陳述句中創建的變數,僅僅只能在當前 if 陳述句、當前回圈陳述句中使用
  • java有塊級作用域:

if(true){
  int num = 123;
  system.out.print(num);  // 123
}
system.out.print(num);    // 報錯

 

以上java代碼會報錯,是因為代碼中 { } 即一塊作用域,其中宣告的變數 num,在 “{ }” 之外不能使用;

而與之類似的JavaScript代碼,則不會報錯,

  • js中沒有塊級作用域(在ES6之前)

if(true){
  var num = 123;
  console.log(123); //123
}
console.log(123);   //123

 

 

9.3 - 變數的作用域

在JavaScript中,根據作用域的不同,變數可以分為兩種:

  • 全域變數

  • 區域變數

1.全域變數

在全域作用域下宣告的變數叫做全域變數(在函式外部定義的變數),
注意 如果在函式內部 沒有宣告直接賦值的變數也屬于全域變數
  • 全域變數在代碼的任何位置都可以使用

  • 在全域作用域下 var 宣告的變數 是全域變數

  • 特殊情況下,在函式內不使用 var 宣告的變數也是全域變數(不建議使用)

2.區域變數

在區域作用域下宣告的變數叫做區域變數(在函式內部定義的變數)
注意: 函式的形參也可以看做是區域變數
  • 區域變數只能在該函式內部使用

  • 在函式內部 var 宣告的變數是區域變數

  • 函式的形參實際上就是區域變數

3.全域變數和區域變數的區別

  • 全域變數:在任何一個地方都可以使用,只有在瀏覽器關閉時才會被銷毀,因此比較占記憶體;

  • 區域變數:只在函式內部使用,當其所在的代碼塊被執行時,會被初始化;當代碼塊運行結束后,就會被銷毀,因此更節省記憶體空間;

 

9.4 - 作用域鏈

根據在內部函式可以訪問外部函式變數的這種機制,用鏈式查找決定哪些資料能被內部函式訪問,就稱作作用域鏈,

案例分析1:
function f1() { // 外部函式
    var num = 123;
    function f2() {
        console.log( num );// 站在目標出發,一層一層的往外查找
    }
    f2(); // 內部函式
}
var num = 456;
f1();

 

案例:

作用域鏈:采取就近原則的方式來查找變數最終的值
var a = 1;
function fn1() {
    var a = 2;
    var b = '22';
    fn2();
    function fn2() {
        var a = 3;
        fn3();
        function fn3() {
            var a = 4;
            console.log(a); //a的值 ?
            console.log(b); //b的值 ?
        }
    }
}
fn1();
 

        // 作用域鏈
        var num = 10;
        function fn() {
            var num = 20;// 根據作用域鏈機制 先呼叫上一級的
            function fun() {
                console.log(num);// 內部函式可以呼叫外部函式 屬于子集
            }
        }

        function f1() {
            var num = 123;
            function f2() {
                console.log(num);// 站在目標出發一層層往外查找 num=123 近
            }
            f2();
        }
        var num = 456;
        f1();

 

 

預決議

1.1 預決議的相關概念

JavaScript 代碼是由瀏覽器中的 JavaScript 決議器來執行的,

JavaScript 決議器在運行 JavaScript 代碼的時候分為兩步:預決議和代碼執行,

預決議:  js引擎會把js里所有的 var 還有 function 提升到當前作用域的最前面,預決議也叫做變數、函式提升,
代碼執行: 按照代碼抒寫的順序從上到下執行

注意:預決議會把變數和函式的宣告在代碼執行之前執行完成,

 

1.2 預決議分類

預決議分為變數預決議(變數提升) 和 函式預決議(函式提升)

變數提升:變數的宣告會被提升到當前作用域的最上面,變數的 賦值 不會提升,
函式提升:函式的宣告會被提升到當前作用域的最上面,但是不會呼叫函式,

預決議分為變數預決議(變數提升) 和 函式預決議(函式提升)

 // 1.未宣告 直接呼叫  報錯
        console.log(num);

        // 2.先呼叫 后宣告  undefined 坑1
        // 變數預決議(變數提升)宣告提升,賦值不提
        console.log(num);
        var num = 10;
        // 預決議后相當于:
        var num; // 只宣告 未賦值 undefine
        console.log(num);
        num = 10;

        // 3.利用關鍵字定義函式 函式先呼叫后宣告 或 先宣告后呼叫 無影響
        // 函式預決議(函式提升)
        fn();
        function fn() {
            console.log(11);
        }
        // 預決議后相當于:把函式提升到最前面

        // 4.利用函式運算式定義函式 只能先宣告后呼叫 否則會報錯
        // 解決函式運算式宣告呼叫問題
        var fun = function () {
            console.log(22);
        }
        // 預決議后相當于:
        var fun;
        fun();
        fun = function() {
            console.log(22);
        } 

 

案例:

// 1.
        var num = 10;
        fun();
        function fun() {
            console.log(num);
            var num = 20;
        }
    // 函式提升后 相當于以下代碼   輸出undefined
        var num;
        function fun() {
            var num; // 只宣告 未賦值 undefined
            console.log(num);
            num = 20;
        }
        num = 10;
        fun();

    // 4.
        f1();
        console.log(c);
        console.log(b);
        console.log(a);
        function f1() {
            var a = b = c = 9;
            console.log(a);
            console.log(b);
            console.log(c);
        }
    // 相當于以下代碼
        function f1() {
            //var a = b = c = 9;
            // 相當于 var a = 9;b = 9;c = 9;//b c 直接賦值 沒有var宣告 相當于全域變數
            // 集體宣告應該是 var a  =9,b = 9,c = 9;
            var a;
            a = b = c = 9;
            console.log(c);// 9
            console.log(b);// 9
            console.log(a);// 報錯 a當區域變數看 只宣告
        }

 

 

物件

1.1 物件的相關概念

1、什么是物件?

物件是指具體的事物,如字串、數值、陣列函式等;萬物皆物件;

物件是由屬性和方法組成的:

  • 屬性:事物的特征,在物件中用屬性來表示(常用名詞)

  • 方法:事物的行為,在物件中用方法來表示(常用動詞)

2、為什么需要物件?

保存一個值用變數;保存多個值,可以使用陣列;保存一個人的完整資訊可以用物件(相當于C語言結構體);

  • 物件可以讓代碼結構更清晰

  • 物件屬于復雜資料型別object,

  • 本質:物件就是一組無序的相關屬性和方法的集合,

  • 建構式泛指某一大類,比如蘋果,不管是紅色蘋果還是綠色蘋果,都統稱為蘋果,

  • 物件實體特指一個事物,比如這個蘋果、正在給你們講課的pink老師等,

  • for...in 陳述句用于對物件的屬性進行回圈操作,

 

變數、屬性、函式、方法的區別

相同點 他們都是用來存盤資料的;

  • 變數:單獨宣告賦值,使用的時候直接寫變數名 單獨存在

  • 屬性:物件里面的變數稱為屬性,不需要宣告,用來描述物件特征 物件.屬性;

    屬性是物件的一部分,而變數不是物件的一部分,變數是單獨存盤資料的容器

  • 函式:單獨存在的,通過“函式名()”的方式就可以呼叫

  • 方法:物件里面的函式稱為方法,方法不需要宣告,使用“物件.方法名()”的方式就可以呼叫;

    方法是物件的一部分,函式是單獨封裝操作的容器

    函式和方法的相同點 都是實作某種功能 做某件事

// 變數和屬性的相同點 都是用來存盤資料的
        // 1.變數 單獨宣告并賦值 使用的時候直接寫變數名 單獨存在
        var name = 10;
        // 2.屬性 在物件里不需要宣告 呼叫的時候必須是 物件.屬性
        var obj = {
            age: 18
        }
        console.log(obj.age);

        // 函式和方法的相同點 都是實作某種功能 做某件事
        // 3.函式是單獨宣告 并且呼叫的 函式名() 單獨存在的
        function fn() {

        }
        // 4.方法 在物件里面 呼叫的時候 物件.方法()
        var obj = {
            age: 18
            fn: function () {

            }
        }

 

小括號()優先級;中括號[ ]陣列;花括號{ }物件

1.2 創建物件的三種方式

  • 利用字面量創建物件;

  • 利用new object創建物件;

  • 利用建構式創建物件;

1、利用字面量創建物件

    <script>
        // 1.利用 字面量 創建物件 利用鍵值對形式 屬性名 :屬性值 ,中間 逗號 隔開
            
        var obj = {};
        var obj = {
            uname: '張三瘋', // 里面的屬性或方法采取鍵值對的形式 鍵 屬性名 :值 屬性值
            age: '18',       // 多個屬性或者方法中間用逗號隔開
            sex: '男',
            sayHi: function () {    // 方法冒號后面跟的是一個匿名函式 function
                console.log('hi~');
            }
        }

        // 2.呼叫物件
        
        console.log(obj.name); // 呼叫物件的屬性 采用 物件名.屬性名 理解為 的
        console.log(obj['age']); // 呼叫屬性還有一種方法 物件名['屬性名']    
        obj.sayHi(); // 呼叫物件的方法 sayHi  物件名.方法名()
    </script>

 

2、利用 new Object 創建物件

        // 利用 new Object 創建物件 利用 等號 = 賦值的方法 添加物件的屬性和方法
        var obj = new Object();// 創建一個空的物件
        obj.uname = '張三瘋'; // 利用 等號 = 賦值的方法 添加物件的屬性和方法
        obj.age = 18;        // 每個屬性和方法之間用分號結束
        obj.sayHi = function () {
            console.log('hi~');
        }
        console.log(obj.uname);
        console.log(obj['sex']);
        obj.sayHi();   

 

3、利用建構式創建物件

因為前面兩種方式一次只能創建一個物件;

  • 建構式就是把 我們物件里一些相同的屬性和方法抽象出來封裝到函式中;

  • 建構式用于創建某一類函式,首字母要大寫;與關鍵字 new 一起使用;

  • 利用建構式創建物件的程序稱為物件的實體化

    <script>
        // 利用建構式創建物件
        // 需要創建四大天王的物件 相同的屬性: 名字 年齡 性別 相同的方法:唱歌
        function 建構式名() {
            this.屬性 = 值;
            this.方法 = function () { }
        }
        new 建構式名();
// 1.建構式 泛指一大類
        function Star(uname, age, sex) { // 建構式首字母大寫
            this.name = uname;
            this.age = age;
            this.sex = sex;
            this.sing = function (sang) {
                console.log(sang);
            }
        }
// 2.物件 特指某一個 物件的實體化
        var ldh = new Star('劉德華', 18, '男');
        // 多了個 this 和new 不需要 return 就可以回傳結果
        // console.log(typeof ldf); // object
        console.log(ldh.name);
        console.log(ldh['sex']);
        ldh.sing('冰雨');
    </script>
        // 1. 建構式名字首字母要大寫
        // 2. 我們建構式不需要return 就可以回傳結果
        // 3. 我們呼叫建構式 必須使用 new
        // 4. 我們只要new Star() 呼叫函式就創建一個物件 ldh  {}
        // 5. 我們的屬性和方法前面必須添加 this

 

 

建構式和物件的區別:

  • 建構式 如明星 泛指一大類 類似于java語言中的類

  • 物件 特指 是一個具體的事物

我們利用建構式創建物件的程序我們也稱為物件的實體化

 

new關鍵字:

  • new 建構式可以 在記憶體中創建了一個空的新物件;

  • 讓this就會指向剛才的空物件

  • 執行建構式里面的代碼 給這個空物件添加屬性和方法

  • 回傳這個新物件(所以不需return)

var ldh = new Star('劉德華', 18, '男');

 

1.3 遍歷物件

for...in 陳述句用于對陣列或者物件的屬性進行回圈操作,

for (變數 in 物件名字) {
    // 在此執行代碼
}

 

變數通常用 k 或者 key

         // for (變數 in 物件) { }
        for (var k in obj) {
            console.log(k);// k變數輸出 得到的是 屬性名
            console.log( obj[k] );// 得到的是 屬性值
        }

 

 

1.4 內置物件

1.41內置物件的概念

  • JavaScript 中的物件分為3種:自定義物件 、內置物件、 瀏覽器物件

  • 前面兩種物件是JS 基礎 內容,屬于 ECMAScript; 第三個瀏覽器物件屬于我們 JS 獨有的, 我們JS API 講解

  • 內置物件就是指 JS 語言自帶的一些物件,這些物件供開發者使用,并提供了一些常用的或是最基本而必要的功能(屬性和方法)

  • 內置物件最大的優點就是幫助我們快速開發

  • JavaScript 提供了多個內置物件:Math、 Date 、Array、String等

 

1.42 MDN檔案查閱!

查找檔案:學習一個內置物件的使用,只要學會其常用成員的使用即可,我們可以通過查檔案學習,可以通過MDN/W3C來查詢, ? Mozilla 開發者網路(MDN)提供了有關開放網路技術(Open Web)的資訊,包括 HTML、CSS 和萬維網及 HTML5 應用的 API, ? MDN:https://developer.mozilla.org/zh-CN/

 

Math物件

1.Math 概述

Math 物件不是建構式,所以我們不需要new 來呼叫 而是直接使用里面的屬性和方法即可,它具有數學常數和函式的屬性和方法,跟數學相關的運算(求絕對值,取整、最大值等)可以使用 Math 中的成員,

屬性、方法名功能
Math.PI 圓周率
Math.floor() 向下取整
Math.ceil() 向上取整
Math.round() 四舍五入版 就近取整 注意 -3.5 結果是 -3
Math.abs() 絕對值
Math.max()/Math.min() 求最大和最小值
Math.random() 獲取范圍在[0,1)內的隨機值

注意:上面的方法使用時必須帶括號

        // Math 三個取整的方式
        // (1) Math.floor() 地板 向下取整 往小了取值
        console.log(Math.floor(1.9));// 1
        // (2) Math.ceil()  天花板 向上取整 往大了取值
        console.log(Math.ceil(1.1));// 2
        // (3) Math.round() 四舍五入 其他數字都是四舍五入 5往大了取
        console.log(Math.round(1.1));// 1
        console.log(Math.round(1.5));// 2
        console.log(Math.round(-1.1));// -1
        console.log(Math.round(-1.5));// -1

        
         // Math 數學物件 不是一個建構式,不需要 new 呼叫 直接使用里面的屬性和方法
        console.log(Math.PI);// 一個屬性 圓周率
        console.log(Math.abs(-1));// 1 絕對值
        console.log(Math.max(1, 33, 99));// 99
        console.log(Math.max('pink'));// NaN
        console.log(Math.max());//

        // 利用物件封裝自己的數學物件 里面有PI最大值和最小值
        var myMath = {
            PI: 3.1415926,
            max: function () {
                var max = arguments[0]; // 不確定傳遞過來多少實參
                for (var i = 1; i < arguments.length; i++) {
                    if (arguments[i] > max) {
                        max = arguments[i];
                    }
                }
                return max;
            },
            min: function () {
                var min = arguments[0]; 
                for (var i = 1; i < arguments.length; i++) {
                    if (arguments[i] < min) {
                        min = arguments[i];
                    }
                }
                return min;
            }
        }
        console.log(myMath.PI);
        console.log(myMath.max(1, 5, 9));
        console.log(myMath.min(1, 5, 9));

 

2. 亂數方法 random()

random() 方法可以隨機回傳一個小數,其取值范圍是 [0,1),左閉右開 0 <= x < 1 ;

得到一個兩數之間的隨機整數,包括兩個數在內,

獲取指定范圍內的隨機整數演算法

function getRandom(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min; 
}

 

案例:Math物件亂數方法

        // 想要得到兩個數之間的隨機整數 并且包括這2個數
        // Math.floor(Math.random() * (max - min +1)) + min
        function getRandom(min, max) {
            return Math.floor(Math.random() * (max - min + 1)) + min;
        }
        console.log(getRandom(1, 10));
        // 隨機點名
        var arr = ['張三', '張三瘋', '張三瘋子', '李四', '李思思'];
        // console.log(arr[0]);
        console.log(arr[getRandom(0, arr.length - 1)]);

 

案例:猜數字游戲

程式隨機生成一個 1~ 10 之間的數字,并讓用戶輸入一個數字,

案例分析

① 隨機生成一個1~10 的整數 我們需要用到 Math.random() 方法,

② 需要一直猜到正確為止,所以一直回圈,

③ 用while 回圈合適更簡單,

④ 核心演算法:使用 if else if 多分支陳述句來判斷大于、小于、等于,

    <script>
        function getRandom(min, max) {
            return Math.floor(Math.random() * (max - min + 1)) + min;
        }

        var random = getRandom(1, 10);
        while (true) { // 死回圈
            var num = prompt('你來猜?輸入1~10之間的一個數字');
            if (num > random) {
                alert('你猜大了');
            } else if (num < random) {
                alert('你猜小了');
            } else {
                alert('你猜對了');
                break;// 退出整個回圈 一定要寫結束回圈條件
            }
        }
    </script>

 

如果限定猜的次數,可以在條件判斷改為for

日期物件

Date 物件和 Math 物件不一樣,

Date是一個建構式,使用時需要實體化后(new)才能使用其中具體方法和屬性 Date 實體用來處理日期和時間

1.使用Date實體化日期物件

  • 獲取當前時間必須實體化:

var now = new Date();
console.log(now);

 

  • 獲取指定時間的日期物件

var future = new Date('2019/5/1');
如果Date()不寫引數,就回傳當前時間
如果Date()里面寫引數,就回傳括號里面輸入的時間

注意:如果創建實體時并未傳入引數,則得到的日期物件是當前時間對應的日期物件

        // Date() 日期物件 是一個建構式 必須使用new 來呼叫創建日期物件
        var arr = new Array();// 創建了一個陣列物件
        var obj = new Object();//創建了一個新的物件實體

        // 1.使用Date 如果沒有引數 回傳當前系統的當前時間
        var date = new Date();
        console.log(date);
        // 2.引數常用寫法 數字型 2019,10,01 或者 字串型 '2019-10-1 8:8:8'
        var date1 = new Date(2019, 10, 1);
        console.log(date1);// 回傳的是 11月 不是 10月
        var date1 = new Date('2019-10-1 8:8:8');
        console.log(date2);

 

2.使用Date實體的方法和屬性 日期格式化

方法名說明代碼
getFullYear() 獲取當年 getFullYear()
getMonth() 獲取當月(0-11) getMonth()
getDate() 獲取當前日期 getDate()
getDay() 獲取星期幾(周日為0) getDay()
getHours() 獲取當前小時 getHours()
getMinutes() 獲取當前分鐘 getMinutes()
getSeconds() 獲取當前秒鐘 getSeconds()

 

案例: 輸出當前日期

請寫出這個格式的日期:2019年5月1日 星期三

    <script>
        // 格式化日期 年月日 手動更改顯示
        var date = new Date();
        console.log(date.getFullYear());// 回傳當前日期的年 2019
        console.log(date.getMonth() + 1); // 月份 回傳的月份小1個月 月份寫時加1
        console.log(date.getDate()); // 回傳的是 幾號
        console.log(date.getDay()); // 3 周榷訓傳的是0
        // 寫一個 2019年 5月 1日 星期三
        var year = date.getFullYear();
        var month = date.getMonth();
        var dates = date.getDate();
        var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
        var day = date.getDay();
        console.log('今天是:' + year + '年' + month + '月' + dates + '日' + arr[day]);
    </script>

 

案例: 輸出當前時間

寫一個函式,格式化日期物件,成為 HH:mm:ss 的形式 比如 00:10:45

    <script>
        // 格式化日期 時分秒
        var date = new Date();
        console.log(date.getHours());//
        console.log(date.getMinutes()); //
        console.log(date.getSeconds()); //
        // 要求封裝一個函式回傳當前的時分秒 格式 08:08:08
        function getTime() {
            var time = new Date();
            var h = time.getHours();
            h = h < 10 ? '0' + h : h;
            var m = time.getMinutes();
            m = m < 10 ? '0' + m : m;
            var s = time.getSeconds();
            s = s < 10 ? '0' + s : s;
            return h + ':' + m + ':' + s;
        }
        console.log(getTime());
    </script>

 

 

3.通過Date實體獲取總毫米數

總毫秒數的含義:基于1970年1月1日(世界標準時間)起的毫秒數

毫秒數也叫時間戳,永遠不會重復;

案例:獲取總毫秒數

    <script>
        // 獲得 Date總的毫秒數 不是當前時間的毫秒數 而是距離1970年1月1日
      
        var date = new Date();// 實體化Date物件
        // 1. 通過 valueOf()  getTime() 用于獲取物件的原始值
        console.log(date.valueOf());// 距離 1970 過了多少毫秒
        console.log(date.getTime());

        // 2. 簡單的寫法(常用)
        var date1 = +new Date();// +new Date() 回傳的是總毫秒數
        console.log(date1);

        // 3. HTML5新增的的方法,有兼容性問題
        console.log(Date.now());
    </script>

 

案例:倒計時效果

案例分析

① 核心演算法:輸入的時間減去現在的時間就是剩余的時間,即倒計時 ,但是不能拿著時分秒相減,比如 05 分減去25分,結果會是負數的,

② 用時間戳(毫秒)來做,用戶輸入時間總的毫秒數減去現在時間的總的毫秒數,得到的就是剩余時間的毫秒數,

③ 把剩余時間總的毫秒數轉換為天、時、分、秒 (時間戳轉換為時分秒)

轉換公式如下:

? d = parseInt(總秒數/ 60/60 /24); // 計算天數

? h = parseInt(總秒數/ 60/60 %24) // 計算小時

? m = parseInt(總秒數 /60 %60 ); // 計算分數

? s = parseInt(總秒數%60); // 計算當前秒數

    <script>
        function countDown(time) {
            var nowTime = +new Date();// 回傳的是當前時間的總毫秒數
            var inputTime = +new Date(time);// 回傳的是用戶輸入事件的總毫秒數
            var times = (inputTime - nowTime) / 1000; // times是剩余時間總的秒數 1s=1000ms
            var d = parseInt(times / 60 / 60 / 24);//
            d = d < 10 ? '0' + d : d;
            var h = parseInt(times / 60 / 60 % 24);//
            h = h < 10 ? '0' + h : h;
            var m = parseInt(times / 60 % 60);//
            m = m < 10 ? '0' + m : m;
            var s = parseInt(times % 60);//
            s = s < 10 ? '0' + s : s;
            return d + '天' + h + '時' + m + '分' + s + '秒';
        }
        console.log(countDown('2019-5-1 18:00:00'));
        var date = new Date();
        console.log(date);
    </script>

 

 

陣列物件

1.創建陣列的兩種方式

  • 字面量方式

       var arr = [1, 2, 3];
            console.log(arr[0]);

     

  • new Array() 建構式

        // var arr1 = new Array();  // 創建了一個空的陣列
            // var arr1 = new Array(2);  // 這個2 表示 陣列的長度為 2  里面有2個空的陣列元素 
            var arr1 = new Array(2, 3); // 等價于 [2,3]  這樣寫表示 里面有2個陣列元素 是 2和3
          console.log(arr1);

     

    注意:上面代碼中arr創建出的是一個空陣列,如果需要使用建構式Array創建非空陣列,可以在創建陣列時傳入引數

    引數傳遞規則如下:

    • 如果只傳入一個引數,則引數規定了陣列的長度

    • 如果傳入了多個引數,則引數稱為陣列的元素

2.檢測是否為陣列

  • instanceof 運算子

    instanceof 可以判斷一個物件是否是某個建構式的實體

    var arr = [1, 23];
    var obj = {};
    console.log(arr instanceof Array); // true arr是陣列
    console.log(obj instanceof Array); // false obj是物件

     

  • Array.isArray()

    Array.isArray()用于判斷一個物件是否為陣列,isArray() 是 HTML5 中新增的方法 ie9以上不支持

    var arr = [1, 23];
    var obj = {};
    console.log(Array.isArray(arr));   // true
    console.log(Array.isArray(obj));   // false

     

翻轉陣列:

  // 翻轉陣列
        function reverse(arr) {
            // if (arr instanceof Array) {
            if (Array.isArray(arr)) {
                var newArr = [];
                for (var i = arr.length - 1; i >= 0; i--) {
                    newArr[newArr.length] = arr[i];

                }
                return newArr;
            } else {
                return 'error 這個引數要求必須是陣列格式 [1,2,3]'
            }
        }
        console.log(reverse([1, 2, 3]));
        console.log(reverse(1, 2, 3));

 

3.添加洗掉陣列元素的方法

陣列中有進行增加、洗掉元素的方法,部分方法如下表

方法名說明回傳值
push(引數1...) 末尾添加一個或多個元素,注意修改原陣列 并回傳新的長度
pop() 洗掉陣列最后一個元素,把陣列長度減1 無引數、修改原陣列 回傳他洗掉的元素的值
unshift(引數1...) 向陣列的開頭添加一個或多個元素,注意修改原陣列 并回傳新的長度
shift() 洗掉陣列的第一個元素,陣列長度減1無引數,修改原陣列 并回傳第一個元素得值

注意:push、unshift為增加元素方法;pop、shift為洗掉元素的方法

案例:添加洗掉陣列元素

   <script>
        // 添加洗掉陣列元素方法
        // 1. push() 在我們陣列的末尾 添加一個或者多個陣列元素   push  推
        var arr = [1, 2, 3];
        // arr.push(4, 'pink');
        console.log(arr.push(4, 'pink'));

        console.log(arr);
        // (1) push 是可以給陣列追加新的元素
        // (2) push() 引數直接寫 陣列元素就可以了
        // (3) push完畢之后,回傳的結果是 新陣列的長度 
        // (4) 原陣列也會發生變化
        // 2. unshift 在我們陣列的開頭 添加一個或者多個陣列元素
        console.log(arr.unshift('red', 'purple'));

        console.log(arr);
        // (1) unshift是可以給陣列前面追加新的元素
        // (2) unshift() 引數直接寫 陣列元素就可以了
        // (3) unshift完畢之后,回傳的結果是 新陣列的長度 
        // (4) 原陣列也會發生變化

        // 3. pop() 它可以洗掉陣列的最后一個元素  
        console.log(arr.pop());
        console.log(arr);
        // (1) pop是可以洗掉陣列的最后一個元素 記住一次只能洗掉一個元素
        // (2) pop() 沒有引數
        // (3) pop完畢之后,回傳的結果是 洗掉的那個元素 
        // (4) 原陣列也會發生變化
        // 4. shift() 它可以洗掉陣列的第一個元素  
        console.log(arr.shift());
        console.log(arr);
        // (1) shift是可以洗掉陣列的第一個元素 記住一次只能洗掉一個元素
        // (2) shift() 沒有引數
        // (3) shift完畢之后,回傳的結果是 洗掉的那個元素 
        // (4) 原陣列也會發生變化
    </script>
</head>

 

案例: 篩選陣列

有一個包含工資的陣列[1500, 1200, 2000, 2100, 1800],要求把陣列中工資超過2000的洗掉,剩余的放到新陣列里面

    var arr = [1500, 1200, 2000, 2100, 1800];
    var newArr = [];
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] < 2000) {
        // newArr[newArr.length] = arr[i];
         newArr.push(arr[i]);
         } 
    }
    console.log(newArr);

 

 

4.陣列排序

陣列中有對陣列本身排序的方法,部分方法如下表

方法名說明是否修改原陣列
reverse() 顛倒陣列中元素的熟悉怒,無引數 改變原來陣列 回傳新陣列
sort() 對陣列的元素進行排序 改變原陣列 回傳新陣列

 

注意:sort方法需要傳入引數來設定升序、降序排序

  • 如果傳入“function(a,b){ return a-b;}”,則為升序

  • 如果傳入“function(a,b){ return b-a;}”,則為降序

        // 陣列排序
        // 1. 翻轉陣列
        var arr = ['pink', 'red', 'blue'];
        arr.reverse();
        console.log(arr);

        // 2. 陣列排序(冒泡排序)
        var arr1 = [17, 4, 71, 6, 9];
        // arr1.sort();// 只能對單位數字排序
        arr1.sort(function (a, b) {
            return a - b;// 按照升序排列
            return b - a;// 按照降序排序
        });
        console.log(arr1);

 

 

5.陣列索引方法

陣列中有獲取陣列指定元素索引值的方法,部分方法如下表

方法名說明回傳值
indexOf() 陣列中查找給定元素的第一個索引 存在回傳索引,不存在,回傳-1
lastIndexOf() 在陣列中的最后一個索引 存在回傳索引,不存在,回傳-1

獲取陣列指定元素索引值

    <script>
        // 回傳陣列元素索引號方法  indexOf(陣列元素)  作用就是回傳該陣列元素的索引號 從前面開始查找
        // 它只回傳第一個滿足條件的索引號 
        // 它如果在該陣列里面找不到元素,則回傳的是 -1  
        // var arr = ['red', 'green', 'blue', 'pink', 'blue'];
        var arr = ['red', 'green', 'pink'];
        console.log(arr.indexOf('blue'));
        // 回傳陣列元素索引號方法  lastIndexOf(陣列元素)  作用就是回傳該陣列元素的索引號 從后面開始查找
        var arr = ['red', 'green', 'blue', 'pink', 'blue'];

        console.log(arr.lastIndexOf('blue')); // 4
    </script>

 

案例: 陣列去重(重點案例)

有一個陣列[‘c’, ‘a’, ‘z’, ‘a’, ‘x’, ‘a’, ‘x’, ‘c’, ‘b’],要求去除陣列中重復的元素

案例分析

① 目標:把舊陣列里面不重復的元素選取出來放到新陣列中,重復的元素只保留一個,放到新陣列中去重,

② 核心演算法:我們遍歷舊陣列,然后拿著舊陣列元素去查詢新陣列,如果該元素在新陣列里面沒有出現過,我們就添加,否則不添加,

③ 我們怎么知道該元素沒有存在? 利用 新陣列.indexOf(陣列元素) 如果回傳時 -1 就說明 新陣列里面沒有該元素

舊陣列['c', 'a', 'z', 'a', 'x', 'a', 'x', 'c', 'b']

新陣列 [ ]

    <script>
        // 陣列去重 ['c', 'a', 'z', 'a', 'x', 'a', 'x', 'c', 'b'] 要求去除陣列中重復的元素,
        // 1.目標: 把舊陣列里面不重復的元素選取出來放到新陣列中, 重復的元素只保留一個, 放到新陣列中去重,
        // 2.核心演算法: 我們遍歷舊陣列, 然后拿著舊陣列元素去查詢新陣列, 如果該元素在新陣列里面沒有出現過, 我們就添加, 否則不添加,
        // 3.我們怎么知道該元素沒有存在? 利用 新陣列.indexOf(陣列元素) 如果回傳時 - 1 就說明 新陣列里面沒有改元素
        // 封裝一個 去重的函式 unique 獨一無二的
        function unique(arr) {
            var newArr = [];
            for (var i = 0; i < arr.length; i++) {
                if (newArr.indexOf(arr[i]) === -1) {
                    newArr.push(arr[i]);
                }
            }
            return newArr;
        }
        // var demo = unique(['c', 'a', 'z', 'a', 'x', 'a', 'x', 'c', 'b'])
        var demo = unique(['blue', 'green', 'blue'])
        console.log(demo);
    </script>

 

 

6.陣列轉換為字串

陣列中有把陣列轉化為字串的方法,部分方法如下表

方法名說明回傳值
toString() 把陣列轉換成字串 逗號分割每一項 回傳一個字串
join('分隔符') 方法用于把陣列中的所有元素轉換為一個字串 回傳一個字串

注意:join方法如果不傳入引數,則按照 “ , ”拼接元素

        // 陣列轉換成字串
        // 1. toString() 
        var arr = [1, 2, 3];
        console.log(arr.toString());// 1,2,3
        // 2. join(分隔符)
        var arrr1 = ['green', 'blue', 'pink'];
        console.log(arr1.join());// green,blue,pink
        console.log(arr1.join('-'));// green-blue-pink
        console.log(arr1.join('&'));// green&blue&pink

 

 

其他方法

  • 陣列中還有其他操作方法,同學們可以在課下自行查閱學習

  • slice() 和 splice() 目的基本相同,建議同學們重點看下 splice()

方法名說明回傳值
concat() 連接兩個或多個陣列 不影響原陣列 回傳一個新的陣列
slice() 陣列截取 slice(begin,end) 回傳被截取專案的新陣列
splice() 陣列洗掉splice(第幾個開始,要洗掉個數) 回傳被洗掉專案的新陣列 影響原陣列

 

字串物件

1.基本包裝型別

為了方便操作基本資料型別,JavaScript 還提供了三個特殊的參考型別:String、Number和 Boolean,

基本包裝型別就是把 簡單資料型別 包裝成為 復雜資料型別,這樣基本資料型別就有了屬性和方法,

// 下面代碼有什么問題?
var str = 'andy';
console.log(str.length);

 

按道理簡單資料型別是沒有屬性和方法的,而物件才有屬性和方法,但上面代碼卻可以執行,這是因為js 會把基本資料型別包裝為復雜資料型別,其執行程序如下 :

    // 物件 才有 屬性和方法   復雜資料型別才有 屬性和方法 
    // 簡單資料型別為什么會有length 屬性呢? 
    // 基本包裝型別:  就是把簡單資料型別 包裝成為了 復雜資料型別 
// 1. 生成臨時變數,把簡單型別包裝為復雜資料型別
var temp = new String('andy');
// 2. 賦值給我們宣告的字符變數
str = temp;
// 3. 銷毀臨時變數
temp = null;

 

2.字串的不可變

	指的是里面的值不可變,雖然看上去可以改變內容,但只是地址變了,在記憶體中新開辟了一個記憶體空間, 原來的值還是有的;
	當重新給字串變數賦值的時候,變數之前保存的字串不會被修改,依然在記憶體中重新給字串賦值,會重新在記憶體中開辟空間,這個特點就是字串的不可變,
	

由于字串的不可變,在大量拼接字串的時候會有效率問題

var str = 'abc';
str = 'hello';
// 當重新給 str 賦值的時候,常量'abc'不會被修改,依然在記憶體中
// 重新給字串賦值,會重新在記憶體中開辟空間,這個特點就是字串的不可變
// 由于字串的不可變,在大量拼接字串的時候會有效率問題
var str = '';
for (var i = 0; i < 100000; i++) {
 str += i;
}
console.log(str); // 這個結果需要花費大量時間來顯示,因為需要不斷的開辟新的空間

3.根據字符回傳位置

字串的所有方法,都不會修改字符本身(字串是可變的),操作完成后會發揮成以個新的字串;

字串通過基本包裝型別可以呼叫部分方法來操作字串,以下是回傳指定字符的位置的方法:

方法名說明
indexOf('要查找的字符',開始的位置) 回傳指定內容在元字串中的位置,如果找不到回傳-1,開始的位置是index索引號
lastIndexOf() 從后往前找,值找第一個匹配的

 

 // 字串物件 根據字符回傳位置 str.indexOf('要查找的字符',[起始位置])
        var str = '改革春風吹滿地,春天來了';
        console.log(str.indexOf('春'));// 2
        console.log(str.indexOf('春', 3));// 從索引號是 3的位置開始往后查找 8

 

案例:回傳字符位置

查找字串"abcoefoxyozzopp"中所有o出現的位置以及次數

① 核心演算法:先查找第一個o出現的位置

② 然后 只要indexOf 回傳的結果不是 -1 就繼續往后查找

③ 因為indexOf 只能查找到第一個,所以后面的查找,利用第二個引數,當前索引加1,從而繼續查找

    <script>
        var str = "abcoefoxyozzopp";
        var index = str.indexOf('o'); // 從第一個o開始查找,回傳 索引號 3
        var num = 0;
        // console.log(idnex);
        while (index !== -1) {
            console.log(index);
            num++; // 開始尋找第二個 o
            index = str.indexOf('o', index + 1);
        }
        console.log('o出現的次數是:' + num);
    </script>

 

 

4.根據位置回傳字符

字串通過基本包裝型別可以呼叫部分方法來操作字串,以下是根據位置回傳指定位置上的字符:

方法名說明使用
charAt(index) 回傳指定位置的字符(index字串的索引號) str.charAt(0)
charCodeAt(index) 獲取指定位置處字符的ASII碼(index索引號) str.charCodeAt(0)
str[index] 獲取指定位置處字符 html/ie8+支持

 

在上述方法中,charCodeAt方法回傳的是指定位置上字符對應的ASCII碼,ASCII碼對照表如下:

        // 根據位置回傳字符
        // 1. charAt(index) 根據位置回傳字符
        var str = 'andy';
        console.log(str.charAt(3));// y
        // 遍歷所有字符
        for (var i = 0; i < str.length; i++) {
            console.log(str.charAt(i));
        }
        // 2. charCodeAt(index) 反應相應索引號的字符ASII值 目的:判斷用戶按下了哪個鍵
        console.log(str.charCodeAt(0));//97
        // 2. str[index] H5 新增的
        console.log(str[0]); // a

 

案例:回傳字符位

統計出現最多的字符和次數

判斷一個字串 'abcoefoxyozzopp' 中出現次數最多的字符,并統計其次數

1.核心演算法:利用 charAt() 遍歷這個字串

2.把每個字符都存盤給物件, 如果物件沒有該屬性,就為1,如果存在了就 +1

3.遍歷物件,得到最大值和該字符

注意:在遍歷的程序中,把字串中的每個字符作為物件的屬性存盤在物件總,對應的屬性值是該字符出現的次數

    <script>
        var str = 'abcoefoxyozzopp';
        var o = {};
        for (var i = 0; i < str.length; i++) {
            var chars = str.charAt(i);// chars是字串中的每一個字符
            if (o[chars]) { // o[chars]得到的是屬性值
                o[chars]++;
            } else {
                o[chars] = 1;
            }
        }
        console.log(o);
        // 2.遍歷物件
        var max = 0;
        var ch = '';
        for (var k in o) {
            // k得到的是 屬性名
            // o[k]得到的是屬性值
            if (o[k] > max) {
                max = o[k];
                ch = k;
            }
        }
        console.log(max);
        console.log('最多的字符是' + ch);
    </script>
    <script>
        // 有一個物件 來判斷是否有該屬性 物件['屬性名']
        var o = {
            age: 18
        }
        if (o['sex']) {
            console.log('里面有該屬性');

        } else {
            console.log('沒有該屬性');

        }

        //  判斷一個字串 'abcoefoxyozzopp' 中出現次數最多的字符,并統計其次數,
        // o.a = 1
        // o.b = 1
        // o.c = 1
        // o.o = 4
        // 核心演算法:利用 charAt() 遍歷這個字串
        // 把每個字符都存盤給物件, 如果物件沒有該屬性,就為1,如果存在了就 +1
        // 遍歷物件,得到最大值和該字符
        var str = 'abcoefoxyozzopp';
        var o = {};
        for (var i = 0; i < str.length; i++) {
            var chars = str.charAt(i); // chars 是 字串的每一個字符
            if (o[chars]) { // o[chars] 得到的是屬性值
                o[chars]++;
            } else {
                o[chars] = 1;
            }
        }
        console.log(o);
        // 2. 遍歷物件
        var max = 0;
        var ch = '';
        for (var k in o) {
            // k 得到是 屬性名
            // o[k] 得到的是屬性值
            if (o[k] > max) {
                max = o[k];
                ch = k;
            }
        }
        console.log(max);
        console.log('最多的字符是' + ch);
    </script>

 

5.字串操作方法

字串通過基本包裝型別可以呼叫部分方法來操作字串,以下是部分操作方法:

方法名說明
concat(str1,str2,str3...) 用于連接兩個或多個字串,拼接字串,等效于+(+常用)
substr(start,length) 從start位置開始(索引號),length取個數
slice(start,end) 從start位置開始,截取到end位置,end取不到(都是索引號)
substring(start,end) 從start位置開始,截取到end,end取不到,基本和slice相同,但不接收負值

 

        // 字串操作方法
        // 1.concat('字串1','字串2'...)
        var str  ='andy';
        console.log(str.concat('red'));// andyred

        // 2. substr('截取的起始位置','截取幾個字符');
        var str1 = '改革春風吹滿地';
        console.log(str1.substr(2,2));// 春風
// 第一個2 是索引號的2 從第幾個開始  第二個2 是取幾個字符

 

 

replace()方法

replace() 方法用于在字串中用一些字符替換另一些字符,其使用格式如下:

字串.replace(被替換的字串, 要替換為的字串);
var str = 'andyandy';
console.log(str.replace('a')); //只替換第一個a

 

split()方法

split()方法用于切分字串,它可以將字串切分為陣列,在切分完畢之后,回傳的是一個新陣列,

字串.split("分割字符")
var str = 'a,b,c,d';
console.log(str.split(',')); // 回傳的是一個陣列 [a, b, c, d]
    <script>
        // 1. 替換字符 replace('被替換的字符','替換為的字符') 只替換第一個
        var str = 'andyandy';
        console.log(str.replace('a', 'b'));// bndyandy
        // 替換里面所有選中的字串
        var str1 = 'andyandy';
        while (str1.indexOf('a') !== -1) {
            str1 = str1.replace('a', '*');
        }
        console.log(str1);
        // 2. 字串轉換為陣列 split('分隔符') join 把陣列轉為字串
        var str2 = 'red,pink,blue';
        console.log(str2, split(','));// ['red','pink','blue']
        console.log(str2, split('&'));// ['red'&'pink'&'blue']
    </script>

 

課下查閱

? toUpperCase() //轉換大寫

? toLowerCase() //轉換小寫

 

資料型別

1.1 簡單資料型別

簡單型別基本資料型別值型別):

在存盤時變數中存盤的是值本身,包括string ,number,boolean,undefined,null

null回傳的是object,如果有個變數,以后打算存盤為物件,可以用;

  <script>
        // 簡單資料型別 null  回傳的是一個空的物件  object 
        var timer = null;
        console.log(typeof timer);
        // 如果有個變數我們以后打算存盤為物件,暫時沒想好放啥, 這個時候就給 null 
        // 1. 簡單資料型別 是存放在堆疊里面 里面直接開辟一個空間存放的是值
        // 2. 復雜資料型別 首先在堆疊里面存放地址 十六進制表示  然后這個地址指向堆里面的資料
    </script>

 

 

1.2 復雜資料型別

復雜資料型別(參考型別):在存盤時變數中存盤的僅僅是地址(參考),通過 new 關鍵字創建的物件(系統物件、自定義物件),如 Object、Array、Date等;

1.3 堆疊

  • 堆疊空間分配區別:

  1、堆疊(作業系統):由作業系統自動分配釋放存放函式的引數值、區域變數的值等,其操作方式類似于資料結構中的堆疊;簡單資料型別存放到堆疊里面;

  2、堆(作業系統):存盤 復雜型別(物件),一般由程式員分配釋放,若程式員不釋放,由垃圾回識訓制回收

 

js中沒有堆疊概念

  • 簡單資料型別的存盤方式

    值型別變數的資料直接存放在變數(堆疊空間)中,存盤的是值

  • 復雜資料型別的存盤方式

    參考型別變數(堆疊空間)里存放的是地址,地址指向堆里面的資料,真正的物件實體存放在堆空間中

1.4 簡單型別傳參

函式的形參也可以看做是一個變數,當我們把一個值型別變數作為引數傳給函式的形參時,其實是把變數在堆疊空間里的值復制了一份給形參,那么在方法內部對形參做任何修改,都不會影響到的外部變數,

    function fn(a) {
        a++;
        console.log(a); 
    }
    var x = 10;
    fn(x);
    console.log(x);

 

運行結果如下:

 

1.5 復雜資料型別傳參

函式的形參也可以看做是一個變數,當我們把參考型別變數傳給形參時,其實是把變數在堆疊空間里保存的堆地址復制給了形參,形參和實參其實保存的是同一個堆地址,所以操作的是同一個物件,

function Person(name) {
    this.name = name;
}
function f1(x) { // x = p
    console.log(x.name); // 2. 這個輸出什么 ?    劉德華
    x.name = "張學友";
    console.log(x.name); // 3. 這個輸出什么 ?    張學友
}
var p = new Person("劉德華");
console.log(p.name);    // 1. 這個輸出什么 ?   劉德華
f1(p);
console.log(p.name);    // 4. 這個輸出什么 ?  張學友

 

 

 

 

 

 

 

 

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/262430.html

標籤:其他

上一篇:網頁布局準則

下一篇:SAP什么用例可以批量修改物料MG5?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more