JavaScript概述
JavaScript的歷史
- 1992年Nombas開發出C-minus-minus(C--)的嵌入式腳本語言(最初綁定在CEnvi軟件中),後將其更名ScriptEase(客戶端執行的語言)。
- Netscape(網景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigator 2.0產品中開發出一套livescript的腳本語言。Sun和Netscape共同完成,後更名叫JavaScript。
- 微軟隨後模仿在其IE3.0的產品中搭載了一個JavaScript的克隆版叫Jscript。
- 爲了統一三家,ECMA(歐洲計算機制造協會)定義了ECMA-262規範.國際標準化組織及國際電工委員會(ISO/IEC)也採納 ECMAScript 做爲標準(ISO/IEC-16262)。今後,Web 瀏覽器就開始努力(雖然有着不一樣的程度的成功和失敗)將 ECMAScript 做爲 JavaScript 實現的基礎。
- ECMA-262 是 JavaScript 標準的官方名稱。
ECMAScript
年份 | 名稱 | 描述 |
1997 | ECMAScript 1 | 第一個版本 |
1998 | ECMAScript 2 | 版本變動 |
1999 | ECMAScript 3 | 添加正則表達式javascript 添加try/catchcss |
ECMAScript 4 | 沒有發佈 | |
2009 | ECMAScript 5 | 添加"strict mode"嚴格模式html 添加JSON支持java |
2011 | ECMAScript 5.1 | 版本變動 |
2015 | ECMAScript 6 | 添加類和模塊 |
2016 | ECMAScript 7 | 增長指數運算符(**)正則表達式 增長Array.prototype.includes編程 |
注:ES6就是指ECMAScript 6。數組
儘管 ECMAScript 是一個重要的標準,但它並非 JavaScript 惟一的部分,固然,也不是惟一被標準化的部分。實際上,一個完整的 JavaScript 實現是由如下 3 個不一樣部分組成的:瀏覽器
- 核心(ECMAScript)
- 文檔對象模型(DOM) Document object model (整合js,css,html)
- 瀏覽器對象模型(BOM) Broswer object model(整合js和瀏覽器)
簡單地說,ECMAScript 描述了JavaScript語言自己的相關內容。閉包
JavaScript 是腳本語言
JavaScript 是一種輕量級的編程語言。dom
JavaScript 是可插入 HTML 頁面的編程代碼。
JavaScript 插入 HTML 頁面後,可由全部的現代瀏覽器執行。
JavaScript 很容易學習。
JavaScript引入方式
Script標籤內寫代碼
<script> // 在這裏寫你的JS代碼 </script>
引入額外的JS文件
<script src="myscript.js"></script>
JavaScript語言規範
註釋(註釋是代碼之母)
// 這是單行註釋 /* 這是
多行註釋 */
結束符
JavaScript中的語句要以分號(;)爲結束符。
JavaScript語言基礎
變量聲明
- JavaScript的變量名可使用_,數字,字母,$組成,不能以數字開頭。
- 聲明變量使用 var 變量名; 的格式來進行聲明
var name = "Alex"; var age = 18;
注意:
變量名是區分大小寫的。
推薦使用駝峯式命名規則。
保留字不能用作變量名。
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
abstract boolean byte char class const debugger double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile
JavaScript數據類型
JavaScript擁有動態類型
var x; // 此時x是undefined var x = 1; // 此時x是數字 var x = "Alex" // 此時x是字符串
數字類型
JavaScript不區分整型和浮點型,就只有一種數字類型。
var a = 12.34; var b = 20; var c = 123e5; // 12300000 var d = 123e-5; // 0.00123
還有一種NaN,表示不是一個數字(Not a Number)。
經常使用方法:
parseInt("123") // 返回123 parseInt("ABC") // 返回NaN,NaN屬性是表明非數字值的特殊值。該屬性用於指示某個值不是數字。 parseFloat("123.456") // 返回123.456
字符串
var a = "Hello" var b = "world; var c = a + b; console.log(c); // 獲得Helloworld
經常使用方法:
方法 | 說明 |
.length | 返回長度 |
.trim() | 移除空白 |
.trimLeft() | 移除左邊的空白 |
.trimRight() | 移除右邊的空白 |
.charAt(n) | 返回第n個字符 |
.concat(value, ...) | 拼接 |
.indexOf(substring, start) | 子序列位置 |
.substring(from, to) | 根據索引獲取子序列 |
.slice(start, end) | 切片 |
.toLowerCase() | 小寫 |
.toUpperCase() | 大寫 |
.split(delimiter, limit) | 分割 |
拼接字符串通常使用「+」
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
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)個字符結束(不包含該位置字符)
布爾類型
區別於Python,true和false都是小寫。
var a = true; var b = false;
""(空字符串)、0、null、undefined、NaN都是false。
數組
相似於Python中的列表。
var a = [123, "ABC"]; console.log(a[1]); // 輸出"ABC"
經常使用方法:
方法 | 說明 |
.length | 數組的大小 |
.push(ele) | 尾部追加元素 |
.pop() | 獲取尾部的元素 |
.unshift(ele) | 頭部插入元素 |
.shift() | 頭部移除元素 |
.slice(start, end) | 切片 |
.reverse() | 反轉 |
.join(seq) | 將數組元素鏈接成字符串 |
.concat(val, ...) | 鏈接數組 |
.sort() | 排序 |
注意:
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
/*若是調用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)
可使用如下方式遍歷數組中的元素:
var a = [10, 20, 30, 40]; for (var i=0;i<a.length;i++) { console.log(i); }
null和undefined
- null表示值是空,通常在須要指定或清空一個變量時纔會使用,如 name=null;
- undefined表示當聲明一個變量但未初始化時,該變量的默認值是undefined。還有就是函數無明確的返回值時,返回的也是undefined。
null表示變量的值是空,undefined則表示只聲明瞭變量,但尚未賦值。
還不明白,上圖吧!
類型查詢
typeof "abc" // "string" typeof null // "object" typeof true // "boolean" typeof 123 // "number"
typeof是一個一元運算符(就像++,--,!,- 等一元運算符),不是一個函數,也不是一個語句。
對變量或值調用 typeof 運算符將返回下列值之一:
- undefined - 若是變量是 Undefined 類型的
- boolean - 若是變量是 Boolean 類型的
- number - 若是變量是 Number 類型的
- string - 若是變量是 String 類型的
- object - 若是變量是一種引用類型或 Null 類型的
運算符
算數運算符
+ - * / % ++ --
比較運算符
> >= < <= != == === !==
注意:
1 == 「1」 // true 1 === "1" // false
邏輯運算符
&& || !
賦值運算符
= += -= *= /=
流程控制
if-else
var a = 10; if (a > 5){ console.log("yes"); }else { console.log("no"); }
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"); }
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中的語句。
for
for (var i=0;i<10;i++) { console.log(i); }
while
var i = 0; while (i < 10) { console.log(i); i++; }
三元運算
var a = 1; var b = 2; var c = a > b ? a : b
函數
函數定義
JavaScript中的函數和Python中的很是相似,只是定義方式有點區別。
// 普通函數定義 function f1() { console.log("Hello world!"); } // 帶參數的函數 function f2(a, b) { console.log(arguments); // 內置的arguments對象 console.log(arguments.length); console.log(a, b); } // 帶返回值的函數 function sum(a, b){ return a + b; } sum(1, 2); // 調用函數 // 匿名函數方式 var sum = function(a, b){ return a + b; } sum(1, 2); // 當即執行函數 (function(a, b){ return a + b; })(1, 2);
函數的全局變量和局部變量
局部變量:
在JavaScript函數內部聲明的變量(使用 var)是局部變量,因此只能在函數內部訪問它(該變量的做用域是函數內部)。只要函數運行完畢,本地變量就會被刪除。
全局變量:
在函數外聲明的變量是全局變量,網頁上的全部腳本和函數都能訪問它。
變量生存週期:
JavaScript變量的生命期從它們被聲明的時間開始。
局部變量會在函數運行之後被刪除。
全局變量會在頁面關閉後被刪除。
做用域
首先在函數內部查找變量,找不到則到外層函數查找,逐步找到最外層。
幾個例子:
1.
var city = "BeiJing"; function f() { var city = "ShangHai"; function inner(){ var city = "ShenZhen"; console.log(city); } inner(); } f(); //輸出結果是?
2.
var city = "BeiJing"; function Bar() { console.log(city); } function f() { var city = "ShangHai"; return Bar; } var ret = f(); ret(); // 打印結果是?
3.閉包
var city = "BeiJing"; function f(){ var city = "ShangHai"; function inner(){ console.log(city); } return inner; } var ret = f(); ret();
內置對象和方法
JavaScript中的全部事物都是對象:字符串、數字、數組、日期,等等。在JavaScript中,對象是擁有屬性和方法的數據。
咱們在學習基本數據類型的時候已經帶你們瞭解了,JavaScript中的Number對象、String對象、Array對象等。
自定義對象
相似於(某方面相似)Python中的字典數據類型
var a = {"name": "Alex", "age": 18}; console.log(a.name); console.log(a["age"]);
遍歷對象中的內容:
var a = {"name": "Alex", "age": 18}; for (var i in a){ console.log(i, a[i]); }
建立對象:
var person=new Object(); // 建立一個person對象 person.name="Alex"; // person對象的name屬性 person.age=18; // person對象的age屬性
擴展:
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
// 父類構造函數 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 () { /* ... */ };
Date對象
建立Date對象
//方法1:不指定參數 var d1 = new Date(); console.log(d1.toLocaleString()); //方法2:參數爲日期字符串 var d2 = new Date("2004/3/20 11:12"); console.log(d2.toLocaleString()); var d3 = new Date("04/03/20 11:12"); console.log(d3.toLocaleString()); //方法3:參數爲毫秒數 var d3 = new Date(5000); console.log(d3.toLocaleString()); console.log(d3.toUTCString()); //方法4:參數爲年月日小時分鐘秒毫秒 var d4 = new Date(2004,2,20,11,12,0,300); console.log(d4.toLocaleString()); //毫秒並不直接顯示
Date對象的方法:
var d = new Date(); //getDate() 獲取日 //getDay () 獲取星期 //getMonth () 獲取月(0-11) //getFullYear () 獲取完全年份 //getYear () 獲取年 //getHours () 獲取小時 //getMinutes () 獲取分鐘 //getSeconds () 獲取秒 //getMilliseconds () 獲取毫秒 //getTime () 返回累計毫秒數(從1970/1/1午夜)
練習:
編寫代碼,將當前日期按「2017-12-27 11:11 星期三」格式輸出。
詳細Date對象方法:點我
JSON對象
var str1 = '{"name": "Alex", "age": 18}'; var obj1 = {"name": "Alex", "age": 18}; // JSON字符串轉換成對象 var obj = JSON.parse(str1); // 對象轉換成JSON字符串 var str = JSON.stringify(obj1);
RegExp對象
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
//RegExp對象 //建立正則對象方式1 // 參數1 正則表達式(不能有空格) // 參數2 匹配模式:經常使用g(全局匹配;找到全部匹配,而不是在第一個匹配後中止)和i(忽略大小寫) // 用戶名只能是英文字母、數字和_,而且首字母必須是英文字母。長度最短不能少於6位 最長不能超過12位。 // 建立RegExp對象方式(逗號後面不要加空格) var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$"); // 匹配響應的字符串 var s1 = "bc123"; //RegExp對象的test方法,測試一個字符串是否符合對應的正則規則,返回值是true或false。 reg1.test(s1); // true // 建立方式2 // /填寫正則表達式/匹配模式(逗號後面不要加空格) var reg2 = /^[a-zA-Z][a-zA-Z0-9_]{5,11}$/; reg2.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:Alex age:18"; s1.replace(/a/, "哈哈哈"); // "n哈哈哈me:Alex age:18" s1.replace(/a/g, "哈哈哈"); // "n哈哈哈me:Alex 哈哈哈ge:18" 全局匹配 s1.replace(/a/gi, "哈哈哈"); // "n哈哈哈me:哈哈哈lex 哈哈哈ge:18" 不區分大小寫 // 注意事項1: // 若是regExpObject帶有全局標誌g,test()函數不是從字符串的開頭開始查找,而是從屬性regExpObject.lastIndex所指定的索引處開始查找。 // 該屬性值默認爲0,因此第一次仍然是從字符串的開頭查找。 // 當找到一個匹配時,test()函數會將regExpObject.lastIndex的值改成字符串中本次匹配內容的最後一個字符的下一個索引位置。 // 當再次執行test()函數時,將會從該索引位置處開始查找,從而找到下一個匹配。 // 所以,當咱們使用test()函數執行了一次匹配以後,若是想要從新使用test()函數從頭開始查找,則須要手動將regExpObject.lastIndex的值重置爲 0。 // 若是test()函數再也找不到能夠匹配的文本時,該函數會自動把regExpObject.lastIndex屬性重置爲 0。 var reg3 = /foo/g; // 此時 regex.lastIndex=0 reg3.test('foo'); // 返回true // 此時 regex.lastIndex=3 reg3.test('foo'); // 返回false // 因此咱們在使用test()方法校驗一個字符串是否徹底匹配時,不推薦添加全局匹配模式g。 // 注意事項2(說出來你可能不信系列): // 當咱們不加參數調用RegExpObj.test()方法時, 至關於執行RegExpObj.test("undefined"), 而且/undefined/.test()默認返回true。 var reg4 = /^undefined$/; reg4.test(); // 返回true reg4.test(undefined); // 返回true reg4.test("undefined"); // 返回true
Math對象
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
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) 返回角的正切。