javascript筆記(一)
變量
-
局部變量
用 var 操作符定義的變量將成為定義該變量的作用域中的局部變量。也就是說籍茧,如果在函數中使用 var 定義一個變量,那么這個變量在函數退出后就會被銷毀逗柴,例如:``` function test(){ var message = "hi"; // 局部變量 } test(); alert(message); // 錯誤! ```
這里专甩,變量 message 是在函數中使用 var 定義的钟鸵。當函數被調用時钉稍,就會創(chuàng)建該變量并為其賦值。而在此之后棺耍,這個變量又會立即被銷毀贡未,因此例子中的下一行代碼就會導致錯誤。不過蒙袍,可以像下面這 樣省略 var 操作符俊卤,從而創(chuàng)建一個全局變量:
```
function test(){
message = "hi"; // 全局變量
}
test();
alert(message); // "hi"
```
? 這個例子省略了 var 操作符,因而 message 就成了全局變量害幅。這樣消恍,只要調用過一次 test()函數,這個變量就有了定義以现,就可以在函數外部的任何地方被訪問到狠怨。
注:雖然省略 var 操作符可以定義全局變量,但這也不是我們推薦的做法邑遏。因為在局部作用域中定義的全局變量很難維護佣赖,而且如果有意地忽略了 var 操作符,也會由于相應變量不會馬上就有定義而導致不必要的混亂记盒。
JavaScript 與其他語言的(如 Java)的重要區(qū)別是在 JavaScript 中語句塊(blocks)是沒有作用域的憎蛤,只有函數有作用域。因此如果在一個復合語句中(如 if 控制結構中)使用 var 聲明一個變量纪吮,那么它的作用域是整個函數(復合語句在函數中)俩檬。 但是從 ECMAScript Edition 6 開始將有所不同的, let 和 const 關鍵字允許你創(chuàng)建塊作用域的變量碾盟。
數據類型
JavaScript有5種原始類型(也稱為基本數據類型):Undefined棚辽、Null、Boolean巷疼、Number和String晚胡。還有1種復雜數據類型:Object。在JavaScript中Function嚼沿、Arrary估盘、Date...都是Object對象類型。
null和undefined是不一樣的骡尽。只聲明未賦值的變量遣妥,是undefined的。
var m;
undefined
null == undefined; // 因為==有自動類型轉換
true
null === undefined;
false
NaN != NaN;
true
NaN !== NaN;
true
有一個isNaN()函數攀细,測試入參是否不能轉為數字箫踩。
isNaN(true);
false
isNaN(false);
false
isNaN("");
false
isNaN("ss");
true
isNaN(null);
false
isNaN(undefined);
true
isNaN([]);
false
isNaN({});
true
可以看到爱态,布爾型,空字符串境钟,null锦担,空數組{}。都是可以轉為數字的慨削。
undefined洞渔,空對象是不能轉為數字的。
在JavaScript中Object類型是所有它的實例的基礎缚态。像我們知道的Array()磁椒、Date()、還有有意思的function()類型玫芦,都是從Object繼承的浆熔。Object 類型所具有的任何屬性和方法也同樣存在于更具體的對象中。
Object的每個實例都具有下列屬性和方法:
- constructor:保存著用于創(chuàng)建當前對象的函數桥帆。
- hasOwnProperty(propertyName):用于檢查給定的屬性在當前對象實例中(而不是在實例的原型中)是否存在医增。其中,作為參數的屬性名(propertyName)必須以字符串形式指定(例如:o.hasOwnProperty("name"))
- isPrototypeOf(object):用于檢查傳入的對象是否是調用方的原型
- propertyIsEnumerable(propertyName):用于檢查給定的屬性是否能夠使用 for-in 語句(本章后面將會討論)來枚舉环葵。
- toString():返回對象的字符串表示调窍。
- valueOf():返回對象的字符串、數值或布爾值表示张遭。
轉化為布爾
簡單來說就是以下六個值轉化結果為false,其他的值全部轉換為true
undefined
null
""(空字符串)
0
NaN
-
false
特別注意:所有對象的布爾值都是trueBoolean({}) true
注意邓萨,js是區(qū)分大小寫的,不要寫錯成boolean菊卷。
轉換為數字
-
Number()轉換任意類型參數為數值
Number(true) 1 Number(false) 0 Number(undefined) NaN Number(null) 0 Number("") 0 Number("1.1") 1.1 Number("0xA") 10 --------自動進行進制轉換 Number("2a") NaN Number({}) NaN Number([]) 0
Number()轉換對象:
- 先調用對象自身的valueOf方法缔恳,如果該方法返回原始類型的值(數值、字符串和布爾值)洁闰,則直接對該值使用Number方法歉甚,不再進行后續(xù)步驟。
- 如果valueOf方法返回復合類型的值扑眉,再調用對象自身的toString方法纸泄,如果toString方法返回原始類型的值,則對該值使用Number方法腰素,不再進行后續(xù)步驟聘裁。
- 如果toString方法返回的是復合類型的值,則報錯弓千。
-
parseInt()用于將字符串轉換為整數
parseInt("1.2") 1 parseInt("1.7") 1 -----------截斷衡便,非四舍五入 parseInt("a222") NaN parseInt("2a") 2 ----------匹配最長數 parseInt("") NaN ----------是NaN parseInt("0xA") 10 ---------自動進制轉換
parseFloat()將字符串轉為小數
parseFloat("1.7")
1.7
parseFloat("1.7e3")
1700
parseFloat("")
NaN
- 關于空字符串
Number("")
0
parseInt("")
NaN
isNaN("")
false
parseInt()會返回NaN。isNaN()卻又返回false。
自動類型轉換
- “+” 轉為字符串拼接
- “-”镣陕,“*”谴餐,“/”,"%" 轉為數值運算。調用Number()
- "+","-"做一元運算時呆抑,轉為數值
- 布爾運算符岂嗓,轉為布爾型
- == 和 != 運算,如果類型不同理肺,先進行類型轉換摄闸。
原則是:- 如果有一個操作數是布爾值,則在比較相等性之前先將其轉換為數值——false 轉換為 0妹萨,而true 轉換為 1;
- 如果一個操作數是字符串炫欺,另一個操作數是數值乎完,在比較相等性之前先將字符串轉換為數值;
- 如果一個操作數是對象品洛,另一個操作數不是树姨,則調用對象的 valueOf()方法,用得到的基本類型值按照前面的規(guī)則進行比較桥状;
- 這兩個操作符在進行比較時則要遵循下列規(guī)則帽揪。
null 和 undefined 是相等的。
要比較相等性之前辅斟,不會將 null 和 undefined 轉換成其他任何值转晰。
例如:
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"——如果這個值未定義;
(2) "boolean"——如果這個值是布爾值士飒;
(3) "string"——如果這個值是字符串查邢;
(4) "number"——如果這個值是數值;
(5) "object"——如果這個值是對象或 null酵幕;
(6) "function"——如果這個值是函數扰藕。
相等與嚴格相等
相等運算符(==)比較兩個“值”是否相等,嚴格相等運算符(===)比較它們是否為“同一個值”芳撒。兩者的一個重要區(qū)別是邓深,如果兩個值不是同一類型,嚴格相等運算符(===)直接返回false笔刹,而相等運算符(==)會將它們轉化成同一個類型芥备,再用嚴格相等運算符進行比較。
相等運算符隱藏的類型轉換徘熔,會帶來一些違反直覺的結果门躯。
建議不要使用相等運算符(==),最好只使用嚴格相等運算符(===)酷师。
void運算符
void運算符的作用是執(zhí)行一個表達式讶凉,然后返回undefined染乌。
void 0 // undefined
void (0) // undefined
上面是void運算符的兩種寫法,都正確懂讯。建議采用后一種形式荷憋,即總是使用括號。因為void運算符的優(yōu)先性很高褐望,如果不使用括號勒庄,容易造成錯誤的結果。比如瘫里,void 4+7
實際上等同于 (void 4) +7
实蔽。
下面是void運算符的一個例子。
var x = 3;
void (x = 5) //undefined
x // 5
這個運算符主要是用于書簽工具(bookmarklet)或者用于在超級鏈接中插入代碼谨读,目的是返回undefined可以防止網頁跳轉局装。
比如,下面是常用于網頁鏈接的觸發(fā)鼠標點擊事件的寫法劳殖。
<a href="#" onclick="f();">文字</a>
上面代碼有一個問題铐尚,函數f必須返回false,或者onclick事件必須返回false哆姻,否則會引起瀏覽器跳轉到另一個頁面宣增。
function f(){
// some code
return false;
}
void運算符可以取代上面兩種寫法。
<a href="javascript:void(0)" onclick="f();">文字</a>