javascript筆記(一)
變量
-
局部變量
用 var 操作符定義的變量將成為定義該變量的作用域中的局部變量。也就是說,如果在函數(shù)中使用 var 定義一個(gè)變量,那么這個(gè)變量在函數(shù)退出后就會被銷毀,例如:``` function test(){ var message = "hi"; // 局部變量 } test(); alert(message); // 錯(cuò)誤! ```
這里,變量 message 是在函數(shù)中使用 var 定義的。當(dāng)函數(shù)被調(diào)用時(shí),就會創(chuàng)建該變量并為其賦值。而在此之后,這個(gè)變量又會立即被銷毀,因此例子中的下一行代碼就會導(dǎo)致錯(cuò)誤。不過,可以像下面這 樣省略 var 操作符,從而創(chuàng)建一個(gè)全局變量:
```
function test(){
message = "hi"; // 全局變量
}
test();
alert(message); // "hi"
```
? 這個(gè)例子省略了 var 操作符,因而 message 就成了全局變量。這樣,只要調(diào)用過一次 test()函數(shù),這個(gè)變量就有了定義,就可以在函數(shù)外部的任何地方被訪問到。
注:雖然省略 var 操作符可以定義全局變量,但這也不是我們推薦的做法。因?yàn)樵诰植孔饔糜蛑卸x的全局變量很難維護(hù),而且如果有意地忽略了 var 操作符,也會由于相應(yīng)變量不會馬上就有定義而導(dǎo)致不必要的混亂。
JavaScript 與其他語言的(如 Java)的重要區(qū)別是在 JavaScript 中語句塊(blocks)是沒有作用域的,只有函數(shù)有作用域。因此如果在一個(gè)復(fù)合語句中(如 if 控制結(jié)構(gòu)中)使用 var 聲明一個(gè)變量,那么它的作用域是整個(gè)函數(shù)(復(fù)合語句在函數(shù)中)。 但是從 ECMAScript Edition 6 開始將有所不同的, let 和 const 關(guān)鍵字允許你創(chuàng)建塊作用域的變量。
數(shù)據(jù)類型
JavaScript有5種原始類型(也稱為基本數(shù)據(jù)類型):Undefined、Null、Boolean、Number和String。還有1種復(fù)雜數(shù)據(jù)類型:Object。在JavaScript中Function、Arrary、Date...都是Object對象類型。
null和undefined是不一樣的。只聲明未賦值的變量,是undefined的。
var m;
undefined
null == undefined; // 因?yàn)?=有自動類型轉(zhuǎn)換
true
null === undefined;
false
NaN != NaN;
true
NaN !== NaN;
true
有一個(gè)isNaN()函數(shù),測試入?yún)⑹欠癫荒苻D(zhuǎn)為數(shù)字。
isNaN(true);
false
isNaN(false);
false
isNaN("");
false
isNaN("ss");
true
isNaN(null);
false
isNaN(undefined);
true
isNaN([]);
false
isNaN({});
true
可以看到,布爾型,空字符串,null,空數(shù)組{}。都是可以轉(zhuǎn)為數(shù)字的。
undefined,空對象是不能轉(zhuǎn)為數(shù)字的。
在JavaScript中Object類型是所有它的實(shí)例的基礎(chǔ)。像我們知道的Array()、Date()、還有有意思的function()類型,都是從Object繼承的。Object 類型所具有的任何屬性和方法也同樣存在于更具體的對象中。
Object的每個(gè)實(shí)例都具有下列屬性和方法:
- constructor:保存著用于創(chuàng)建當(dāng)前對象的函數(shù)。
- hasOwnProperty(propertyName):用于檢查給定的屬性在當(dāng)前對象實(shí)例中(而不是在實(shí)例的原型中)是否存在。其中,作為參數(shù)的屬性名(propertyName)必須以字符串形式指定(例如:o.hasOwnProperty("name"))
- isPrototypeOf(object):用于檢查傳入的對象是否是調(diào)用方的原型
- propertyIsEnumerable(propertyName):用于檢查給定的屬性是否能夠使用 for-in 語句(本章后面將會討論)來枚舉。
- toString():返回對象的字符串表示。
- valueOf():返回對象的字符串、數(shù)值或布爾值表示。
轉(zhuǎn)化為布爾
簡單來說就是以下六個(gè)值轉(zhuǎn)化結(jié)果為false,其他的值全部轉(zhuǎn)換為true
undefined
null
""(空字符串)
0
NaN
-
false
特別注意:所有對象的布爾值都是trueBoolean({}) true
注意,js是區(qū)分大小寫的,不要寫錯(cuò)成boolean。
轉(zhuǎn)換為數(shù)字
-
Number()轉(zhuǎn)換任意類型參數(shù)為數(shù)值
Number(true) 1 Number(false) 0 Number(undefined) NaN Number(null) 0 Number("") 0 Number("1.1") 1.1 Number("0xA") 10 --------自動進(jìn)行進(jìn)制轉(zhuǎn)換 Number("2a") NaN Number({}) NaN Number([]) 0Number()轉(zhuǎn)換對象:
- 先調(diào)用對象自身的valueOf方法,如果該方法返回原始類型的值(數(shù)值、字符串和布爾值),則直接對該值使用Number方法,不再進(jìn)行后續(xù)步驟。
- 如果valueOf方法返回復(fù)合類型的值,再調(diào)用對象自身的toString方法,如果toString方法返回原始類型的值,則對該值使用Number方法,不再進(jìn)行后續(xù)步驟。
- 如果toString方法返回的是復(fù)合類型的值,則報(bào)錯(cuò)。
-
parseInt()用于將字符串轉(zhuǎn)換為整數(shù)
parseInt("1.2") 1 parseInt("1.7") 1 -----------截?cái)?,非四舍五? parseInt("a222") NaN parseInt("2a") 2 ----------匹配最長數(shù) parseInt("") NaN ----------是NaN parseInt("0xA") 10 ---------自動進(jìn)制轉(zhuǎn)換 parseFloat()將字符串轉(zhuǎn)為小數(shù)
parseFloat("1.7")
1.7
parseFloat("1.7e3")
1700
parseFloat("")
NaN
- 關(guān)于空字符串
Number("")
0
parseInt("")
NaN
isNaN("")
false
parseInt()會返回NaN。isNaN()卻又返回false。
自動類型轉(zhuǎn)換
- “+” 轉(zhuǎn)為字符串拼接
- “-”,“*”,“/”,"%" 轉(zhuǎn)為數(shù)值運(yùn)算。調(diào)用Number()
- "+","-"做一元運(yùn)算時(shí),轉(zhuǎn)為數(shù)值
- 布爾運(yùn)算符,轉(zhuǎn)為布爾型
- == 和 != 運(yùn)算,如果類型不同,先進(jìn)行類型轉(zhuǎn)換。
原則是:- 如果有一個(gè)操作數(shù)是布爾值,則在比較相等性之前先將其轉(zhuǎn)換為數(shù)值——false 轉(zhuǎn)換為 0,而true 轉(zhuǎn)換為 1;
- 如果一個(gè)操作數(shù)是字符串,另一個(gè)操作數(shù)是數(shù)值,在比較相等性之前先將字符串轉(zhuǎn)換為數(shù)值;
- 如果一個(gè)操作數(shù)是對象,另一個(gè)操作數(shù)不是,則調(diào)用對象的 valueOf()方法,用得到的基本類型值按照前面的規(guī)則進(jìn)行比較;
- 這兩個(gè)操作符在進(jìn)行比較時(shí)則要遵循下列規(guī)則。
null 和 undefined 是相等的。
要比較相等性之前,不會將 null 和 undefined 轉(zhuǎn)換成其他任何值。
例如:
null == undfined //true
"NaN" == NaN //false
NaN == NaN //false
5 == NaN //false
NaN != NaN //true
false == 0 //true
true == "1" //true
undefined == 0 // false
類型檢測
typeof()
(1) "undefined"——如果這個(gè)值未定義;
(2) "boolean"——如果這個(gè)值是布爾值;
(3) "string"——如果這個(gè)值是字符串;
(4) "number"——如果這個(gè)值是數(shù)值;
(5) "object"——如果這個(gè)值是對象或 null;
(6) "function"——如果這個(gè)值是函數(shù)。
相等與嚴(yán)格相等
相等運(yùn)算符(==)比較兩個(gè)“值”是否相等,嚴(yán)格相等運(yùn)算符(===)比較它們是否為“同一個(gè)值”。兩者的一個(gè)重要區(qū)別是,如果兩個(gè)值不是同一類型,嚴(yán)格相等運(yùn)算符(===)直接返回false,而相等運(yùn)算符(==)會將它們轉(zhuǎn)化成同一個(gè)類型,再用嚴(yán)格相等運(yùn)算符進(jìn)行比較。
相等運(yùn)算符隱藏的類型轉(zhuǎn)換,會帶來一些違反直覺的結(jié)果。
建議不要使用相等運(yùn)算符(==),最好只使用嚴(yán)格相等運(yùn)算符(===)。
void運(yùn)算符
void運(yùn)算符的作用是執(zhí)行一個(gè)表達(dá)式,然后返回undefined。
void 0 // undefined
void (0) // undefined
上面是void運(yùn)算符的兩種寫法,都正確。建議采用后一種形式,即總是使用括號。因?yàn)関oid運(yùn)算符的優(yōu)先性很高,如果不使用括號,容易造成錯(cuò)誤的結(jié)果。比如,void 4+7 實(shí)際上等同于 (void 4) +7。
下面是void運(yùn)算符的一個(gè)例子。
var x = 3;
void (x = 5) //undefined
x // 5
這個(gè)運(yùn)算符主要是用于書簽工具(bookmarklet)或者用于在超級鏈接中插入代碼,目的是返回undefined可以防止網(wǎng)頁跳轉(zhuǎn)。
比如,下面是常用于網(wǎng)頁鏈接的觸發(fā)鼠標(biāo)點(diǎn)擊事件的寫法。
<a href="#" onclick="f();">文字</a>
上面代碼有一個(gè)問題,函數(shù)f必須返回false,或者onclick事件必須返回false,否則會引起瀏覽器跳轉(zhuǎn)到另一個(gè)頁面。
function f(){
// some code
return false;
}
void運(yùn)算符可以取代上面兩種寫法。
<a href="javascript:void(0)" onclick="f();">文字</a>