javascript
JavaScript 笔记(2) -- 类型转换 正则表达 变量提升 表单验证
目錄:
?typeof,?null, undefined, valueOf()
類型轉(zhuǎn)換
正則表達(dá)式
錯誤: try, catch, throw
調(diào)試工具
變量提升
strict 嚴(yán)格模式
使用誤區(qū)
表單 & 表單驗證
JavaScript void
?
?typeof,?null, undefined, valueOf()
- typeof:用于檢測變量的數(shù)據(jù)類型,eg: typeof "John"; // 返回 string
在 JavaScript 中有 5 種不同的數(shù)據(jù)類型:string, number, boolean, object, function
3 種對象類型: Object, Date, Array
2 個不包含任何值的數(shù)據(jù)類型:null, undefined
強(qiáng)調(diào):- NaN 的數(shù)據(jù)類型是 number
- 數(shù)組(Array)的數(shù)據(jù)類型是 object,?在JavaScript中,數(shù)組是一種特殊的對象類型。因此 typeof [1,2,3,4] 返回 object。
- 日期(Date)的數(shù)據(jù)類型為 object
- null 的數(shù)據(jù)類型是 object
- 未定義變量的數(shù)據(jù)類型為 undefined
- 如果對象是 JavaScript Array 或 JavaScript Date ,我們就無法通過?typeof?來判斷他們的類型,因為都是 返回 Object。此時需用使用 constructor ?屬性
constructor 屬性:返回所有 JavaScript 變量的構(gòu)造函數(shù)。實例:
"John".constructor // 返回函數(shù) String() { [native code] }(3.14).constructor // 返回函數(shù) Number() { [native code] }
false.constructor // 返回函數(shù) Boolean() { [native code] }
[1,2,3,4].constructor // 返回函數(shù) Array() { [native code] }
{name:'John', age:34}.constructor // 返回函數(shù) Object() { [native code] }
new Date().constructor // 返回函數(shù) Date() { [native code] }
function () {}.constructor // 返回函數(shù) Function(){ [native code] }
可以使用 constructor 屬性來查看是對象是否為數(shù)組 (包含字符串 "Array") ,日期 (包含字符串 "Date"):
function isArray(myArray) { # 是否為數(shù)組 (包含字符串 "Array")return myArray.constructor.toString().indexOf("Array") > -1; }var fruits = ["Banana", "Orange", "Apple", "Mango"];
console.log(isArray(fruits)); # true
function isDate(myDate) { # 是否為日期 (包含字符串 "Date")return myDate.constructor.toString().indexOf("Date") > -1; }
isDate(new Date()); # true
?
- null:在 JavaScript 中表示 "什么都沒有"。null 是一個只有一個值的特殊類型,表示一個空對象(Object)引用。eg: var person; // 值為 null(空), 但仍然是一個對象。 用 typeof 檢測 null 返回是object。
可用于清空對象,eg:
var person = null; // 值為 null(空), 但類型為對象 # 對比 使用 undefined 來清空對象: var person = undefined; // 值為 undefined, 類型為 undefined- undefined:在 JavaScript 中,?undefined?是一個沒有設(shè)置值的變量。?一個沒有值的變量會返回?undefined。任何變量都可以通過設(shè)置值為?undefined?來清空。 類型為?undefined.
- Undefined 和 Null 的區(qū)別 typeof undefined // undefined typeof null // object null === undefined // false null == undefined // true
- valueOf():是數(shù)組對象的默認(rèn)方法,返回 Array 對象的原始值,該原始值由 Array 對象派生的所有對象繼承。eg: var fruits = ["Banana", "Orange", "Apple", "Mango"];
var v=fruits.valueOf();# fruits.valueOf() 與 fruits 返回值一樣。
# 輸出結(jié)果為:
Banana,Orange,Apple,Mango
valueOf() 方法通常由 JavaScript 在后臺自動調(diào)用,并不顯式地出現(xiàn)在代碼中。?
?注意:valueOf() 方法不會改變原數(shù)組。
類型轉(zhuǎn)換:
- 通過使用 JavaScript 函數(shù) 5 + null // 返回 5 null 轉(zhuǎn)換為 0
"5" + null // 返回"5null" null 轉(zhuǎn)換為 "null"
"5" + 1 // 返回 "51" 1 轉(zhuǎn)換為 "1"
"5" - 1 // 返回 4 "5" 轉(zhuǎn)換為 5
......... - 通過 JavaScript 自身自動轉(zhuǎn)換 String(): 可將 數(shù)字/布爾值/時間... 轉(zhuǎn)換為字符串,eg:String(123); String(false); //返回 "false"
toString(): Number/Boolean/Date() 方法 toString() 也是有同樣的效果。eg: (123).toString; false.toString(); ? ? Number 方法中,其他可將數(shù)字轉(zhuǎn)換為字符串的方法:
toExponential() 把對象的值轉(zhuǎn)換為指數(shù)計數(shù)法。 toFixed() 把數(shù)字轉(zhuǎn)換為字符串,結(jié)果的小數(shù)點后有指定位數(shù)的數(shù)字。 toPrecision() 把數(shù)字格式化為指定的長度。 Date 方法中,其他可將日期轉(zhuǎn)換為字符串的函數(shù):
getDate() 從 Date 對象返回一個月中的某一天 (1 ~ 31)。 getDay() 從 Date 對象返回一周中的某一天 (0 ~ 6)。 getFullYear() 從 Date 對象以四位數(shù)字返回年份。 getHours() 返回 Date 對象的小時 (0 ~ 23)。 getMilliseconds() 返回 Date 對象的毫秒(0 ~ 999)。 getMinutes() 返回 Date 對象的分鐘 (0 ~ 59)。 getMonth() 從 Date 對象返回月份 (0 ~ 11)。 getSeconds() 返回 Date 對象的秒數(shù) (0 ~ 59)。 getTime() 返回 1970 年 1 月 1 日至今的毫秒數(shù)。 Number(): 可將字符串/布爾值/日期/...轉(zhuǎn)換為數(shù)字,eg:Number(false); //返回0 ?
? ? eg2: Number(new Date()); //返回 Unix 時間戳,?日期方法?getTime()?也有相同的效果,使用 (new Date()).getTime();
? ? ?Number 方法中,其他字符串轉(zhuǎn)換為數(shù)字的方法:
parseFloat() 解析一個字符串,并返回一個浮點數(shù)。 parseInt() 解析一個字符串,并返回一個整數(shù)。 Operator +:?可用于將變量轉(zhuǎn)換為數(shù)字, eg:var?x = +"5";??????// x 是一個數(shù)字
正則表達(dá)式:使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串搜索模式,用于文本搜索search()和文本替換replace()。
-
search() 方法:用于檢索字符串中指定的子字符串,或檢索與正則表達(dá)式相匹配的子字符串,并返回子串的起始位置。
-
replace() 方法:用于在字符串中用一些字符替換另一些字符,或替換一個與正則表達(dá)式匹配的子串。
正則表達(dá)式表單驗證實例:
/*是否帶有小數(shù)*/function isDecimal(strValue ) {
var objRegExp= /^\d+\.\d+$/;
return objRegExp.test(strValue);
}
/*校驗是否中文名稱組成 */
function ischina(str) {
var reg=/^[\u4E00-\u9FA5]{2,4}$/; /*定義驗證表達(dá)式*/
return reg.test(str); /*進(jìn)行驗證*/
} /*校驗是否全由8位數(shù)字組成 */ function isStudentNo(str) {var reg=/^[0-9]{8}$/; /*定義驗證表達(dá)式*/return reg.test(str); /*進(jìn)行驗證*/ }/*校驗電話碼格式 */ function isTelCode(str) {var reg= /^((0\d{2,3}-\d{7,8})|(1[3584]\d{9}))$/;return reg.test(str); }/*校驗郵件地址是否合法 */ function IsEmail(str) {var reg=/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;return reg.test(str); }
?
錯誤:throw, try, catch
-
try?語句測試代碼塊的錯誤。
-
catch?語句處理錯誤。?JavaScript 語句?try?和?catch?是成對出現(xiàn)的,catch 塊會捕捉到 try 塊中的錯誤,并執(zhí)行代碼來處理它。
var txt=""; function message() { try { adddlert("Welcome guest!"); } catch(err) { txt="本頁有一個錯誤。\n\n"; txt+="錯誤描述:" + err.message + "\n\n"; txt+="點擊確定繼續(xù)。\n\n"; alert(txt); } } message(); -
throw?語句創(chuàng)建或拋出異常(exception)。
?
?調(diào)試工具:
- 瀏覽器啟用調(diào)試工具一般是按下 F12 鍵,并在調(diào)試菜單中選擇 "Console" 。
- console.log();
- IDE 設(shè)置斷點 或者 代碼設(shè)置(使用 Debugger 關(guān)鍵字,用于停止執(zhí)行 JavaScript,并調(diào)用調(diào)試函數(shù)),eg: var x = 15 * 5;
debugger;
document.getElementbyId("demo").innerHTML = x; # 代碼在該行前停止執(zhí)行
?
變量提升:函數(shù)聲明和變量聲明總是會被解釋器悄悄地被"提升"到方法體的最頂部。
-
JavaScript 中,函數(shù)及變量的聲明都將被提升到函數(shù)的最頂部。
- JavaScript 中,變量可以在使用后聲明,也就是變量可以先使用再聲明。
- JavaScript 只有聲明的變量會提升,初始化的不會。eg: var x = 5; // 初始化 xelem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y; // 顯示 x 和 y, 結(jié)果為: 5 undefined; y 輸出了 undefined
var y = 7; // 初始化 y
實例結(jié)果:y 輸出了?undefined,這是因為變量聲明 (var y) 提升了,但是初始化(y = 7) 并不會提升,所以 y 變量是一個未定義的變量。其類似以下代碼:
var x = 5; // 聲明 并 初始化 x var y; // 聲明 yelem = document.getElementById("demo"); // 查找元素 elem.innerHTML = x + " " + y; // 顯示 x 和 yy = 7; // 設(shè)置 y 為 7 - 為了避免這些問題,通常我們在每個作用域開始前聲明這些變量,這也是正常的 JavaScript 解析步驟,易于我們理解。JavaScript 嚴(yán)格模式(strict mode)不允許使用未聲明的變量。
?
JavaScript 嚴(yán)格模式(use strict):
- 嚴(yán)格模式通過在腳本 或 函數(shù)的頭部添加?"use strict";?表達(dá)式來聲明。eg: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body><h1>使用 "use strict":</h1> <h3>不允許使用未定義的變量。</h3> <p>瀏覽器按下 F12 開啟調(diào)試模式,查看報錯信息。</p> <script>"use strict";x = 3.14; // 報錯 (x 未定義) </script></body> </html> use strict
- 在函數(shù)內(nèi)部聲明是局部作用域 (只在函數(shù)內(nèi)使用嚴(yán)格模式),eg: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body><p>在函數(shù)內(nèi)使用 "use strict" 只在函數(shù)內(nèi)報錯。 </p> <p>瀏覽器按下 F12 開啟調(diào)試模式,查看報錯信息。</p> <script>x = 3.14; // 不報錯 myFunction();function myFunction() {"use strict";y = 3.14; // 報錯 (y 未定義) } </script></body> </html> 局部 use strict
- 嚴(yán)格模式的限制
- 不允許使用未聲明的變量(對象也是一個變量);
- 不允許刪除變量或?qū)ο?#xff1b;
- 不允許刪除函數(shù);
- 不允許變量重名;
- 不允許使用八進(jìn)制;
- 不允許使用轉(zhuǎn)義字符;
- 不允許對只讀屬性賦值,eg: "use strict"; var obj = {}; Object.defineProperty(obj, "x", {value:0, writable:false});obj.x = 3.14; // 報錯
- 不允許對一個使用 getter方法 讀取的屬性進(jìn)行賦值,eg: "use strict"; var obj = {get x() {return 0} };obj.x = 3.14; // 報錯
- 不允許刪除一個不允許刪除的屬性;
- 變量名不能使用 "eval" 字符串;
- 變量名不能使用 "arguments" 字符串;
- 不允許使用以下這種語句,eg: "use strict"; with (Math){x = cos(2)}; // 報錯
- 由于一些安全原因,在作用域 eval() 創(chuàng)建的變量不能被調(diào)用,eg: "use strict"; eval ("var x = 2"); alert (x); // 報錯
- 禁止this關(guān)鍵字指向全局對象,eg: function f(){return !this;
}
// 返回false,因為"this"指向全局對象,"!this"就是falsefunction f(){ "use strict";return !this;
}
// 返回true,因為嚴(yán)格模式下,this的值為undefined,所以"!this"為true。
因此,使用構(gòu)造函數(shù)時,如果忘了加new,this不再指向全局對象,而是報錯。
function f(){"use strict";this.a = 1; }; f(); // 報錯,this未定義 - 為了向?qū)鞪avascript的新版本過渡,嚴(yán)格模式新增了一些保留關(guān)鍵字: implements,interface,let,package,private,protected,public,static,yield
提醒:"use strict" 指令只運(yùn)行出現(xiàn)在腳本或函數(shù)的開頭。
?
?JavaScript 的使用誤區(qū):
- 賦值運(yùn)算符應(yīng)用錯誤:?if 條件語句中使用賦值運(yùn)算符的等號 (=) 將會產(chǎn)生一個錯誤結(jié)果, 正確的方法是使用比較運(yùn)算符的兩個等號 (==)。
- 比較運(yùn)算符常見錯誤:在常規(guī)的比較中,數(shù)據(jù)類型是被忽略的,以下 if 條件語句返回 true: var x = 10;
var y = "10";
if (x == y) # 返回 true
在嚴(yán)格的比較運(yùn)算中,=== 為恒等計算符,同時檢查表達(dá)式的值與類型。這種錯誤經(jīng)常會在 switch 語句中出現(xiàn),switch 語句會使用恒等計算符(===)進(jìn)行比較,如下,由于類型不一致不會執(zhí)行 alert 彈窗:
var x = 10; switch(x) {case "10": alert("Hello"); # 不會執(zhí)行該彈窗 } - 加法連接注意事項:JavaScript 的加法和連接都使用 + 運(yùn)算符。如下,查看兩個數(shù)字相加及數(shù)字與字符串連接的區(qū)別: var x = 10 + 5; // x 的結(jié)果為 15 var x = 10 + "5"; // x 的結(jié)果為 "105"
- 浮點型數(shù)據(jù)使用注意事項:JavaScript 中的所有數(shù)據(jù)都是以 64 位浮點型數(shù)據(jù)(float)?來存儲。所有的編程語言,包括 JavaScript,對浮點型數(shù)據(jù)的精確度都很難確定,如下: var x = 0.1;
var y = 0.2;
var z = x + y // z 的結(jié)果為 0.3
if (z == 0.3) // 返回 false
解決以上問題,可以用整數(shù)的乘除法來解決:
var x = 0.1; var y = 0.2; var z = (x * 10 + y *10) / 10; document.getElementById("demo").innerHTML = z; - 字符串分行:在字符串中直接使用回車換行是會報錯的,字符串?dāng)嘈行枰褂梅葱备?\),如下所示: var x = "Hello \ World!";
- 錯誤的使用分號
- return 語句使用注意事項:JavaScript 默認(rèn)是在代碼的最后一行自動結(jié)束。但,以下實例結(jié)果會返回 undefined: function myFunction(a) { varpower = 10; returna * power;
}
其等價于:
function myFunction(a) {varpower = 10; return; // 分號結(jié)束,返回 undefineda * power; }
原因:如果是一個不完整的語句,如下所示:
varJavaScript 將嘗試讀取第二行的語句:
power = 10;但是由于這樣的語句是完整的:
returnJavaScript 將自動關(guān)閉語句:
return;在 JavaScript 中,分號是可選的 。由于 return 是一個完整的語句,所以 JavaScript 將關(guān)閉 return 語句。
注意:不用對 return 語句進(jìn)行斷行。
- 數(shù)組中使用名字來索引:許多程序語言都允許使用名字來作為數(shù)組的索引,使用名字來作為索引的數(shù)組稱為關(guān)聯(lián)數(shù)組(或哈希)。
- JavaScript 不支持使用名字來索引數(shù)組,只允許使用數(shù)字索引。正確使用,如下: var person = []; person[0] = "John"; person[1] = "Doe"; person[2] = 46; var x = person.length; // person.length 返回 3 var y = person[0]; // person[0] 返回 "John"
- 在 JavaScript 中,?對象?使用?名字作為索引。如果你使用名字作為索引,當(dāng)訪問數(shù)組時,JavaScript 會把數(shù)組重新定義為標(biāo)準(zhǔn)對象。執(zhí)行這樣操作后,數(shù)組的方法及屬性將不能再使用,否則會產(chǎn)生錯誤: var person = []; person["firstName"] = "John"; person["lastName"] = "Doe"; person["age"] = 46; var x = person.length; // person.length 返回 0 var y = person[0]; // person[0] 返回 undefined
-
定義數(shù)組元素/對象,最后不能添加逗號
-
Undefined 不是 Null
- null?用于對象,?undefined?用于變量,屬性和方法。
- 對象只有被定義才有可能為 null,否則為 undefined。
- 如果我們想測試對象是否存在,在對象還沒定義時將會拋出一個錯誤。錯誤使用: if (myObj !== null && typeof myObj !== "undefined")
正確的方式:是我們需要先使用 typeof 來檢測對象是否已定義:
if (typeof myObj !== "undefined" && myObj !== null)
- 程序塊作用域:在每個代碼塊中 JavaScript 不會創(chuàng)建一個新的作用域,一般各個代碼塊的作用域都是全局的。如下,以下代碼的的變量 i 返回 10,而不是 undefined: for (var i = 0; i < 10; i++) { // some code
}
return i; # 返回 i 為 10,而不是 undefined
?
JavaScript 表單驗證:HTML 表單驗證可以通過 JavaScript 來完成。
- 數(shù)據(jù)驗證用于確保用戶輸入的數(shù)據(jù)是有效的。典型的數(shù)據(jù)驗證有:
- 必需字段是否有輸入?
- 用戶是否輸入了合法的數(shù)據(jù)?
- 在數(shù)字字段是否輸入了文本?
數(shù)據(jù)驗證可以使用不同方法來定義,并通過多種方式來調(diào)用:
-
- 服務(wù)端數(shù)據(jù)驗證是在數(shù)據(jù)提交到服務(wù)器上后再驗證
- 客戶端數(shù)據(jù)驗證 side validation是在數(shù)據(jù)發(fā)送到服務(wù)器前,在瀏覽器上完成驗證
- HTML 約束驗證:HTML5 新增了 HTML 表單的驗證方式:約束驗證(constraint validation)。約束驗證是表單被提交時瀏覽器用來實現(xiàn)驗證的一種算法。HTML 約束驗證基于:
- HTML 輸入屬性
- CSS 偽類選擇器
- DOM 屬性和方法 屬性 描述
disabled 規(guī)定輸入的元素不可用
max 規(guī)定輸入元素的最大值
min 規(guī)定輸入元素的最小值
pattern 規(guī)定輸入元素值的模式
required 規(guī)定輸入元素字段是必需的
type 規(guī)則輸入元素的類型
完成列表,請查看 HTML 輸入屬性
約束驗證 CSS 偽類選擇器 選擇器 描述 :disabled 選取屬性為 "disabled" 屬性的 input 元素 :invalid 選取無效的 input 元素 :optional 選擇沒有"required"屬性的 input 元素 :required 選擇有"required"屬性的 input 元素 :valid 選取有效值的 input 元素
完整列表,請查看?CSS 偽類
- JavaScript 表單驗證:JavaScript 可用來在數(shù)據(jù)被送往服務(wù)器前對 HTML 表單中的這些輸入數(shù)據(jù)進(jìn)行驗證。
表單數(shù)據(jù)經(jīng)常需要使用 JavaScript 來驗證其正確性:
- 驗證表單數(shù)據(jù)是否為空?
- 驗證輸入是否是一個正確的email地址?
- 驗證日期是否輸入正確?
- 驗證表單輸入內(nèi)容是否為數(shù)字型? # 下面的函數(shù)用來檢查用戶是否已填寫表單中的必填(或必選)項目。假如必填或必選項為空,那么警告框會彈出,并且函數(shù)的返回值為 false,否則函數(shù)的返回值則為 true(意味著數(shù)據(jù)沒有問題):
function validateForm(){var x=document.forms["myForm"]["fname"].value;if (x==null || x==""){alert("姓必須填寫"); return false;}
} # 下面的函數(shù)檢查輸入的數(shù)據(jù)是否符合電子郵件地址的基本語法。意思就是說,輸入的數(shù)據(jù)必須包含 @ 符號和點號(.)。同時,@ 不可以是郵件地址的首字符,并且 @ 之后需有至少一個點號:
function validateForm(){var x=document.forms["myForm"]["email"].value;var atpos=x.indexOf("@");var dotpos=x.lastIndexOf(".");if (atpos<1 || dotpos<atpos+2 || dotpos+2>=x.length){alert("不是一個有效的 e-mail 地址"); return false; } }
.........
?javaScript void:
javascript:void(0)?含義:?void 是 JavaScript 中非常重要的關(guān)鍵字,該操作符指定要計算一個表達(dá)式但是不返回值。語法格式:
<head> <script type="text/javascript"> <!-- void func() javascript:void func()//或者void(func()) javascript:void(func()) //--> </script> </head>實例1:下面的代碼創(chuàng)建了一個超級鏈接,當(dāng)用戶點擊以后不會發(fā)生任何事。
<a href="javascript:void(0)">單擊此處什么也不會發(fā)生</a> // 當(dāng)用戶鏈接時,void(0) 計算為 0,但 Javascript 上沒有任何效果。?實例2:以下實例中,在用戶點擊鏈接后顯示警告信息:
<a href="javascript:void(alert('Warning!!!'))">點我!</a> // 在用戶點擊鏈接后顯示警告信息實例3:以下實例中參數(shù) a 將返回 undefined :
<script type="text/javascript"> function getValue(){var a,b,c;a = void ( b = 5, c = 7 );document.write('a = ' + a + ' b = ' + b +' c = ' + c ); } // </script> </head> <body><p>點擊以下按鈕查看結(jié)果:</p> <form><input type="button" value="點我" οnclick="getValue();" /> // 運(yùn)行結(jié)果:a = undefined b = 5 c = 7 </form></body>- ?href="#"與href="javascript:void(0)"的區(qū)別: (1)# 包含了一個位置信息,默認(rèn)的錨是#top 也就是網(wǎng)頁的上端;而javascript:void(0), 僅僅表示一個死鏈接;
(2)在頁面很長的時候會使用?#?來定位頁面的具體位置,格式為:# + id;
(3)如果你要定義一個死鏈接請使用 javascript:void(0)?;實例:
<a href="javascript:void(0);">點我沒有反應(yīng)的!</a> <a href="#pos">點我定位到指定位置!</a> <br> ... <br> <p id="pos">尾部定位點</p>?
在以下兩條語句執(zhí)行后,變量 carname 的值依然是 "Volvo":
轉(zhuǎn)載于:https://www.cnblogs.com/ostrich-sunshine/p/6782997.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的JavaScript 笔记(2) -- 类型转换 正则表达 变量提升 表单验证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 17.4.28 清北第一天水题
- 下一篇: Isomorphic Strings