《NBA 2K22》揭露全新MyTEAM更新內容
JavaScript概述
ECMAScript和JavaScript的關係
1996年11月,JavaScript的創造者--Netscape公司,決定將JavaScript提交給國際標準化組織ECMA,希望這門語言能夠成為國際標準。次年,ECMA釋出262號標準檔案(ECMA-262)的第一版,規定了瀏覽器指令碼語言的標準,並將這種語言稱為ECMAScript,這個版本就是1.0版。
該標準一開始就是針對JavaScript語言制定的,但是沒有稱其為JavaScript,有兩個方面的原因。一是商標,JavaScript本身已被Netscape註冊為商標。而是想體現這門語言的制定者是ECMA,而不是Netscape,這樣有利於保證這門語言的開發性和中立性。
因此ECMAScript和JavaScript的關係是,前者是後者的規格,後者是前者的一種實現。
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。
儘管 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引入方式
Script標籤內寫程式碼
<script>
// 在這裡寫你的JS程式碼
</script>
引入額外的JS檔案
<script src="myscript.js"></script>
JavaScript語言規範
註釋(註釋是程式碼之母)
// 這是單行註釋
/*
這是多行註釋
*/
結束符
JavaScript中的語句要以分號(;)為結束符
JavaScript語言基礎
變數宣告
- JavaScript的變數名可以使用_,數字,字母,$組成,不能以數字開頭
- 宣告變數使用 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 = "jason", 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" 值 |
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" |
注意:
sort
可以使用以下方式遍歷陣列中的元素:
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涉及到比較時儘量用三等號來強制限制類型,防止判斷錯誤
邏輯運算子
&& || !
(and or not)
賦值運算子
= += -= *= /=
流程控制
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
21
注意:
函式只能返回一個值,如果要返回多個值,只能將其放在陣列或物件中返回。
函式的全域性變數和區域性變數
區域性變數:
在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()之後的結果是?
第二題:
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 () 獲取完整年份
//getYear () 獲取年
//getHours () 獲取小時
//getMinutes () 獲取分鐘
//getSeconds () 獲取秒
//getMilliseconds () 獲取毫秒
//getTime () 返回累計毫秒數(從1970/1/1午夜)
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();
RegExp
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) 返回角的正切。
Math
//僅供學習交流//