Javascript 學習筆記--語法篇
很久沒用js了,最近因為要做個專案,要用到前端,於是重拾起來看看。本文應該適合於跟我一樣,用過js但是又記得不是很清楚的孩紙。
[TOC]
歷史
具體可以參見 javascript歷史這篇文章 ,我這裡就簡要說說.
- Netscape 發明了 JavaScript
- 1997 年,JavaScript 1.1 作為一個草案提交給歐洲計算機制造商協會(ECMA),ECMAScript 作為 JavaScript 實現的基礎
- 2005年,蘋果公司在KHTML引擎基礎上,建立了WebKit引擎。
- 2005年,Ajax方法(Asynchronous Javascript and XML)正式誕生,Jesse James Garrett發明了這個詞彙。它開始流行的標誌是,2月份釋出的Google Maps專案大量採用該方法。它幾乎成了新一代網站的標準做法,促成了Web 2.0時代的來臨。
- 2011年6月,ECMAscript 5.1版釋出,並且成為ISO國際標準(ISO/IEC 16262:2011)。目前瀏覽器使用的都是該標準,ECMA6還沒有完全相容。
- 2008年,V8編譯器誕生。這是Google公司為Chrome瀏覽器而開發的,它的特點是讓Javascript的執行變得非常快。它提高了JavaScript的效能,推動了語法的改進和標準化,改變外界對JavaScript的不佳印象。同時,V8是開源的,任何人想要一種快速的嵌入式指令碼語言,都可以採用V8,這擴充了JavaScript的應用領域。
- 2009年,Node.js專案誕生,創始人為Ryan Dahl,它標誌著Javascript可以用於伺服器端程式設計,從此網站的前端和後端可以使用同一種語言開發。並且,Node.js可以承受很大的併發流量,使得開發某些網際網路大規模的實時應用變得容易。
總之js已經變成世界上最流行的語言了,github上js的好多專案,star都破萬了,java的一般只是破千,可見js的影響力之大。
語法
開發環境
學習語法前我們先準備一下開發環境,比較靠譜的就是用chrome自帶的devtool,完全夠用了,而且還支援commomjs的console的列印。
首先建一個html檔案,算是一個殼。
<html>
<script src="./index.js"></script>
</html>
然後在同級目錄下新建index.js檔案。輸入
alert("hello world!")
再用chrome 瀏覽器開啟之前新建的html檔案,就完成了。現在點選chrome的設定-》更多工具-》開發者工具-》source,你就可以看到我們的js程式碼了,這個介面也可以編輯js檔案的。如下圖:var的作用域
js變數作用域可分為:"全域性變數"和"區域性變數"
- "全域性變數":申明在函式之外的變數
- "區域性變數":申明在函式體中的變數,並且只能在當前函式體內訪問,如:function(){var a = 0;}
注:在申明變數時凡是沒有var關鍵字,而直接賦值的變數均為全域性變數
例子1:
function test() {
a = 30;
var b = 20;
}
test();
console.log("a="+a); //這裡很明顯,a為全域性變數
console.log("b="+b);//b為區域性變數,故在函式test外呼叫是,提示未定義
var a=1;
function main(){
var a=2;//區域性變數
console.log(a);//2
}
main();
console.log(a);//1
//函式作用域憂於全域性作用域
最特殊的例子
var a = 1;
function test() {
console.log("a="+a); //這裡a為undefined
/*函式中宣告的變數在整個函式中都有定義。如果函式內部有定義變數,即使在定義之前輸出但會先執行後面定義語句,然後判斷輸出結果,所以說宣告的變數在整個函式中都是起作用的。*/
var a = 2;
}
test();
函式體會先判斷外面的a有沒有被重新定義,有的話就清除掉變數的定義,出了函式體再恢復。
let和var關鍵字異同
宣告後未賦值,表現相同
'use strict';
(function() {
var varTest;
let letTest;
console.log(varTest); //輸出undefined
console.log(letTest); //輸出undefined
}());
使用未宣告的變數,表現不同:
(function() {
console.log(varTest); //輸出undefined(注意要註釋掉下面一行才能執行)
console.log(letTest); //直接報錯:ReferenceError: letTest is not defined
var varTest = 'test var OK.';
let letTest = 'test let OK.';
}());
重複宣告同一個變數時,表現不同:
'use strict';
(function() {
var varTest = 'test var OK.';
let letTest = 'test let OK.';
var varTest = 'varTest changed.';
let letTest = 'letTest changed.'; //直接報錯:SyntaxError: Identifier 'letTest' has already been declared
console.log(varTest); //輸出varTest changed.(注意要註釋掉上面letTest變數的重複宣告才能執行)
console.log(letTest);
}());
變數作用範圍,表現不同
'use strict';
(function() {
var varTest = 'test var OK.';
let letTest = 'test let OK.';
{
var varTest = 'varTest changed.';
let letTest = 'letTest changed.';
}
console.log(varTest); //輸出"varTest changed.",內部"{}"中宣告的varTest變數覆蓋外部的letTest宣告
console.log(letTest); //輸出"test let OK.",內部"{}"中宣告的letTest和外部的letTest不是同一個變數
}());
命名規範
- 變數名稱 必須為 小寫字母。
- 類的命名使用駱駝命名規則,例如:
Account, EventHandler - 常量 必須 在物件(類)或者列舉變數的前部宣告。列舉變數的命名必須要有實際的意義,並且其成員 必須 使用駱駝命名規則或使用大寫:
var NodeTypes ={
Element :1,
DOCUMENT:2
} - 變數如果設定為私有,則前面 必須 新增下劃線。
this._somePrivateVariable = statement;
基本型別 string , number ,boolean
javascript雖然是鬆散型的語言,定義變數用var就可以了,但是實際上內部仍然有資料型別的區分,可以使用特性資料型別的方法。
String
字串文字是由單引號或雙引號所引用的字元。單引號和雙引號沒有區別。
在轉換的時候,很容易出問題,例如
console.log("30"+3) //33
console.log("30"-3) //27
講到String就不能不提到正則,js對於正則的支援是非常強大的。w3c介紹
直接量語法:
/pattern/attributes
呼叫時直接使用/"reg"/i.test()的形式
attributes 描述
i 執行對大小寫不敏感的匹配。
g 執行全域性匹配(查詢所有匹配而非在找到第一個匹配後停止)。
m 執行多行匹配。
test方法是說檢索字串中指定的值。返回 true 或 false。
Boolean
true,false
boolean主要是轉換的問題,像c語言一樣,如果是數字,只有0和NAN是false,否則為true。
空字串是false,否則為true,物件都是true,undefined和null也是false
雙重否定符(!!)或者Boolean()可以顯示將其它型別轉成布林值.
例如!!1 = true
Boolean(1) = true
Number
js支援的數字範圍是-2e31 到2e31之間,如果超出,是Infinity和-Infinity,這兩個是特殊的Number型別。
NaN(not a number) .如果一個字串或者布林不能轉換成數字,那麼他的值就是NaN。例如
var nValue = 1.0;
if(nValue == 'one') //false one被轉成NaN
還有isNaN(),用來監測是否是數字
,null和undefine也是nan
至於資料型別的方法,大家自己查api文件吧~
操作符
注意的是js不能這樣賦值
var a1,a2 =3;
這樣a1就沒有定義了
函式
函式分為兩種
// 1。 宣告函式
function Name(){
}
//或者
var func = function(params){
}
// 2. 匿名函式
var name = new function(){
}
當js解析它時,和宣告式函式不一樣,它將動態建立一個匿名函式,當其被呼叫後,該函式就將被自動刪除。如果在一個迴圈體內使用一個匿名函式,則每次使用都會被建立。
PS:!!函式就是一個物件
物件導向
原型
Object物件有一個prototype屬性,通過它可以擴充套件任意物件。
js本身可以動態建立方法和屬性,但是建立出來的只適用於當前物件。例如下面方法:
var num = new Number()
num.add=function(val1,val2){return val1 + val2}
var sum = num.add(8,3)
當通過protype擴充套件物件時,擴充套件的方法或屬性將適用於物件的所有例項,但是當擴充套件物件例項的時候,新的方法和屬性只適用於物件例項。例如
Number.prototype.add=function(val1,val2{return val1+val2};
var num = new Number();
var sum=num.add()
繼承
call()和apply()
call()和apply的作用都是呼叫其它物件的建構函式,對本物件進行賦值。
相關文章
- JavaScript學習筆記---基本語法JavaScript筆記
- Python學習筆記(語法篇)Python筆記
- JavaScript 語法筆記JavaScript筆記
- Html 語法學習筆記一HTML筆記
- Html 語法學習筆記二HTML筆記
- Html 語法學習筆記三HTML筆記
- JavaScript學習筆記 - 進階篇(3)- 流程控制語句JavaScript筆記
- JavaScript學習筆記2: js書寫語法及變數JavaScript筆記JS變數
- 《JavaScript語言精粹》學習筆記二JavaScript筆記
- 《JavaScript語言精粹》學習筆記一JavaScript筆記
- swift學習筆記《2》-swift語法Swift筆記
- 《PHP學習筆記——PHP基本語法》PHP筆記
- Hive學習筆記:基礎語法Hive筆記
- Swift 3學習筆記第一篇(語法概覽)Swift筆記
- JavaScript 藝術之美(一)序言和 JavaScript 語法(卞懂的學習筆記)JavaScript筆記
- Scala學習筆記(2)-基礎語法筆記
- Kotlin學習筆記-基礎語法Kotlin筆記
- 學習筆記二--Weex語法介紹筆記
- JavaScript學習筆記JavaScript筆記
- JavaScript 學習筆記JavaScript筆記
- Go學習筆記 - Go 基礎語法(1)Go筆記
- Go 學習筆記 - Go 基礎語法(2)Go筆記
- ES6語法學習筆記之promise筆記Promise
- js學習筆記(十二)——語法速查表JS筆記
- Erlang學習筆記(三)Erlang基礎語法筆記
- 【學習筆記】HTML篇筆記HTML
- JavaScript學習筆記(二)JavaScript筆記
- javaScript argument 學習筆記JavaScript筆記
- JavaScript學習筆記13JavaScript筆記
- JavaScript學習筆記01JavaScript筆記
- JavaScript學習筆記00JavaScript筆記
- 【JavaScript學習筆記】if使用JavaScript筆記
- Javascript 學習 筆記六JavaScript筆記
- Javascript 學習 筆記五JavaScript筆記
- Javascript 學習 筆記三JavaScript筆記
- Javascript 學習 筆記四JavaScript筆記
- 菜鳥學習筆記:Java基礎篇1(基礎語法、物件導向)筆記Java物件
- 英語學習筆記筆記