JavaScript是一種運行在客戶端的腳本語言,現基於Node.js技術進行服務端編程;html
所謂腳本(Script)語言:是運行時不須要編譯,運行過程當中由 js 解釋器( js 引擎)逐行來進行解釋並執行。讀到一行,執行一行;java
目的是實現邏輯業務與頁面控制,至關於動做;c++
所謂邏輯性:就是 實現這個要求的思路 先怎麼作後怎麼作;程序員
表單動態校驗(密碼強度檢測) ( JS 產生最初的目的 )es6
網頁特效web
服務端開發(Node.js)算法
桌面程序(Electron)chrome
App(Cordova) 編程
控制硬件-物聯網(Ruff)c#
遊戲開發(cocos2d-js)
HTML 和 CSS 屬於描述類語言;JS 屬於 編程類語言;
瀏覽器分紅兩部分:渲染引擎和 JS 引擎
渲染引擎:用來解析HTML和CSS,俗稱內核,好比 chrome瀏覽器的 blink,老版webkit等;
JS 引擎:也稱 JS 解釋器。用來讀取網頁中的 JavaScript代碼,處理後運行,如chrome的V8;
瀏覽器自己並不會執行JS代碼,而是經過內置 JavaScript 引擎(解釋器) 來執行 JS 代碼 。JS 引擎執行代碼時逐行解釋每一句源碼(轉換爲機器語言),而後由計算機去執行,因此 JavaScript 語言歸爲腳本語言,會逐行解釋執行。
ECMAScript:規定了JS的編程語法和基礎核心知識,是全部瀏覽器廠商共同遵照的一套JS語法工業標準。
更多參看MDN: MDN手冊
文檔對象模型(DocumentObject Model,簡稱DOM),是W3C組織推薦的處理可擴展標記語言的標準編程接口。經過 DOM 提供的接口能夠對頁面上的各類元素進行操做(大小、位置、顏色等)——元素對象;
瀏覽器對象模型(Browser Object Model,簡稱BOM) 是指瀏覽器對象模型,它提供了獨立於內容的、能夠與瀏覽器窗口進行互動的對象結構。經過BOM能夠操做瀏覽器窗口,好比彈出框、控制瀏覽器跳轉、獲取分辨率等——瀏覽器窗口;
JS 有3種書寫位置,分別爲行內、內嵌和外部。
1.行內式
<input type="button" value="點我" 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="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="script.js"> </script> </head> <body> <!-- 1.行內式的js 直接寫到元素內部,以on開頭的屬性 外雙內單引號 --> <input type="button" value="提交" onclick="alert('提交成功')"> </body>
JS中的註釋主要有兩種,分別是單行註釋和多行註釋。
1. 單行註釋 // 用來註釋單行文字( 快捷鍵 ctrl + / ) 2. 多行註釋 /* */ 用來註釋多行文字( 默認快捷鍵 alt + shift + a )
更改快捷鍵:vscode → 首選項按鈕 → 鍵盤快捷方式 → 查找 原來的快捷鍵 → 修改成新的快捷鍵 → 回車確認
爲了方便信息的輸入輸出,JS中提供了一些輸入輸出語句,其經常使用的語句以下:
方法 | 說明 | 面向對象 |
---|---|---|
alert(msg) | 瀏覽器彈出警示框 | 用戶 |
console.log(msg) | 瀏覽器控制檯打印輸出信息 | 程序員 |
prompt(info) | 瀏覽器彈出輸入框,用戶能夠輸入 | 用戶 |
<script> // 1.彈出輸入框 輸入內容後默認彈出輸入的內容 prompt('請輸入你的年齡'); // 2.alert 彈出警示框 輸出的 展現給用戶的 alert('這是個人第一個js'); // 3.console 控制檯輸出打印信息 給程序員測試用的 瀏覽器f12控制檯左手第二個 console.log('這是程序員能看到的'); </script>
爲何須要變量?有些數據須要保存,因此須要變量;
變量是什麼?變量至關一個容器,用來存儲數據;
本質?變量的本質是程序在內存中的一塊存儲空間;
經過變量名找到變量,訪問內存;
變量的命名規範:見名知意-駝峯命名法;
變量的聲明
變量的賦值
變量的初始化
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.更新變量
變量被從新復賦值後,它原有的值就會被覆蓋,變量值將以最後一次賦的值爲準。
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>
由字母(A-Za-z)、數字(0-9)、下劃線(_)、美圓符號( $ )組成,如:usrAge, num01, _name
嚴格區分大小寫。var app; 和 var App; 是兩個變量
不能 以數字開頭。 18age 是錯誤的
不能 是關鍵字、保留字。例如:var、for、while
變量名必須有意義。 MMD BBD nl → age
遵照駝峯命名法。首字母小寫,後面單詞的首字母須要大寫。
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)
簡單數據類型(基本數據類型)
簡單數據類型 | 說明 | 默認值 |
---|---|---|
Number | 數字型,包含整形和浮點型,如21和0.21 | 0 |
String | 字符串型,加了引號的都是字符串 | 「 」、‘ ’ |
Boolean | 布爾值型,返回值true、false,等價於1和0 | false |
Undefined | var a;聲明變量確沒給值,此時a = undefined | undefined |
Null | var a = null;聲明瞭變量a爲空值 | null |
一、數字型 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>
二、字符串型 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>
三、布爾型Boolean
布爾類型有兩個值:true 和 false ,其中 true 表示真,而 false 表示假;
布爾型和數字型相加的時候, true 的值爲 1 ,false 的值爲 0;
console.log(true + 1); // 2 console.log(false + 1); // 1
四、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
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>
什麼是數據類型轉換?就是把一種數據類型的變量轉換成另外一種數據類型,一般會實現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
標識(zhi)符:就是指開發人員 爲變量、屬性、函數、參數取的名字。 標識符不能是關鍵字或保留字。
關鍵字:是指 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 等。
保留字:實際上就是預留的「關鍵字」,意思是如今雖然還不是關鍵字,可是將來可能會成爲關鍵字,一樣不能使用它們當變量名或方法名。 包括: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 等。 注意:若是將保留字用做變量名或函數名,那麼除非未來的瀏覽器實現了該保留字,不然極可能收不到任何錯誤消息。當瀏覽器將其實現後,該單詞將被看作關鍵字,如此將出現關鍵字錯誤。
變量、函數的命名必需要有意義
變量的名稱通常用名詞
函數的名稱通常用動詞
操做符(=)、括號、左右各留一個空格;
註釋後面打一個空格;
運算符(operator)也被稱爲操做符,是用於實現賦值、比較和執行算數運算等功能的符號。
JavaScript中經常使用的運算符有: - 算數運算符 + - * / % - 遞增和遞減運算符 ++ -- - 比較運算符 > < >= <= != == - 邏輯運算符 && || ! - 賦值運算符 =
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.表達式和返回值
表達式:是由數字、運算符、變量等組成的式子
表達式最終都會有一個結果,返回給開發者,稱爲返回值
若是須要反覆給數字變量+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>
比較運算符概述
概念:比較運算符(關係運算符)是兩個數據進行比較時所使用的運算符,比較運算後,會返回一個布爾值(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
邏輯運算符概述
邏輯運算符是用來進行布爾值運算的運算符,其返回值也是布爾值。
邏輯運算符 | 說明 | 案例 |
---|---|---|
&& | "邏輯與" ’與‘ 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 繼續向後運行
概念:用來把數據賦值給變量的運算符。
賦值運算符 | 說明 | 案例 |
---|---|---|
= | 直接賦值 | 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;
優先級 | 運算符 | 順序 |
---|---|---|
1 | 小括號 | ( ) |
2 | 一元運算符 | ++ -- ! |
3 | 算術運算符 | 先 * / % 後 + - |
4 | 關係運算符 | > >= < <= |
5 | 相等運算符 | == != === !== |
6 | 邏輯運算符 | 先 && 後 || |
7 | 賦值運算符 | = |
8 | 逗號運算符 | , |
一元運算符裏面的邏輯非優先級很高
邏輯與比邏輯或優先級高
流程控制就是來控制代碼按照必定結構順序來執行 流程控制主要有三種結構:順序結構、分支結構、循環結構
特色:從上到下,依次執行
特色:根據不一樣的條件,執行不一樣的路徑代碼(多選一的過程)獲得不一樣的結果;
JS 語言提供了兩種分支結構語句:if 語句、switch 語句
// 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>
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('沒有此水果'); }
通常狀況下,它們兩個語句能夠相互替換
switch用於處理case比較肯定的狀況,如固定值的;進行條件判斷後直接執行到程序的條件語句,效率更高;
if else更加靈活,經常使用於範圍判斷(大於 小於);但if else有幾種條件就判斷多少次;分支較少時效率較高;
循環的目的:能夠重複執行某些代碼
JS三種循環結構:
for循環:經常使用於 計數
while循環:複雜一點的條件判斷,比for靈活
do...while循環:比while嚴謹
三個循環不少狀況能夠相互轉換;
重複執行某些代碼,一般和計數有關係
// 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循環:
<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打開調試器窗口
單擊某條語句設置斷點,並刷新瀏覽器
右上角 步進 進行一步步調試,看程序怎樣運行的
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>
比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>
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 + '個包子呢'); }
爲何須要數組?
普通變量一次只能存一個值;數組(Array)是一組數據的集合,一次能夠存多個值;
數組是指一組數據的集合,其中的每一個數據被稱做元素,在數組中能夠存聽任意類型的元素。
JS 中建立數組有兩種方式:
利用new 關鍵字 建立數組(對象)
var 數組名 = new Array() ; var arr = new Array(); // 建立一個新的空數組
利用數組字面量建立數組
var 數組名 = []; // 使用數組字面量方式建立帶初始值的數組 數組類型不限 var 數組名 = [1,'pink',true];// 數組的初始化
索引 (下標) :用來訪問數組元素的序號(數組下標從 0 開始)。
數組能夠經過索引來訪問、設置、修改對應的數組元素,能夠經過「數組名[索引]」的形式來獲取數組中的元素。
// 4. 咱們數組裏面的數據必定用逗號分隔 // 5. 數組裏面的數據 好比1,2, 咱們稱爲數組元素 // 6. 獲取數組元素 格式 數組名[索引號] 索引號從 0開始 console.log(arr1); console.log(arr1[1]); // pink老師 console.log(arr1[2]); // true
注意:若是訪問時數組沒有和索引值對應的元素,則獲得的值是undefined
把數組中的每一個元素 從頭至尾 都訪問一次(相似學生的點名)稱爲遍歷數組;
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屬性值小於數組的元素個數,則會把超過該值的數組元素刪除
一、經過修改length長度新增數組元素,經過length長度實現數組的擴容
二、經過修改數組索引新增數組元素,追加數組元素
<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
// 一、須要一個新數組用於存放篩選以後的數據。 // 二、遍歷原來的數組, 把不是 0 的數據添加到新數組裏面(此時要注意採用數組名 + 索引的格式接收數據)。 // 三、新數組裏面的個數, 用 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>
案例:翻轉數組 將數組中的內容反過來存放
// 一、聲明一個新數組 newArr // 二、把舊數組索引號第4個取過來(arr.length - 1),給新數組索引號第0個元素 (newArr.length) // 三、咱們採起 遞減的方式 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>
函數:就是封裝了一段可被重複調用執行的代碼塊。
經過此代碼塊能夠實現大量代碼的重複使用。
函數使用分爲兩步: 聲明函數 和 調用函數;
// 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);
形參:形式上的參數 聲明函數時定義 可看作不用聲明的變量
實參:實際上的參數 函數調用時傳遞的 最終實參傳遞給形參
函數參數的運用:
// 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);
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 語句中的值,同時還能夠結束當前的函數體內的代碼
當不肯定有多少個參數傳遞的時候,能夠用 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>
一、自定義函數方式(命名函數)
利用函數關鍵字 function 自定義函數方式
// 聲明定義方式 function fn() {...} // 調用 調用函數的代碼既能夠放到聲明函數的前面,也能夠放在聲明函數的後面 fn();
二、函數表達式方式(匿名函數)
// var 變量名 = function () { } var fun = function () { console.log('我是函數表達式'); } fun();
fun是變量名 不是函數名
函數表達式 聲明方式和 聲明變量差很少,只不過變量裏存的是值 而 函數表達式裏存的是函數
函數調用的代碼必須寫到函數體後面
函數表達式也能夠進行傳遞參數
做用域:變量可以起做用和效果的 某個範圍 目的:爲了提升程序的可靠性 更重要的做用是減小命名衝突 全局做用域和局部做用域命名不衝突
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
在JavaScript中,根據做用域的不一樣,變量能夠分爲兩種:
全局變量
局部變量
1.全局變量
在全局做用域下聲明的變量叫作全局變量(在函數外部定義的變量)。 注意 若是在函數內部 沒有聲明直接賦值的變量也屬於全局變量
全局變量在代碼的任何位置均可以使用
在全局做用域下 var 聲明的變量 是全局變量
特殊狀況下,在函數內不使用 var 聲明的變量也是全局變量(不建議使用)
2.局部變量
在局部做用域下聲明的變量叫作局部變量(在函數內部定義的變量) 注意: 函數的形參也能夠看作是局部變量
局部變量只能在該函數內部使用
在函數內部 var 聲明的變量是局部變量
函數的形參實際上就是局部變量
3.全局變量和局部變量的區別
全局變量:在任何一個地方均可以使用,只有在瀏覽器關閉時纔會被銷燬,所以比較佔內存;
局部變量:只在函數內部使用,當其所在的代碼塊被執行時,會被初始化;當代碼塊運行結束後,就會被銷燬,所以更節省內存空間;
根據在內部函數能夠訪問外部函數變量的這種機制,用鏈式查找決定哪些數據能被內部函數訪問,就稱做做用域鏈。
案例分析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();
JavaScript 代碼是由瀏覽器中的 JavaScript 解析器來執行的。 JavaScript 解析器在運行 JavaScript 代碼的時候分爲兩步:預解析和代碼執行。 預解析: js引擎會把js裏全部的 var 還有 function 提高到當前做用域的最前面,預解析也叫作變量、函數提高。 代碼執行: 按照代碼抒寫的順序從上到下執行
注意:預解析會把變量和函數的聲明在代碼執行以前執行完成。
預解析分爲變量預解析(變量提高) 和 函數預解析(函數提高) 變量提高:變量的聲明會被提高到當前做用域的最上面,變量的 賦值 不會提高。 函數提高:函數的聲明會被提高到當前做用域的最上面,可是不會調用函數。
預解析分爲變量預解析(變量提高) 和 函數預解析(函數提高)
// 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當局部變量看 只聲明 }
一、什麼是對象?
對象是指具體的事物,如字符串、數值、數組函數等;萬物皆對象;
對象是由屬性和方法組成的:
屬性:事物的特徵,在對象中用屬性來表示(經常使用名詞)
方法:事物的行爲,在對象中用方法來表示(經常使用動詞)
二、爲何須要對象?
保存一個值用變量;保存多個值,可使用數組;保存一我的的完整信息能夠用對象(至關於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 () { } }
小括號()優先級;中括號[ ]數組;花括號{ }對象
利用字面量建立對象;
利用new object建立對象;
利用構造函數建立對象;
<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>
// 利用 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();
由於前面兩種方式一次只能建立一個對象;
構造函數就是把 咱們對象裏一些相同的屬性和方法抽象出來封裝到函數中;
構造函數用於建立某一類函數,首字母要大寫;與關鍵字 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, '男');
for...in 語句用於對數組或者對象的屬性進行循環操做。
for (變量 in 對象名字) { // 在此執行代碼 }
變量一般用 k 或者 key
// for (變量 in 對象) { } for (var k in obj) { console.log(k);// k變量輸出 獲得的是 屬性名 console.log( obj[k] );// 獲得的是 屬性值 }
JavaScript 中的對象分爲3種:自定義對象 、內置對象、 瀏覽器對象
前面兩種對象是JS 基礎 內容,屬於 ECMAScript; 第三個瀏覽器對象屬於咱們 JS 獨有的, 咱們JS API 講解
內置對象就是指 JS 語言自帶的一些對象,這些對象供開發者使用,並提供了一些經常使用的或是最基本而必要的功能(屬性和方法)
內置對象最大的優勢就是幫助咱們快速開發
JavaScript 提供了多個內置對象:Math、 Date 、Array、String等
查找文檔:學習一個內置對象的使用,只要學會其經常使用成員的使用便可,咱們能夠經過查文檔學習,能夠經過MDN/W3C來查詢。 Mozilla 開發者網絡(MDN)提供了有關開放網絡技術(Open Web)的信息,包括 HTML、CSS 和萬維網及 HTML5 應用的 API。 MDN:https://developer.mozilla.org/zh-CN/
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(被替換的字符串, 要替換爲的字符串); var str = 'andyandy'; console.log(str.replace('a')); //只替換第一個a
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() //轉換小寫
簡單類型(基本數據類型、值類型):
在存儲時變量中存儲的是值自己,包括string ,number,boolean,undefined,null
null返回的是object,若是有個變量,之後打算存儲爲對象,能夠用;
<script> // 簡單數據類型 null 返回的是一個空的對象 object var timer = null; console.log(typeof timer); // 若是有個變量咱們之後打算存儲爲對象,暫時沒想好放啥, 這個時候就給 null // 1. 簡單數據類型 是存放在棧裏面 裏面直接開闢一個空間存放的是值 // 2. 複雜數據類型 首先在棧裏面存放地址 十六進制表示 而後這個地址指向堆裏面的數據 </script>
複雜數據類型(引用類型):在存儲時變量中存儲的僅僅是地址(引用),經過 new 關鍵字建立的對象(系統對象、自定義對象),如 Object、Array、Date等;
堆棧空間分配區別:
一、棧(操做系統):由操做系統自動分配釋放存放函數的參數值、局部變量的值等。其操做方式相似於數據結構中的棧;簡單數據類型存放到棧裏面;
二、堆(操做系統):存儲 複雜類型(對象),通常由程序員分配釋放,若程序員不釋放,由垃圾回收機制回收
js中沒有堆棧概念
簡單數據類型的存儲方式
值類型變量的數據直接存放在變量(棧空間)中,存儲的是值
複雜數據類型的存儲方式
引用類型變量(棧空間)裏存放的是地址,地址指向堆裏面的數據,真正的對象實例存放在堆空間中
函數的形參也能夠看作是一個變量,當咱們把一個值類型變量做爲參數傳給函數的形參時,實際上是把變量在棧空間裏的值複製了一份給形參,那麼在方法內部對形參作任何修改,都不會影響到的外部變量。
function fn(a) { a++; console.log(a); } var x = 10; fn(x); console.log(x);
運行結果以下:
函數的形參也能夠看作是一個變量,當咱們把引用類型變量傳給形參時,實際上是把變量在棧空間裏保存的堆地址複製給了形參,形參和實參其實保存的是同一個堆地址,因此操做的是同一個對象。
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. 這個輸出什麼 ? 張學友