js

ECMAScript和JavaScript的關係

1996年11月,JavaScript的創造者--Netscape公司,決定將JavaScript提交給國際標準化組織ECMA,但願這門語言可以成爲國際標準。次年,ECMA發佈262號標準文件(ECMA-262)的初版,規定了瀏覽器腳本語言的標準,並將這種語言稱爲ECMAScript,這個版本就是1.0版。javascript

該標準一開始就是針對JavaScript語言制定的,可是沒有稱其爲JavaScript,有兩個方面的緣由。一是商標,JavaScript自己已被Netscape註冊爲商標。而是想體現這門語言的制定者是ECMA,而不是Netscape,這樣有利於保證這門語言的開發性和中立性。css

所以ECMAScript和JavaScript的關係是,前者是後者的規格,後者是前者的一種實現。html

ECMAScript的歷史

年份 名稱 描述
1997 ECMAScript 1 第一個版本
1998 ECMAScript 2 版本變動
1999 ECMAScript 3 添加正則表達式添加try/catch
ECMAScript 4 沒有發佈
2009 ECMAScript 5 添加"strict mode"嚴格模式添加JSON支持
2011 ECMAScript 5.1 版本變動
2015 ECMAScript 6 添加類和模塊
2016 ECMAScript 7 增長指數運算符(**)增長Array.prototype.includes

注:ES6就是指ECMAScript 6。java

儘管 ECMAScript 是一個重要的標準,但它並非 JavaScript 惟一的部分,固然,也不是惟一被標準化的部分。實際上,一個完整的 JavaScript 實現是由如下 3 個不一樣部分組成的:python

  • 核心(ECMAScript)
  • 文檔對象模型(DOM) Document object model (整合js,css,html)
  • 瀏覽器對象模型(BOM) Broswer object model(整合js和瀏覽器)

簡單地說,ECMAScript 描述了JavaScript語言自己的相關內容。正則表達式

JavaScript 是腳本語言
JavaScript 是一種輕量級的編程語言。編程

JavaScript 是可插入 HTML 頁面的編程代碼。json

JavaScript 插入 HTML 頁面後,可由全部的現代瀏覽器執行。數組

JavaScript引入方式

Script標籤內寫代碼

<script> // 在這裏寫你的JS代碼 </script>

引入額外的JS文件

<script src="myscript.js"></script>

JavaScript語言規範

註釋(註釋是代碼之母)

// 這是單行註釋 
/* 這是多行註釋 */

結束符

JavaScript中的語句要以分號(;)爲結束符。瀏覽器

JavaScript語言基礎

變量聲明

  1. JavaScript的變量名可使用_,數字,字母,$組成,不能以數字開頭。
  2. 聲明變量使用 var 變量名; 的格式來進行聲明
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

再次補充:

abstract            摘要
boolean             布爾
byte                字節
char                字符
class               類
const               常量
debugger            調試器
double              雙
enum                枚舉
export              出口
extends             擴展
final               最後
float               浮動
goto                轉到
implements          實現了
import              進口
int                 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是字符串

數值(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) 分割

拼接字符串通常使用「+」

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)個字符結束(不包含該位置字符)

補充:

ES6中引入了模板字符串。模板字符串(template string)是加強版的字符串,用反引號(`)標識。它能夠當作普通字符串使用,也能夠用來定義多行字符串,或者在字符串中嵌入變量。

// 普通字符串

`這是普通字符串!`

// 多行文本

`這是多行的 文本`

// 字符串中嵌入變量

var name = "cxw",

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表示值是空,通常在須要指定或清空一個變量時纔會使用,如 name=null;
  • undefined表示當聲明一個變量但未初始化時,該變量的默認值是undefined。還有就是函數無明確的返回值時,返回的也是undefined。

null表示變量的值是空(null能夠手動清空一個變量的值,使得該變量變爲object類型,值爲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() 返回一個數組元素調用函數處理後的值的新數組

forEach()

語法:

forEach(function(currentValue, index, arr), thisValue)

參數:

參數 描述
function(currentValue, index, arr) 必需。 數組中每一個元素須要調用的函數。 函數參數:參數描述currentValue必需。當前元素index可選。當前元素的索引值。arr可選。當前元素所屬的數組對象。
thisValue 可選。傳遞給函數的值通常用 "this" 值。 若是這個參數爲空, "undefined" 會傳遞給 "this" 值

img

img

splice()

語法:

splice(index,howmany,item1,.....,itemX)

參數:

參數 描述
index 必需。規定從何處添加/刪除元素。 該參數是開始插入和(或)刪除的數組元素的下標,必須是數字。
howmany 必需。規定應該刪除多少元素。必須是數字,但能夠是 "0"。 若是未規定此參數,則刪除從 index 開始到原數組結尾的全部元素。
item1, ..., itemX 可選。要添加到數組的新元素

map()

語法:

map(function(currentValue,index,arr), thisValue)
參數 描述


參數 描述


dfddfdf

參數:

參數 描述
function(currentValue, index,arr) 必須。函數,數組中的每一個元素都會執行這個函數 函數參數: currentValue必須。當前元素的值
index可選。當期元素的索引值
arr可選。當期元素屬於的數組對象
thisValue 可選。對象做爲該執行回調時使用,傳遞給函數,用做 "this" 的值。 若是省略了 thisValue ,"this" 的值爲 "undefined"

img

注意:

關於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(i);

}

補充:

ES6新引入了一種新的原始數據類型(Symbol),表示獨一無二的值。它是JavaScript語言的第7種數據類型。

類型查詢

typeof "abc" // "string"

typeof null // "object"

typeof true // "boolean"

typeof 123 // "number"

typeof是一個一元運算符(就像++,--,!,- 等一元運算符),不是一個函數,也不是一個語句。

對變量或值調用 typeof 運算符將返回下列值之一:

  • undefined - 若是變量是 Undefined 類型的
  • boolean - 若是變量是 Boolean 類型的
  • number - 若是變量是 Number 類型的
  • string - 若是變量是 String 類型的
  • object - 若是變量是一種引用類型或 Null 類型的

運算符

算數運算符

\+ - * / % ++ --

var x=10;
var res1=x++;
var res2=++x;

res1;
10
res2;
12

**這裏因爲的x++和++x在出現賦值運算式,x++會先賦值再進行自增1運算,而++x會先進行自增運算再賦值!**

比較運算符

>
 >=
 <
 <=
 !=
 ==
 ===
 !==

注意:

1 == 「1」 // true 弱等於 
1 === "1" // false 強等於
//上面這張狀況出現的緣由在於JS是一門弱類型語言(會自動轉換數據類型),因此當你用兩個等號進行比較時,JS內部會自動先將
//數值類型的1轉換成字符串類型的1再進行比較,因此咱們之後寫JS涉及到比較時儘可能用三等號來強制限制類型,防止判斷錯誤

邏輯運算符

&& || !

賦值運算符

= += -= *= /=

流程控制

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
//這裏的三元運算順序是先寫判斷條件a>b再寫條件成立返回的值爲a,條件不成立返回的值爲b;三元運算能夠嵌套使用;

var a=10,b=20;
var x=a>b ?a:(b=="20")?a:b;

x
10

函數

函數定義

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; //這裏的return只能返回一個值,若是想返回多個值須要本身手動給他們包一個數組或對象中

}

函數中的arguments參數

function add(a,b){

   console.log(a+b);

   console.log(arguments.length);
   **console.log(arguments[0]);//arguments至關於將出傳入的參數所有包含,這裏取得就是第一個元素1**

}

add(1,2)

 



輸出:

3

2
1

注意:

函數只能返回一個值,若是要返回多個值,只能將其放在數組或對象中返回。

函數的全局變量和局部變量

局部變量

在JavaScript函數內部聲明的變量(使用 var)是局部變量,因此只能在函數內部訪問它(該變量的做用域是函數內部)。只要函數運行完畢,本地變量就會被刪除。

全局變量:

在函數外聲明的變量是全局變量,網頁上的全部腳本和函數都能訪問它。

變量生存週期:

JavaScript變量的生命期從它們被聲明的時間開始。

局部變量會在函數運行之後被刪除。

全局變量會在頁面關閉後被刪除。

做用域

首先在函數內部查找變量,找不到則到外層函數查找,逐步找到最外層。與python做用域關係查找如出一轍!

幾個例子:

var city = "BeiJing";

function f() {

   var city = "ShangHai";

   function inner(){

     var city = "ShenZhen";

     console.log(city);

   }

   inner();

}

f(); //輸出結果是?
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()以後的結果是?

img

第二題:

var age = 18; function foo(){ console.log(age); var age = 22; console.log(age); function age(){ console.log("呵呵"); } console.log(age); } foo(); // 執行後的結果是?

img

詞法分析過程:
一、分析參數,有一個參數,造成一個 AO.age=undefine;
二、分析變量聲明,有一個 var age, 發現 AO 上面已經有一個 AO.age,所以不作任何處理
三、分析函數聲明,有一個 function age(){...} 聲明, 則把原有的 age 覆蓋成 AO.age=function(){...};

最終,AO上的屬性只有一個age,而且值爲一個函數聲明

執行過程:
注意:執行過程當中全部的值都是從AO對象上去尋找

一、執行第一個 console.log(age) 時,此時的 AO.age 是一個函數,因此第一個輸出的一個函數
二、這句 var age=22; 是對 AO.age 的屬性賦值, 此時AO.age=22 ,因此在第二個輸出的是 2
三、同理第三個輸出的仍是22, 由於中間再沒有改變age值的語句了

內置對象和方法

JavaScript中的全部事物都是對象:字符串、數字、數組、日期,等等。在JavaScript中,對象是擁有屬性和方法的數據。

咱們在學習基本數據類型的時候已經帶你們瞭解了,JavaScript中的Number對象、String對象、Array對象等。

注意var s1 = "abc"和var s2 = new String("abc")的區別:typeof s1 --> string而 typeof s2 --> Object

img

自定義對象

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結構實現。

var m = new Map();
var o = {p: "Hello World"}

m.set(o, "content"}
m.get(o)  // "content"

m.has(o)  // true
m.delete(o)  // true
m.has(o) // false

擴展:js面向對象繼承

// 父類構造函數
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 星期三」格式輸出。

const WEEKMAP = {  
  0:"星期天",
  1:"星期一",
  2:"星期二",
  3:"星期三",
  4:"星期四",
  5:"星期五",
  6:"星期六"
};  //定義一個數字與星期的對應關係對象


function showTime() {
    var d1 = new Date();
    var year = d1.getFullYear();
    var month = d1.getMonth() + 1;  //注意月份是從0~11
    var day = d1.getDate();
    var hour = d1.getHours();
    var minute = d1.getMinutes() < 10?"0"+d1.getMinutes():d1.getMinutes();  //三元運算

    var week = WEEKMAP[d1.getDay()];  //星期是從0~6

    var strTime = `
    ${year}-${month}-${day} ${hour}:${minute} ${week}
    `;
    console.log(strTime)
};

showTime();

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對象(正則表達式)

// 定義正則表達式兩種方式
var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9]{5,11}");
var reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,9}$/;

// 正則校驗數據
reg1.test('jason666')
reg2.test('jason666')

/*第一個注意事項,正則表達式中不能有空格*/ 

// 全局匹配
var s1 = 'egondsb dsb dsb';
s1.match(/s/)
s1.match(/s/g)
var reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,9}$/g
reg2.test('egondsb');
reg2.test('egondsb');
reg2.lastIndex;
/*第二個注意事項,全局匹配時有一個lastIndex屬性*/

// 校驗時不傳參數
var reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,9}$/
reg2.test();
reg2.test(undefined);

var reg3 = /undefined/;
reg3.test();

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)      返回角的正切。
相關文章
相關標籤/搜索