瀏覽目錄
一、JavaScript語法基礎
1、變量命名規范
- 變量名只能是 字母、數字、下划線或美元符號的任意組合
- 變量名不能是數字開頭
- 關鍵字不能聲明為變量名
- 建議用駝峰命名方式
- 變量名是區分大小寫
- 變量的定義要具有可描述性
2、變量聲明
- var 變量名 = 變量值;
- JavaScript屬於動態類型(同一個變量可以存不同數據類型的值)
- 語句必須以分號結束
3、注釋
- // 單行注釋
- /*
多行注釋
*/
二、JavaScript數據類型及類型查詢
1、數字number
只有一種數字類型,數字可以帶小數點,也可以不帶
- 示例
var a = 12.34; var b = 20; var c = 123e5; # 12300000 var d = 123e-5; # 0.00123 ☆還有一種NaN,表示不是一個數字(Not a Number)
- 常用方法
# 將字符串轉為數字(當傳入的字符串參數不能轉為數字時,變返回NaN)
parseInt("123") # 返回123
parseInt("ABC") # 返回NaN,NaN屬性是代表非數字值的特殊值,該屬性用於指示某個值不是數字
parseFloat("123.456") # 返回123.456
2、字符串String
字符串可以是引號中的任意文本,可以使用單引號或雙引號
- 示例
var a = "Hello"; var b = 'World'; var c = a + b; console.log(c); # 得到HelloWorld
- 常用方法
·String.length:返回長度
·String.trim():移除空白
·String.trimLeft():移除左邊空白
·String.trimRight():移除右邊空白
·String.charAt(n):返回第N個字符
·String.concat(value, ...):拼接字符串
·String.indexOf(substring, start):返回子序列位置
·String.substring(from, to):根據索引獲取子序列(顧頭不顧尾)
·String.slice(start, end):切片
·String.toLowerCase():轉換成小寫
·String.toUpperCase():轉換成大寫
·String.split(delimiter, limit):分割
·string.slice(start, stop)和string.substring(start, stop)對比:
·兩者的相同點:
如果start等於end,返回空字符串
如果stop參數省略,則取到字符串末
如果某個參數超過string的長度,這個參數會被替換為string的長度
·substirng()的特點:
如果 start > stop ,start和stop將被交換
如果參數是負數或者不是數字,將會被0替換
·silce()的特點:
如果 start > stop 不會交換兩者
如果start小於0,則切割從字符串末尾往前數的第abs(start)個的字符開始(包括該位置的字符)
如果stop小於0,則切割在從字符串末尾往前數的第abs(stop)個字符結束(不包含該位置字符)
3、布爾類型Boolean
布爾只能有兩個值:true 或 false(注意true和false都是小寫)
- 示例
var x=true; var y=false;
4、數組Array
- 示例
·創建數組方式一:
var cars=new Array();
cars[0]="A";
cars[1]="B";
cars[2]="C";
·創建數組方式二:
var cars=new Array("A","B","C");
- 常用方法
·Array.length:數組的長度
·Array.push(element):尾部追加元素
·Array.pop():獲取尾部的元素
·Array.unshift(element):頭部插入元素
·Array.shift():頭部移除元素
·Array.slice(start, end):切片
·Array.reverse():反轉
·Array.join(seq):將數組元素連接成字符串
·Array.concat(val, ...):連接數組
·Array.sort():排序
·關於雞肋的JavaScript內置sort方法的解釋及優化:
/*
如果調用sort方法時沒有傳入參數,將按字母順序對數組中的元素進行排序,說得更精確點,是按照字符編碼的順序進行排序。要實現這一點,首先應把數組的元素都轉換成字符串(如有必要),以便進行比較。
如果想按照其他標准進行排序,就需要提供比較函數,該函數要比較兩個值,然后返回一個用於說明這兩個值的相對順序的數字。比較函數應該具有兩個參數 a 和 b,其返回值如下:
若 a 小於 b,在排序后的數組中 a 應該出現在 b 之前,則返回一個小於 0 的值。
若 a 等於 b,則返回 0。
若 a 大於 b,則返回一個大於 0 的值。
*/
// 根據上面的規則自行實現一個排序函數:
function sortNumber(a,b) {
return a - b
}
// 調用sort方法時將定義好的排序函數傳入即可。
stringObj.sort(sortNumber)
5、對象Object
對象由花括號分隔。在括號內部,對象的屬性以名稱和值對的形式 (name : value) 來定義。屬性由逗號分隔
- 示例
var person={
firstname : "Ya",
lastname : "elegance",
id : 818104
};
- 常用方法
name=person.lastname; name=person["lastname"];
6、空Null
表示值是空,一般在需要指定或清空一個變量時才會使用
7、未定義Undefined
當聲明一個變量但未初始化時,該變量的默認值是undefined,函數無明確的返回值時,返回值也是undefined
8、類型查詢
- 方法:typeof
- typeof是一個一元運算符(就像++,–,!,- 等一元運算符),不是一個函數,也不是一個語句
- 規則
- undefined - 如果變量是 Undefined 類型的
- boolean - 如果變量是 Boolean 類型的
- number - 如果變量是 Number 類型的
- string - 如果變量是 String 類型的
- object - 如果變量是一種引用類型或 Null 類型的
三、JavaScript運算符
1、算數運算符
- +:相加
- -:相減
- *:相乘
- /:相除
- %:取余
- ++:自加1 (注意:n++表示后自加,++n表示先自加)
- –:自減1 (注意:n–表示后自減,–n表示先自減)
2、比較運算符
- > :大於
- >= :大於等於
- < :小於
- <= :小於等於
- == :相等,判斷值是否相等
- != :不等於
- === :嚴格相等,判斷值、類型是否完全相等
- !== :嚴格不等於
3、邏輯運算符
- && :且
- || :或
- ! :非
4、賦值運算符
- = :賦值
- += :自加
- -= :自減
- *= :自乘
- /= :自除
四、JavaScript流程控制
1、if else
var a = 10;
if (a > 5){
console.log("yes");
}else {
console.log("no");
}
2、if-- else if --else
var a = 10;
if (a > 5){
console.log("a > 5");
}else if (a < 5) {
console.log("a < 5");
}else {
console.log("a = 5");
}
3、switch
var day = new Date().getDay();
switch (day) {
case 0:
console.log("Sunday");
break;
case 1:
console.log("Monday");
break;
default:
console.log("...")
}
注意:switch中的case子句通常都會加break語句,否則程序會繼續執行后續case中的語句
4、for
for (var i=0;i<10;i++) {
console.log(i);
}
5、while
var i = 0;
while (i < 10) {
console.log(i);
i++;
}
6、三元運算
格式:判斷條件?滿足條件的返回值:不滿足條件的返回值
var a = 1; var b = 2; var c = a > b ? a : b
五、JavaScript函數
1、函數定義
- 普通函數定義
function func() {
console.log('hello world!');
}
- 帶參數的函數定義
function func(arg1,arg2){
console.log('arg1:',arg1);
console.log('arg2:',arg2);
}
- 帶返回值的函數定義
function func1(arg1,arg2){
return arg1+arg2;
}
fun1(1,2); //函數調用
- 匿名函數定義
var foo= function(arg1,arg2){
return arg1+arg2;
}
foo(1,2) //函數調用
- 立即執行函數定義
(function(arg1,arg2){
return arg1+arg2;
})(1,2);
2、類數組對象arguments
- 作用
- Javascript並沒有重載函數的功能,但是通過Arguments對象能夠模擬重載;
- Javascript的每個函數都會有一個Arguments對象實例arguments,它引着函數的實參,它也有類似於數組的length屬性。
- arguments.length為函數實參個數。
- arguments.callee引用函數自身。
- 示例
function func2(a,b) {
console.log("總共有" + arguments.length + "個參數");
var ret = 0;
for (var i=0;i<arguments.length;i++){
ret += arguments[i]
}
return ret;
}
console.log(func2(11,22,33));
3、局部變量&全局變量
- 局部變量
- 在Javascript函數內部聲明變量(使用var)是局部變量,所以只能在函數內部訪問它(該變量的作用域是函數內部);
- 只要函數運行完畢,本地變量就會被刪除。
- 全局變量
- 在函數外聲明的變量是全局變量,網頁上的所有腳本和函數都能訪問它。
- 變量生存周期:
- Javascript變量的生命周期從它們被聲明的時開始;
- 局部變量會在函數運行以后被刪除;
- 全局變量會在頁面關閉后被刪除。
4、作用域
首先在函數內部查找變量,找不到則到外層函數查找,逐步找到最外層。
var city = "BeiJing"; function f() { var city = "ShangHai"; function inner(){ var city = "ShenZhen"; console.log(city); } inner(); } f(); 結果: "ShenZhen"
var city = "BeiJing"; function Bar() { console.log(city); } function f() { var city = "ShangHai"; return Bar; } var ret = f(); ret(); 結果: "BeiJing"
var city = "BeiJing"; function f(){ var city = "ShangHai"; function inner(){ console.log(city); } return inner; } var ret = f(); ret(); 結果: "ShangHai"
六、詞法分析
Javascript中在調用函數的那一瞬間,會先進行詞法分析。
1、詞法分析的過程
- 當函數調用的前一瞬間,會先形成一個激活對象:Avtive Object(AO),並會分析以下3個方面:
- 函數參數,如果有,則將此參數賦值給AO,且值為undefined。如果沒有,則不做任何操作;
- 函數局部變量,如果AO上有同名的值,則不做任何操作。如果沒有,則將此變量賦值給AO,並且值為undefiined。
- 函數聲明,如果AO上有,則會將AO上的對象覆蓋。如果沒有,則不做任何操作。
2.注意:函數內部無論是使用參數還是使用局部變量都到AO上找。
var age = 18; function foo(){ console.log(age); var age = 22; console.log(age); } foo(); 結果: undefined 22
var age = 18; function foo(){ console.log(age); var age = 22; console.log(age); function age(){ console.log("呵呵"); } console.log(age); } foo(); 結果: function age() 22 22 詞法分析過程: 1、分析參數,有一個參數,形成一個 AO.age=undefine; 2、分析變量聲明,有一個 var age, 發現 AO 上面已經有一個 AO.age,因此不做任何處理 3、分析函數聲明,有一個 function age(){...} 聲明, 則把原有的 age 覆蓋成AO.age=function(){...}; 最終,AO上的屬性只有一個age,並且值為一個函數聲明 執行過程: 注意:執行過程中所有的值都是從AO對象上去尋找 1、執行第一個 console.log(age) 時,此時的 AO.age 是一個函數,所以第一個輸出的一個函數 2、這句 var age=22; 是對 AO.age 的屬性賦值, 此時AO.age=22 ,所以在第二個輸出的是 2 3、同理第三個輸出的還是22, 因為中間再沒有改變age值的語句了
七、JavaScript內置對象方法
1、介紹
- JavaScript中的所有事物都是對象:字符串、數字、數組、日期,等等。在JavaScript中,對象是擁有屬性和方法的數據。
- 我們在學習基本數據類型的時候已經帶大家了解了,JavaScript中的Number對象、String對象、Array對象等。
- 注意:var s1 = “abc”和var s2 = new String(“abc”)的區別:typeof s1 –> string而 typeof s2 –> Object
| 類型 | 內置對象 | 介紹 |
| 數據類型 | Number | 數字對象 |
| 數據類型 | String | 字符串對象 |
| 數據類型 | Boolean | 布爾值對象 |
| 組合對象 | Array | 數組對象 |
| 組合對象 | Math | 數學對象 |
| 組合對象 | Date | 日期對象 |
| 高級對象 | Object | 自定義對象 |
| 高級對象 | Error | 錯誤對象 |
| 高級對象 | Function | 函數對象 |
| 高級對象 | RegExp | 正則表達式 |
| 高級對象 | Global | 全局 |
2、自定義對象
- 創建、訪問自定義對象
//方式一:
var a = {"name": "Yang", "age": 18};
console.log(a.name);
console.log(a["age"]);
//方式二:
var person=new Object(); // 創建一個person對象
person.name="Yang"; // person對象的name屬性
person.age=18; // person對象的age屬性
- 遍歷對象中的內容
var a = {"name": "Yang", "age": 18};
for (var i in a){
console.log(i, a[i]);
}
- JavaScript面向對象之繼承(擴展)
// 父類構造函數
var Car = function (loc) {
this.loc = loc;
};
// 父類方法
Car.prototype.move = function () {
this.loc ++;
};
// 子類構造函數
var Van = function (loc) {
Car.call(this, loc);
};
// 繼承父類的方法
Van.prototype = Object.create(Car.prototype);
// 修復 constructor
Van.prototype.constructor = Van;
// 擴展方法
Van.prototype.grab = function () {
/* ... */
};
3、Date對象
- 創建Date對象
//方法1:不指定參數
var d1 = new Date();
console.log(d1.toLocaleString());
//方法2:參數為日期字符串
var d2 = new Date("2008/8/8 20:08");
console.log(d2.toLocaleString());
var d3 = new Date("08/8/8 20:08");
console.log(d3.toLocaleString());
//方法3:參數為毫秒數
var d3 = new Date(5000);
console.log(d3.toLocaleString());
console.log(d3.toUTCString());
//方法4:參數為年月日小時分鍾秒毫秒
var d4 = new Date(2008,8,8,20,08,08,100);
console.log(d4.toLocaleString()); //毫秒並不直接顯示
- Date對象的方法
var d = new Date(); //getDay () 獲取當前星期X(0-6,0代表星期天) //getMonth () 獲取當前月份(0-11,0代表1月) //getFullYear () 獲取完整的年份(4位,1970-????) //getYear () 獲取當前年份(2位) //getHours () 獲取當前小時數(0-23) //getMinutes () 獲取當前分鍾數(0-59) //getSeconds () 獲取當前秒數(0-59) //getMilliseconds() 獲取當前毫秒數(0-999) //getTime () 返回累計毫秒數(從1970/1/1午夜) //toLocaleDateString(); 獲取當前日期 //toLocaleTimeString(); 獲取當前時間 //toLocaleString( ); 獲取日期與時間
4、JSON對象
方法示例
var str1 = '{"name": "Yang", "age": 18}';
var obj1 = {"name": "Yang", "age": 18};
// JSON字符串轉換成對象
var obj = JSON.parse(str1);
// 對象轉換成JSON字符串
var str = JSON.stringify(obj1);
5、RegExp對象
- 創建方法
- 創建方法一
// 創建RegExp對象方式(逗號后面不要加空格)
var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$");
// 匹配響應的字符串
var s1 = "abc123";
//RegExp對象的test方法,測試一個字符串是否符合對應的正則規則,返回值是true或false。
reg1.test(s1); // true
-
- 創建方法二
// 匹配響應的字符串
var s1 = "abc123";
// /填寫正則表達式/匹配模式(逗號后面不要加空格)
var reg2 = /^[a-zA-Z][a-zA-Z0-9_]{5,11}$/.test(s1); // true
- 示例
// String對象與正則結合的4個方法 var s2 = "hello world"; s2.match(/o/g); // ["o", "o"] 查找字符串中 符合正則 的內容 s2.search(/h/g); // 0 查找字符串中符合正則表達式的內容位置 s2.split(/o/g); // ["hell", " w", "rld"] 按照正則表達式對字符串進行切割 s2.replace(/o/g, "s"); // "hells wsrld" 對字符串按照正則進行替換 // 關於匹配模式:g和i的簡單示例 var s1 = "name:Adele age:18"; s1.replace(/a/, "替換"); // "n替換me:Adele age:18" s1.replace(/a/g, "替換"); // "n替換me:Adele 替換ge:18" 全局匹配 s1.replace(/a/gi, "替換"); // "n替換me:替換dele 替換ge:18" 不區分大小寫
- RegExp對象使用時的幾點之一事項
-
- 正則表達式(不能有空格)
- 匹配模式:常用g(全局匹配;找到所有匹配,而不是在第一個匹配后停止)和i(忽略大小寫)
- 如果regExpObject帶有全局標志g,test()函數不是從字符串的開頭開始查找,而是從屬性regExpObject.lastIndex所指定的索引處開始查找。該屬性值默認為0,所以第一次仍然是從字符串的開頭查找。當找到一個匹配時,test()函數會將regExpObject.lastIndex的值改為字符串中本次匹配內容的最后一個字符的下一個索引位置。當再次執行test()函數時,將會從該索引位置處開始查找,從而找到下一個匹配。因此,當我們使用test()函數執行了一次匹配之后,如果想要重新使用test()函數從頭開始查找,則需要手動將regExpObject.lastIndex的值重置為 0。如果test()函數再也找不到可以匹配的文本時,該函數會自動把regExpObject.lastIndex屬性重置為 0。
- 當我們不加參數調用RegExpObj.test()方法時, 相當於執行RegExpObj.test(“undefined”), 並且/undefined/.test()默認返回true。
6、Math對象
方法介紹:
| 對象 | 介紹 |
| abs(x) | 返回數的絕對值 |
| exp(x) | 返回 e 的指數 |
| floor(x) | 對數進行下舍入 |
| log(x) | 返回數的自然對數(底為e) |
| max(x,y) | 返回 x 和 y 中的最高值 |
| min(x,y) | 返回 x 和 y 中的最低值 |
| pow(x,y) | 返回 x 的 y 次冪 |
| random() | 返回 0 ~ 1 之間的隨機數 |
| round(x) | 把數四舍五入為最接近的整數 |
| sin(x) | 返回數的正弦 |
| sqrt(x) | 返回數的平方根 |
| tan(x) | 返回角的正切 |
