近日的項目需要用JavaScript完成,於是決定通讀《JavaScript高級程序設計第三版》,書是2012年的,比較老了,但是可以用來快速瞭解JavaScript大概,主要目的是爲讀開源的JS項目掃清一些障礙。
JavaScript組成
完整的JavaScript由ECMAScript、DOM和BOM三部分組成。
- ECMAScript,提供核心語言功能。
- DOM,文檔對象模型,提供訪問和操作網頁內容的方法和接口。
- BOM,瀏覽器對象模型,提供與瀏覽器交互的方法和接口。
HTML中使用JavaScript
在HTML中插入JavaScript需要使用
<script>
function sayScript() {
//注意轉義
alert("<\/script>");
}
</script>
HTML中包含外部JavaScript文件,推薦使用:
<script src='example.js'></script>
<script src="http://www.somewhere.com/afile.js"></script>
基本概念
- 大小寫敏感。
- 標識符:第一個字符必須是字母、下劃線或美元符號。推薦駝峯命名法。
- 註釋:單行註釋(//)和塊級註釋(/**/)。
- 嚴格模式:一種會對不安全操作拋出錯誤的模式。使用方法:
function doSomething() {
"use strict";
//函數體
}
- 變量:鬆散型變量,即可以用來保存任何類型的數據。定義方式
var message;
用var操作符定義的變量將成爲定義該變量作用域中的局部變量。也就是說,如果在函數中使用var定義一個變量,那麼這個變量在函數退出後就會被銷燬。不用var定義的變量是全局變量,但是儘量不要在局部作用域中定義全局變量,因爲難以維護。 - 數據類型:簡單數據類型有5種,Undefined, Null, Boolean, Number和String。
- Object類型:Object實例都具有以下屬性和方法。(1)constructor(2)hasOwnProperty(propertyName):用於檢查給定屬性在當前對象實例中是否存在(3)isPrototypeOf(object):用於檢查傳入的對象是否是傳入對象的原型(4)propertyIsEnumerable(propertyName):用於檢查給定的屬性是否能夠用for-in語句(5)toLocalString():返回對象的字符串表示,該字符串與執行環境的地區對應。(6)toString():返回對象的字符串表示。(7)valueOf():返回對象的字符串、數值或布爾值表示。通常與toString()的返回值相同。
- 相等操作符。JavaScript中有相等(==)和不相等(!=)、全等(===)和不全等(!==)兩類相等操作符。全等只在兩個操作數未經轉換就相等的情況下返回true,不全等只在兩個操作數未經轉換就不相等的情況下返回true。例如
var result1 = ("55" == 55); //true,因爲轉換後相等
var result2 = ("55" === 55);//false
var result3 = ("55" != 55); //false,因爲轉換後相等
var result4 = ("55" !== 55); //true
- with語句,這個比較好玩,可以將代碼的作用域設置到一個特定對象中。
var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;
// 用with語句
with(location) {
var qs = search.substring(1);
var hostName = hostname;
var url = href;
}
- 函數。用function聲明。特別之處在於它接收的參數始終都是個數組,而不關心數組中包含哪寫參數,在函數體內可以通過arguments對象來訪問參數數組,例如
function sayHi() {
alert("Hello " + arguments[0] +"," + arguments[1]);
}
調用sayHi函數的時候可以傳任意個參數。爲了保證程序可讀性和可維護性,還是推薦用和其他語言一樣的方式聲明函數,在不確定參數個數時用這種方式很方便。 - 沒有重載。因爲上面的特性,所以導致JavaScript沒有重載的說法,如果兩個函數名稱一樣,上面的會被下面的覆蓋。
BOM
BOM提供了很多對象,用於訪問瀏覽器的功能,這些功能與任何網頁內容無關。
window對象
BOM的核心對象,表示瀏覽器的一個實例。
- 全局作用域中聲明的變量、函數都會成爲window對象的屬性和方法。
var age = 29;
function sayAge() {
alert(this.age);
}
alert(window.age); //29
sayAge(); //29
window.sayAge(); //29
- 如果頁面中包含frame,則每個frame都有自己的window對象,並且保存在frames集合中。訪問最外層的frame,可以用window.frames[0],推薦用top.frames[0]。top對象始終指向最外層框架。這個frame就是瀏覽器劃分的區域,比如rightFrame,leftFrame。
- 窗口位置、窗口大小、導航和打開窗口都是window對象的屬性,具體用到具體查。
- 間歇調用(setInterval())和超時調用(setTimeout())是window對象的方法,感覺比較好玩,JavaScript是單線程語言,但它允許通過設置超時值和間歇值來調度代碼在特定時刻執行。間歇調用是每隔指定的時間就執行一次代碼,超時調用是指定的時間過後執行代碼。有概念就好,具體用時再查。
“`
setInterval(function () {
alert(“Hello world”);
}, 1000);
//雖然可以寫成 setInterval(“Hello world”, 1000);但是由於字符串容易出問題,所以推薦寫成function
“`
location對象
提供了與當前窗口中加載的文檔有關的信息,還提供了一些導航功能。它既是window對象的屬性,也是document對象的屬性,即window.location和docuent.location引用的是同一個對象。屬性有hash、host、hostname、href、pahtname、port、protocol、search。
screen和history對象
screen對象保存着與客戶端顯示器有關的信息,一般只用於站點分析。history用於訪問瀏覽器的歷史記錄。
DOM
DOM可以將任何HTML或XML文檔描繪成一個由多層節點構成的樹。
<html>
<head>
<title>Sample Page</title>
</head>
<body>
<p>Hello World!</p>
</body>
</html>
- Node類型。JavaScript中所有節點類型都繼承自Node類型。
- Document類型。JavaScript通過Document類型表示文檔。在瀏覽器中,document對象是HTMLDocument(繼承自Document類型)的一個實例,表示整個HTML頁面。
<html>
<body>
</body>
</html>
經過瀏覽器解析後,文檔中只包含一個子節點,元素。可以通過documentElemtn或者childNodes列表來訪問這個元素。
var html = document.documentElement;//取得對html的引用
alert(html === document.childNodes[0]); // true
alert(html === document.firstChild); //true