第一章
defer屬性的作用
<script type="text/javascript" defer="defer" src="xxx.js"><script>
相當于告訴瀏覽器立即下載,但延遲執(zhí)行
async屬性的作用
與defer類似,只是標記為async的腳本不保證按照指定它們的先后順序執(zhí)行
</script>字符串問題
在使用<script>嵌入JavaScript代碼時,記住不要在代碼中的任何地方出現(xiàn)"</script>"字符串。例如下面一個錯誤:
<script type="text/javascript">
function sayScript() {
alert("</script>");
}
src屬性
需要注意的是,帶有src屬性的<script>元素如果包含了嵌入的代碼,則只會下載并執(zhí)行腳本文件,潛入的代碼會被忽略,比如:
<script src="xxx.js" type="text/javascript">
alert("hello") // 這句不會被執(zhí)行
</script>
數(shù)據(jù)類型
ECMAScript中規(guī)定了五種簡單數(shù)據(jù)類型(基本數(shù)據(jù)類型)和一種復雜數(shù)據(jù)類型:
- 簡單數(shù)據(jù)類型
- Undefined
- Null
- Boolean
- Number
- String
- 復雜數(shù)據(jù)類型
- Object
typeof操作
typeof是一個操作符而不是函數(shù),但也可以加圓括號使用
var message = "something"
alert(typeof message); // "string"
alert(typeof(message)); // "string"
alert(typeof 95); // "number
typeof返回的可能值有:
- "number"
- "string"
- "boolean"
- "undefined"
- "object" (null也返回"object")
- "function" (從技術(shù)角度講,函數(shù)在ECMAScript中是對象,然而由于特殊性,因此通過typeof來區(qū)分函數(shù)和其他對象是有必要的)
對尚未初始化的變量和未聲明的變量執(zhí)行typeof操作都會返回undefined:
var message;
// 下面這個變量并未聲明
// var age
alert(typeof message); // "undefined"
alert(typeof age); // "undefined"
對尚未聲明的變量,只能執(zhí)行一項操作,即typeof,其他操作將導致報錯。
undefined值是派生自null值的,因此ECMA-262規(guī)定對它們的相等性測試要返回true(兩個等號):
alert(null == undefined); // true
如果用三個等號則返回false:
alert(null === undefined); // false
數(shù)據(jù)的Boolean值
數(shù)據(jù)類型 | true | false |
---|---|---|
String | 任何非空字符串 | ""(空字符串) |
Number | 任何非零數(shù)值(包括無窮大) | 0和NaN |
Object | 任何對象 | null |
Undefined | undefined |
ECMAScript中所有類型的值都有與Boolean值等價的值
Number
八進制用前置0代表,十六進制用前置0x代表,如果前置了0,但是數(shù)值超過八進制,則前置0被忽略,最終按十進制表示。
var n1 = 070; // 八進制的56
var n2 = 079; // 無效的八進制數(shù)值--解析為79
var n3 = 0x1f; // 十六進制的31,可大寫,也可小寫
由于浮點數(shù)值需要的內(nèi)存空間是整數(shù)的兩倍,因此ECMAScript會不失時機地將浮點數(shù)值轉(zhuǎn)化為整數(shù)值。
var floatNum1 = 1.; // 小數(shù)點后面沒有數(shù)字,解析為1
var floatNum2 = 10.0; // 整數(shù),解析為10
永遠不要測試某個特定的浮點數(shù)值。
if (a + b == 0.3) { // 不要做這樣的測試!
alert("you got 0.3");
}
任何數(shù)除以0將得到NaN,任何涉及NaN地操作都會返回NaN,NaN與任何值都不想等,包括NaN本身。
isNaN()方法可以用來檢測是否是NaN,isNaN()在接收到一個值之后,會嘗試將這個值轉(zhuǎn)換為數(shù)值,某些不是數(shù)值的值會直接轉(zhuǎn)換為數(shù)值,例如字符串“10”或Boolean值:
alert(isNaN(NaN)); // true
alert(isNaN(10)); // false
alert(isNaN("10")); // false (可以被轉(zhuǎn)換為數(shù)值10)
alert(isNaN("blue")); // true
alert(isNaN(true)); // false(可以被轉(zhuǎn)換為數(shù)值1)
盡管有點不可思議,但isNaN確實也適用于對象。在基于對象調(diào)用isNaN()時,會首先調(diào)用對象的valueOf()方法,然后確定該方法返回的值是否可以轉(zhuǎn)換為數(shù)值,如果不能,則基于這個返回值再調(diào)用toString()方法,再測試返回值。
Object
Object的每個實例都具有下列屬性和方法
- Constructor 構(gòu)造函數(shù)
- hasOwnProperty(propertyName): 用于檢查給定的屬性在當前實例中(而不是在實例原型中)是否存在。其中,作為參數(shù)的屬性名必須以字符串形式指定。
- isPrototypeOf(object)
- propertyIsEnumerable
- toLocalString()
- toString()
- valueOf()
一元操作符
var s1 = "2";
var s2 = "z";
var b = false;
var f = 1. 1;
var o = {
valueOf: function() { return -1; }
};
s1++; // 值 變成 數(shù)值 3
s2++; // 值 變成 NaN
b++; // 值 變成 數(shù)值 1
f--; // 值 變成 0. 10000000000000009( 由于 浮點 舍入 錯誤 所致)
o--; // 值 變成 數(shù)值- 2
一元+操作符加在變量前面,等同于Number()操作。
var s1 = "2";
var s2 = "z";
var b = false;
var f = 1. 1;
var o = {
valueOf: function() { return -1; }
};
s1++; // 值 變成 數(shù)值 3
s2++; // 值 變成 NaN
b++; // 值 變成 數(shù)值 1
f--; // 值 變成 0. 10000000000000009( 由于 浮點 舍入 錯誤 所致)
o--; // 值 變成 數(shù)值- 2
o = +o; // 值變成-1