Netscape公司,決定將JavaScript提交給國際標準化組織ECMA,但願這門語言可以成爲國際標準。爲此體現這門語言的制定者是ECMA,而不是Netscape,這樣有利於保證這門語言的開發性和中立性。後來公司倒閉了,你們就繼續用,一點都不顧慮了...javascript
所以ECMAScript和JavaScript的關係是,前者是後者的規格,後者是前者的一種實現。css
<script> // 在這裏寫你的JS代碼 </script>
<script src="myscript.js"></script>
// 這是單行註釋 /* 這是 多行註釋 */
JavaScript中的語句要以分號(;)爲結束符。html
JavaScript的變量名可使用_,數字,字母,$組成,不能以數字開頭。java
聲明變量使用 var 變量名; 的格式來進行聲明python
變量名是區分大小寫的。正則表達式
推薦使用駝峯式命名規則。json
保留字不能用作變量名。數組
ES6新增了let命令,用於聲明變量。其用法相似於var,可是所聲明的變量只在let命令所在的代碼塊內有效。例如:for循環的計數器就很適合使用let命令。瀏覽器
ES6新增const用來聲明常量。一旦聲明,其值就不能改變。函數
ps:默認剛出來的定義出來的變量的值都是undefined
var x; // 此時x是undefined var x = 1; // 此時x是數字 var x = "Alex" // 此時x是字符串
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("123abh") // 返回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) | 分割 |
新語法模版字符串 `` 既支持多行文本,也支持字符串的替換
字符串憑藉相對於concat推薦使用加號拼接
切片推薦使用slice, substring不支持負數
split兩個參數,一個爲切分依據,第二個參數表示從切的結果中拿出幾個超出了就拿最多, 不會報錯
ES6中引入了模板字符串。模板字符串(template string)是加強版的字符串,用反引號(`)標識。它能夠當作普通字符串使用,也能夠用來定義多行字符串,或者在字符串中嵌入變量。
注意:
若是模板字符串中須要使用反引號,則在其前面要用反斜槓轉義。
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() | 排序 |
.forEach() | 將數組的每一個元素傳遞給回調函數 |
.splice() | 刪除元素,並向數組添加新元素。 |
.map() | 返回一個數組元素調用函數處理後的值的新數組 |
splice方法 在把須要傳的參數傳了後續的傳別的不會報錯
concat 至關於python的extend
語法:
forEach(function(currentValue, index, arr), thisValue)
兩個參數時候打印數值元素和序號
splice的用法爲先刪回加
map()
typeof "abc" // "string" typeof null // "object" typeof true // "boolean" typeof 123 // "number"
typeof是一個一元運算符(就像++,--,!,- 等一元運算符),不是一個函數,也不是一個語句。
對變量或值調用 typeof 運算符將返回下列值之一:
算數運算符
+ - * / % ++ -- 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涉及到比較時儘可能用三等號來強制限制類型,防止判斷錯誤
&& || !
對應python 的 and or not
= += -= *= /=
var a = 10; if (a > 5){ console.log("yes"); }else { console.log("no"); }
var a = 10; if (a > 5){ console.log("a > 5"); }else if (a < 5) { console.log("a < 5"); }else { console.log("a = 5"); }
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 (var i=0;i<10;i++) { console.log(i); }
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;三元運算能夠嵌套使用;
// 普通函數定義 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; }
一般配合 .length 來統計數量判斷
可以獲取到函數接受到的全部的參數,能夠更具該參數實現對函數調用時參數的限制
function add(a,b){ console.log(a+b); console.log(arguments.length); console.log(arguments[0]);//arguments至關於將出傳入的參數所有包含,這裏取得就是第一個元素1 } add(1,2)
局部變量:
在JavaScript函數內部聲明的變量(使用 var)是局部變量,因此只能在函數內部訪問它(該變量的做用域是函數內部)。只要函數運行完畢,本地變量就會被刪除。
全局變量:
在函數外聲明的變量是全局變量,網頁上的全部腳本和函數都能訪問它。
變量生存週期:
JavaScript變量的生命期從它們被聲明的時間開始。
局部變量會在函數運行之後被刪除。
全局變量會在頁面關閉後被刪除。
首先在函數內部查找變量,找不到則到外層函數查找,逐步找到最外層。與python做用域關係查找如出一轍!
當函數調用的前一瞬間,會先造成一個激活對象: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()以後的結果是?
結果: undefined 22
類型 | 內置對象 | 介紹 |
---|---|---|
數據類型 | Number | 數字對象 |
String | 字符串對象 | |
Boolean | 布爾值對象 | |
組合對象 | Array | 數組對象 |
Math | 數學對象 | |
Date | 日期對象 | |
高級對象 | Object | 自定義對象 |
Error | 錯誤對象 | |
Function | 函數對象 | |
RegExp | 正則表達式對象 | |
Global | 全局對象 |
JavaScript的對象(Object)本質上是鍵值對的集合(Hash結構),可是隻能用字符串做爲鍵。
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屬性 for (var i in a) { console.log(i, a[i]); }
//方法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()); //毫秒並不直接顯示
var d = new Date(); //getDate() 獲取日 //getDay () 獲取星期 //getMonth () 獲取月(0-11) //getFullYear () 獲取完全年份 //getYear () 獲取年 //getHours () 獲取小時 //getMinutes () 獲取分鐘 //getSeconds () 獲取秒 //getMilliseconds () 獲取毫秒 //getTime () 返回累計毫秒數(從1970/1/1午夜)
注意點,這邊的月是按序號來的 須要+1纔是正確月份
var str1 = '{"name": "Alex", "age": 18}'; var obj1 = {"name": "Alex", "age": 18}; // JSON字符串轉換成對象 var obj = JSON.parse(str1); // 對象轉換成JSON字符串 var str = JSON.stringify(obj1);
/ 定義正則表達式兩種方式 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();