JavaScrip 概述 -- 前端知識

JavaScript概述css

ECMAScriptJavaScript的關係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) 
  • 文檔對象模型(DOM) Document object model (整合js,css,html)
  • 瀏覽器對象模型(BOM) Broswer object model(整合js和瀏覽器)

簡單地說,ECMAScript 描述了JavaScript語言自己的相關內容。閉包

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

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

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

JavaScript 很容易學習。

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

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。

nullundefined

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

必需。 數組中每一個元素須要調用的函數。
函數參數:

參數

描述

currentValue

必需。當前元素

index

可選。當前元素的索引值。

arr

可選。當前元素所屬的數組對象。

thisValue

可選。傳遞給函數的值通常用 "this" 值。
若是這個參數爲空, "undefined" 會傳遞給 "this" 值

splice()

語法:

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

參數: 

參數

描述

index

必需。規定從何處添加/刪除元素。
該參數是開始插入和(或)刪除的數組元素的下標,必須是數字。

howmany

必需。規定應該刪除多少元素。必須是數字,但能夠是 "0"。
若是未規定此參數,則刪除從 index 開始到原數組結尾的全部元素。

item1, ..., itemX

可選。要添加到數組的新元素

map()

語法:

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

參數:

參數

描述

function(currentValue, index,arr)

必須。函數,數組中的每一個元素都會執行這個函數
函數參數:

參數

描述

currentValue

必須。當前元素的值

index

可選。當期元素的索引值

arr

可選。當期元素屬於的數組對象

thisValue

可選。對象做爲該執行回調時使用,傳遞給函數,用做 "this" 的值。
若是省略了 thisValue ,"this" 的值爲 "undefined"

補充:

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 類型的

運算符

算數運算符

+ - * / % ++ --

比較運算符

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

注意:

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午夜)

相關文章
相關標籤/搜索