JavaScript概述css
ECMAScript和JavaScript的關係html
1996年11月,JavaScript的創造者--Netscape公司,決定將JavaScript提交給國際標準化組織ECMA,但願這門語言可以成爲國際標準。次年,ECMA發佈262號標準文件(ECMA-262)的初版,規定了瀏覽器腳本語言的標準,並將這種語言稱爲ECMAScript,這個版本就是1.0版。編程
該標準一開始就是針對JavaScript語言制定的,可是沒有稱其爲JavaScript,有兩個方面的緣由。一是商標,JavaScript自己已被Netscape註冊爲商標。二是想體現這門語言的制定者是ECMA,而不是Netscape,這樣有利於保證這門語言的開發性和中立性。數組
所以ECMAScript和JavaScript的關係是,前者是後者的規格,後者是前者的一種實現。瀏覽器
儘管 ECMAScript 是一個重要的標準,但它並非 JavaScript 惟一的部分,固然,也不是惟一被標準化的部分。實際上,一個完整的 JavaScript 實現是由如下 3 個不一樣部分組成的:數據結構
簡單地說,ECMAScript 描述了JavaScript語言自己的相關內容。閉包
JavaScript 是腳本語言
JavaScript 是一種輕量級的編程語言。編程語言
JavaScript 是可插入 HTML 頁面的編程代碼。函數
JavaScript 插入 HTML 頁面後,可由全部的現代瀏覽器執行。學習
JavaScript 很容易學習。
JavaScript引入方式
Script標籤內寫代碼
<script> // 在這裏寫你的JS代碼 </script>
引入額外的JS文件
<script src="myscript.js"></script>
JavaScript語言規範
註釋(註釋是代碼之母)
// 這是單行註釋
/*
這是
多行註釋
*/
結束符
JavaScript中的語句要以分號(;)爲結束符。
JavaScript語言基礎
變量聲明
var name = "Alex";
var age = 18;
注意:
變量名是區分大小寫的。
推薦使用駝峯式命名規則。
保留字不能用作變量名。
補充:
ES6新增了let命令,用於聲明變量。其用法相似於var,可是所聲明的變量只在let命令所在的代碼塊內有效。例如:for循環的計數器就很適合使用let命令。
for (let i=0;i<arr.length;i++){...}
ES6新增const用來聲明常量。一旦聲明,其值就不能改變。
const PI = 3.1415;
PI // 3.1415
PI = 3
// TypeError: "PI" is read-only
JavaScript數據類型
JavaScript擁有動態類型
var x; // 此時x是undefined
var x = 1; // 此時x是數字
var x = "Alex" // 此時x是字符串
數值(Number)
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
字符串(String)
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) |
分割 |
拼接字符串通常使用「+」
slice和substring的區別
補充:
ES6中引入了模板字符串。模板字符串(template string)是加強版的字符串,用反引號(`)標識。它能夠當作普通字符串使用,也能夠用來定義多行字符串,或者在字符串中嵌入變量。
// 普通字符串
`這是普通字符串!`
// 多行文本
`這是多行的
文本`
// 字符串中嵌入變量
var name = "q1mi", time = "today";
`Hello ${name}, how are you ${time}?`
注意:
若是模板字符串中須要使用反引號,則在其前面要用反斜槓轉義。
JSHint啓用ES6語法支持:/* jshint esversion: 6 */
布爾值(Boolean)
區別於Python,true和false都是小寫。
var a = true;
var b = false;
""(空字符串)、0、null、undefined、NaN都是false。
null和undefined
null表示變量的值是空,undefined則表示只聲明瞭變量,但尚未賦值。
對象(Object)
JavaScript 中的全部事物都是對象:字符串、數值、數組、函數...此外,JavaScript 容許自定義對象。
JavaScript 提供多個內建對象,好比 String、Date、Array 等等。
對象只是帶有屬性和方法的特殊數據類型。
數組
數組對象的做用是:使用單獨的變量名來存儲一系列的值。相似於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() |
排序 |
.forEach() |
將數組的每一個元素傳遞給回調函數 |
.splice() |
刪除元素,並向數組添加新元素。 |
.map() |
返回一個數組元素調用函數處理後的值的新數組 |
關於sort()須要注意:
若是調用該方法時沒有使用參數,將按字母順序對數組中的元素進行排序,說得更精確點,是按照字符編碼的順序進行排序。要實現這一點,首先應把數組的元素都轉換成字符串(若有必要),以便進行比較。
若是想按照其餘標準進行排序,就須要提供比較函數,該函數要比較兩個值,而後返回一個用於說明這兩個值的相對順序的數字。比較函數應該具備兩個參數 a 和 b,其返回值以下:
若 a 小於 b,在排序後的數組中 a 應該出如今 b 以前,則返回一個小於 0 的值。
若 a 等於 b,則返回 0。
若 a 大於 b,則返回一個大於 0 的值。
function sortNumber(a,b){ return a - b } var arr1 = [11, 100, 22, 55, 33, 44] arr1.sort(sortNumber) 關於遍歷數組中的元素,可使用下面的方式: var a = [10, 20, 30, 40]; for (var i=0;i<a.length;i++) { console.log(a[i]); }
forEach()
語法:
forEach(function(currentValue, index, arr), thisValue)
參數:
參數 |
描述 |
||||||||
function(currentValue, index, arr) |
必需。 數組中每一個元素須要調用的函數。
|
||||||||
thisValue |
可選。傳遞給函數的值通常用 "this" 值。 |
splice()
語法:
splice(index,howmany,item1,.....,itemX)
參數:
參數 |
描述 |
index |
必需。規定從何處添加/刪除元素。 |
howmany |
必需。規定應該刪除多少元素。必須是數字,但能夠是 "0"。 |
item1, ..., itemX |
可選。要添加到數組的新元素 |
map()
語法:
map(function(currentValue,index,arr), thisValue)
參數:
參數 |
描述 |
||||||||
function(currentValue, index,arr) |
必須。函數,數組中的每一個元素都會執行這個函數
|
||||||||
thisValue |
可選。對象做爲該執行回調時使用,傳遞給函數,用做 "this" 的值。 |
補充:
ES6新引入了一種新的原始數據類型(Symbol),表示獨一無二的值。它是JavaScript語言的第7種數據類型。
類型查詢
typeof "abc" // "string"
typeof null // "object"
typeof true // "boolean"
typeof 123 // "number"
typeof是一個一元運算符(就像++,--,!,- 等一元運算符),不是一個函數,也不是一個語句。
對變量或值調用 typeof 運算符將返回下列值之一:
運算符
算數運算符
+ - * / % ++ --
比較運算符
> >= < <= != == === !==
注意:
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); 補充: ES6中容許使用「箭頭」(=>)定義函數。 var f = v => v; // 等同於 var f = function(v){ return v; } 若是箭頭函數不須要參數或須要多個參數,就是用圓括號表明參數部分: var f = () => 5; // 等同於 var f = function(){return 5}; var sum = (num1, num2) => num1 + num2; // 等同於 var sum = function(num1, num2){ return num1 + num2; }
函數中的arguments參數
function add(a,b){ console.log(a+b); console.log(arguments.length) } add(1,2)
輸出:
3
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中在調用函數的那一瞬間,會先進行詞法分析。
詞法分析的過程:
當函數調用的前一瞬間,會先造成一個激活對象:Avtive Object(AO),並會分析如下3個方面:
1:函數參數,若是有,則將此參數賦值給AO,且值爲undefined。若是沒有,則不作任何操做。
2:函數局部變量,若是AO上有同名的值,則不作任何操做。若是沒有,則將此變量賦值給AO,而且值爲undefined。
3:函數聲明,若是AO上有,則會將AO上的對象覆蓋。若是沒有,則不作任何操做。
函數內部不管是使用參數仍是使用局部變量都到AO上找。
看兩個例子:
var age = 18; function foo(){ console.log(age); var age = 22; console.log(age); } foo(); // 問:執行foo()以後的結果是?
第二題:
var age = 18; function foo(){ console.log(age); var age = 22; console.log(age); function age(){ console.log("呵呵"); } console.log(age); } foo(); // 執行後的結果是?
內置對象和方法
JavaScript中的全部事物都是對象:字符串、數字、數組、日期,等等。在JavaScript中,對象是擁有屬性和方法的數據。
咱們在學習基本數據類型的時候已經帶你們瞭解了,JavaScript中的Number對象、String對象、Array對象等。
注意var s1 = "abc"和var s2 = new String("abc")的區別:typeof s1 --> string而 typeof s2 --> Object
自定義對象
JavaScript的對象(Object)本質上是鍵值對的集合(Hash結構),可是隻能用字符串做爲鍵。
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屬性
注意:
ES6中提供了Map數據結構。它相似於對象,也是鍵值對的集合,可是「鍵」的範圍不限於字符串,各類類型的值(包括對象)均可以當作鍵。
也就是說,Object結構提供了「字符串--值」的對應,Map結構提供了「值--值」的對應,是一種更完善的Hash結構實現。
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 () 獲取完全年份
//getHours () 獲取小時
//getMinutes () 獲取分鐘
//getSeconds () 獲取秒
//getMilliseconds () 獲取毫秒
//getTime () 返回累計毫秒數(從1970/1/1午夜)