JavaScript?中的引用類型Date?和RegExp的詳細(xì)介紹
引用類型 & 引用值的理解
引用值(或者對(duì)象)是某個(gè)特定引用類型的實(shí)例。 在ECMAScript中,引用類型是把數(shù)據(jù)和功能組織到一起的結(jié)構(gòu),經(jīng)常被人錯(cuò)誤的稱作“類”。雖然從技術(shù)上講JavaScript 是一門面向?qū)ο笳Z言,但ECMAScrtipt 缺少傳統(tǒng)的面相對(duì)象語言所具備的某些基本結(jié)構(gòu),包括類和接口。引用類型有時(shí)候也被稱為對(duì)象定義,因?yàn)樗鼈兠枋隽俗约旱膶?duì)象應(yīng)有的屬性和方法。
對(duì)象被認(rèn)為是某個(gè)特定引用類型的實(shí)例。新對(duì)象通過使用new 操作符后跟一個(gè)構(gòu)造函數(shù)來創(chuàng)建。構(gòu)造函數(shù)就是用來創(chuàng)建新對(duì)象的函數(shù)。
let now = new Date();
這行代碼代碼創(chuàng)建了引用對(duì)象Date 的一個(gè)新實(shí)例,并將它保存在變量now 中。Date()在這里就是構(gòu)造函數(shù),它負(fù)責(zé)創(chuàng)建一個(gè)只有默認(rèn)屬性和方法的簡(jiǎn)單對(duì)象。ECMAScript 提供了很多像Date這樣的原生引用類型,幫助開發(fā)者實(shí)現(xiàn)常見的任務(wù)。函數(shù)也是一種引用類型。
Date 引用類型
ECMAScript 的Date 類型參考了Java 早期版本中的java.until.Date.為此,Date類型將日期保存為自協(xié)調(diào)世界時(shí)(UTC)時(shí)間1970年1月1日午夜(零時(shí))至今所經(jīng)過的毫秒數(shù)。使用這種存儲(chǔ)方式,Date類型可以精確的標(biāo)識(shí)1970年1月1日之前及之后285616年的日期。
要?jiǎng)?chuàng)建日期對(duì)象,就是用new 操作符來調(diào)用Date構(gòu)造函數(shù):
let now = new Date(); console.log(now);// Mon Jul 18 2022 15:36:02 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)
在不給Date 構(gòu)造函數(shù)傳遞參數(shù)的情況下,創(chuàng)建的對(duì)象,保存的是當(dāng)前的日期和時(shí)間。要基于其他日期和時(shí)間創(chuàng)建日期對(duì)象,必須穿入其毫秒標(biāo)識(shí)。ECMAScript 為此提供了兩個(gè)輔助方法:Date.parse()和Date.UTC();
Date.parse()方法
Date.parse()方法接收一個(gè)表示日期和的字符串函數(shù),嘗試將這個(gè)字符串轉(zhuǎn)換為表示該日期的毫秒數(shù)。 ECMA-262 第5版 定義了Date.parse()應(yīng)該支持的日期格式。所有實(shí)現(xiàn)必須支持一下列日期格式:
- “月/日/年”,如“5/23/2022”
- “月名 日,年”,如“May 23,2022”;
- “周幾,月名 日 年 時(shí):分:秒”,如”Tue May 23 2019 00:00:00 GMT-0700“。
如果傳給Date.parse()的字符串并不表示日期,則該方法返回NaN。如果直接把表示日期的字符串傳給Date的構(gòu)造函數(shù),那么Date 會(huì)在后臺(tái)調(diào)用Date.parse()。換句話說,如下兩行代碼代表的意思一致。
let someDate = new Date(Date.parse("May 23,2022")); let someDateTwo = new Date("May 23,2022");
Date.UTC()方法
Date.UTC()方法也返回日期的毫秒標(biāo)識(shí),但使用的是跟Date.parse()不同的信息來生成這個(gè)值。傳給Date.UTC()的參數(shù)時(shí)年,零起點(diǎn)月數(shù)(1月是0,2月是1,依次類推),日(1-31),時(shí)(0-23),分,秒和毫秒。這些參數(shù)中,只有(年和月)是必須的。如果不提供日,那么默認(rèn)為1日。其他的默認(rèn)值都是0.
let y2k = new Date(Date.UTC(2000,0)); //GMT 時(shí)間2000年1月1日零點(diǎn)。 let allLives = new Date(Date.UTC(2005,3,5,17,55,55));// 2005年5月5日下午5點(diǎn)55分55秒
與Date.parse()一樣,Date.UTC也會(huì)被Date的構(gòu)造函數(shù)隱式調(diào)用,但有一個(gè)區(qū)別,這種情況下創(chuàng)建的時(shí)本地日期,不是GMT日期。 也就是說,隱式調(diào)用情況下下,我們傳遞給Date.UTC()方法的返回的毫秒數(shù)是本地時(shí)間距離1970年1月1日的毫秒數(shù),我們傳遞的這個(gè)日期,在JavaScript看來是UTC時(shí)間,它默認(rèn)已經(jīng)加上了時(shí)區(qū)插值的毫秒數(shù)。但是顯示的調(diào)用UTC()方法時(shí),傳遞的日期就是GMT時(shí)間。GMT 時(shí)間與UTC 時(shí)間的關(guān)系為:GMT = UTC + 0.
let utc = new Date(2022, 6, 18, 17, 15);// console.log(utc.toString());//Mon Jul 18 2022 17:15:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間) console.log(new Date(Date.UTC(2022, 6, 18, 17, 15)));//Tue Jul 19 2022 01:15:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)
Date.parse()方法 與Date.UTC()方法 的使用注意 首先parse方法和UTC 方法都可以隱式調(diào)用。所以我們可以這么理解,有兩種方式可以創(chuàng)建日期。給Date構(gòu)造函數(shù)傳入的是一個(gè)日期字符串時(shí),會(huì)默認(rèn)調(diào)用parse方法,傳入以整數(shù)的形式表示的日期會(huì)調(diào)用UTC方法。但是默認(rèn)情況下我們傳遞的日期是加上了時(shí)區(qū)的毫秒數(shù)的,這個(gè)一定要清楚。 如果要使用UTC方法的傳遞GMT時(shí)間,一定要顯示的調(diào)用UTC()方法。
當(dāng)要明確的求取某個(gè)時(shí)區(qū)的某個(gè)時(shí)間的毫秒時(shí),需要使用parse()方法。
繼承的方法
Date 繼承自O(shè)bject 方法,因此也會(huì)有toLocaleString,toString()和valueOf方法。
Date 類型重寫了這三個(gè)方法的實(shí)現(xiàn):
- Date類型的toLocaleString()方法返回與瀏覽器運(yùn)行的本地環(huán)境一致的時(shí)間和日期。這通常意味著格式中包含針對(duì)時(shí)間的AM(上午)或PM(下午),但不包含時(shí)區(qū)信息。
- toString()返回帶時(shí)區(qū)信息的日期和時(shí)間,時(shí)間也是以24小時(shí)制表示的。
- Date類型的valueOf方法根本就不返回字符串,這個(gè)方法被重寫后返回的是日期的毫秒表示。
下面是toLocaleString,toString()和valueOf的測(cè)試打印數(shù)據(jù),可供參考。
Date(2022, 6, 14, 10, 50)
toString: Thu Jul 14 2022 10:50:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)
toLocaleString: 2022/7/14 10:50:00
valueOf: 1657767000000****************************
Date.UTC(2022, 6, 14, 10, 50)
toString: Thu Jul 14 2022 18:50:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)
toLocaleString: 2022/7/14 18:50:00
valueOf: 1657795800000****************************
Date.parse("Thur 07 14 2022 10:50:00 GMT+0800")
toString: Thu Jul 14 2022 10:50:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)
toLocaleString: 2022/7/14 10:50:00
valueOf: 1657767000000
****************************
Date("Thur 07 14 2022 10:50:00 GMT+0800")
toString: Thu Jul 14 2022 10:50:00 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)
toLocaleString: 2022/7/14 10:50:00
valueOf: 1657767000000
****************************
Date.now()
toString: 1657767000086
toLocaleString: 1,657,767,000,086
valueOf: 1657767000086
RegExp
ECMAScript 通過RegExp 類型支持正則表達(dá)式。正則表達(dá)式使用類似Perl 的簡(jiǎn)介語法來創(chuàng)建。
let expersiion = /pattern/flags
這個(gè)正則表達(dá)式的pattern(模式)可以時(shí)任何簡(jiǎn)單或復(fù)雜的正則表達(dá)式,包括字符類,限定符,分組,向前查找和反向引用。每個(gè)正則表達(dá)式可以帶零個(gè)或多個(gè)flags(標(biāo)記),用于控制正則表達(dá)式的行為。
下面給出了匹配模式的標(biāo)記:
- g:全局模式,表示查找字符串的全部?jī)?nèi)容,而不是找到第一個(gè)匹配的內(nèi)容就結(jié)束。
- i:不區(qū)分大小寫,表示在查找匹配時(shí)忽略pattern和字符串的大小寫。
- m:多行模式,表示查找到一行末尾時(shí)會(huì)繼續(xù)查找
- y:粘貼模式,表示只查找從lastIndex開始及之后的字符串。
- u:Unicode模式,啟用Unicode匹配。
- s:doAll模式,表示元字符,匹配任何字符(包括\n或\r).
使用不同模式和標(biāo)記可以創(chuàng)建出各種正則表達(dá)式,比如:
//匹配字符串中的所有“at” let pattern = /at/g; //匹配第一個(gè)“bat”或“cat”,忽略大小寫 let pattern2 = /[bc]at/i; //匹配所有以“at”結(jié)尾的三字符組合,忽略大小寫。 let pattern3 = /.at/gi
與其他語言的正則表達(dá)式類似,所有元字符在模式中也必須轉(zhuǎn)義,包括: ( [ \ ^ $ |)] ? * + .
元字符在正則表達(dá)式中都有一種或多種特殊功能,所有要匹配上面這些字符本身,就必須使用反斜杠來轉(zhuǎn)義。
//匹配第一個(gè)“bat”或“cat”,忽略大小寫 let pattern2 = /[bc]at/i; //匹配第一個(gè)“[bc]at”,忽略大小寫 let pattern2 = /\[bc\]at/i; //匹配所有以“at”結(jié)尾的三字符組合,忽略大小寫。 let pattern3 = /.at/gi //匹配所有".at",忽略大小寫。 let pattern3 = /\.at/gi
前面例子中的正則表達(dá)式都是使用字面量形式定義的。正則表達(dá)式也可以使用RegExp 構(gòu)造函數(shù)來創(chuàng)建,它接收兩個(gè)參數(shù):模式字符串和(可選的)標(biāo)記字符串。任何使用字面量定義的正則表達(dá)式也可以通過構(gòu)造函數(shù)來創(chuàng)建:
//匹配第一個(gè)“bat”或“cat”,忽略大小寫 let pattern1 = /[bc]at/i; //跟pattern1一樣,只不過是用構(gòu)造函數(shù)創(chuàng)建的。 let pattern2 = new RegExp("[bc]at","i");
這里的pattern1 和pattern2 是等效的正則表達(dá)式。注意,RegExp構(gòu)造函數(shù)的兩個(gè)參數(shù)都是好字符串。因?yàn)镽egExp的模式參數(shù)是字符串,所以某些情況下需要二次轉(zhuǎn)義。所有元字符都必須二次轉(zhuǎn)義,包括轉(zhuǎn)義字符,如\n(\轉(zhuǎn)義后的字符串是\,在正則表達(dá)式中則要寫成\\).
字面量模式 | 對(duì)應(yīng)的字符串 |
---|---|
/[bc]at/ | "\[bc]\]at" |
/.at/ | "\at." |
/name/age/ | "name\/age" |
/\d/\d{1,2} | "\d.\d{1,2}" |
/\w\hello\123 | "\w\\hello\\123" |
RegExp 實(shí)例方法
exec()
RegExp的主要方法是exec(),主要用于配合捕獲組使用。這個(gè)方法只接受一個(gè)參數(shù),即要應(yīng)用模式的字符串。如果找到了匹配項(xiàng),則返回包含第一個(gè)匹配信息的數(shù)組;如果沒有找到匹配項(xiàng),則返回null。返回的數(shù)組雖然是Array的實(shí)例,。但包含兩個(gè)額外的屬性:index和input。index是字符串中匹配模式的起始位置,input 是要查找的字符串。這個(gè)數(shù)據(jù)的第一個(gè)元素是匹配整個(gè)模式的字符串,其他元素食欲表達(dá)式中的捕獲組匹配的字符串。如果模式中沒有捕獲組,則數(shù)組只包含一個(gè)元素。
let text = "mom and dad and baby"; let pattern = /mom( and dad( and baby)?)?/gi let matches = pattern.exec(text); console.log(matches.index); //0 console.log(matches.input); //"mom and dad and baby" console.log(matches[0]);// "mom and dad and baby" console.log(matches[1]);// " and dad and baby" console.log(matches[2]);// " and baby"
在這個(gè)例子中,模式包含兩個(gè)捕獲組:最內(nèi)部的匹配項(xiàng)“ and baby”,以及外部的匹配項(xiàng)“ and dad” 或“ and dad and baby”。調(diào)用exec()后找到了一個(gè)匹配項(xiàng)。因?yàn)檎麄€(gè)字符串匹配模式,所以matches數(shù)組的index 屬性就是0。數(shù)組的第一個(gè)元素是匹配的整個(gè)字符串,第二個(gè)元素是匹配第一個(gè)捕獲組的字符串,第三個(gè)元素是匹配第二個(gè)捕獲組的字符串。 如果模式設(shè)置了全局標(biāo)記,則每次調(diào)用exec()方法會(huì)返回一個(gè)匹配的信息。如果沒有設(shè)置全局標(biāo)記,則無論對(duì)同一個(gè)字符串調(diào)用多少次exec(),也只會(huì)返回第一個(gè)匹配的信息。
let text = "cat, bat, sat, fat"; let pattern = /.at/; let matches = pattern.exec(text); console.log(matches.index);//0 console.log(matches[0]);//cat console.log(pattern.lastIndex);//0 matches = pattern.exec(text); console.log(matches.index);//0 console.log(matches[0]);//cat console.log(pattern.lastIndex);//0
上面的例子沒有設(shè)置全局標(biāo)記,因此調(diào)用exec()只返回第一個(gè)匹配項(xiàng)("cat").lastIndex 在非全局模式下始終不變。
如果在這個(gè)模式上設(shè)置了g標(biāo)記,則每次調(diào)用exec()都會(huì)在字符串向前搜索下一個(gè)匹配項(xiàng)。
let text = "cat, bat, sat, fat"; let pattern = /.at/g; let matches = pattern.exec(text); console.log(matches.index);//0 console.log(matches[0]);//cat console.log(pattern.lastIndex);//3 matches = pattern.exec(text); console.log(matches.index);//5 console.log(matches[0]);//bat console.log(pattern.lastIndex);//8 matches = pattern.exec(text); console.log(matches.index);//10 console.log(matches[0]);//sat console.log(pattern.lastIndex);//13
如果設(shè)置了粘附標(biāo)記y,則每次調(diào)用exec()就只會(huì)在lastIndex的位置上尋找匹配項(xiàng)。
粘附標(biāo)記會(huì)覆蓋全局標(biāo)記:
let text = "cat, bat, sat, fat"; let pattern = /.at/y; let matches = pattern.exec(text); console.log(matches.index);//0 console.log(matches[0]);//cat console.log(pattern.lastIndex);//3 //以索引3對(duì)應(yīng)的字符開頭找不到匹配項(xiàng),因此exec() 返回null // matches = pattern.exec(text); console.log(matches);//null console.log(pattern.lastIndex);//0 //向前設(shè)置lastIndex 可以讓粘附的模式通過exec()找到下一個(gè)匹配項(xiàng)。 pattern.lastIndex = 5; matches = pattern.exec(text); console.log(matches.index);//5 console.log(matches[0]);//bat console.log(pattern.lastIndex);//8
test()
正則表達(dá)式的另一個(gè)方法是test(),接收一個(gè)字符串參數(shù)。如果輸入的文本與模式匹配,則參數(shù)返回true,否則返回false。這個(gè)方法適用于只想測(cè)試模式是否匹配,而不需要世界匹配內(nèi)容的情況。
let text = "000-00-0000"; let pattern = /\d{3}-\d{2}-\d{4}/; if(pattern.test(test)){ console.log("The pattern was matched."); }
繼承的方法
無論正則表達(dá)式怎么創(chuàng)建的,繼承的方法toLocalString()toString()都返回正則表達(dá)式的字面量表示。
let pattern = new RegExp("\\[bc]\\at]at","gi"); console.log(pattern.toString()); ///\[bc\]at/gi console.log(pattern.toLocaleString()); // /\[bc\]at/gi console.log(pattern.valueOf());///\[bc]\at]at/gi
到此這篇關(guān)于JavaScript 中的引用類型Date 和RegExp的詳細(xì)介紹的文章就介紹到這了,更多相關(guān)JS引用類型Date和 RegExp內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS在TextArea光標(biāo)位置插入文字并實(shí)現(xiàn)移動(dòng)光標(biāo)到文字末尾
JS在TextArea光標(biāo)位置插入文字+移動(dòng)光標(biāo)到文字末尾,F(xiàn)irefox,Chrome,Safari以及Opera都有selectionStart和selectionEnd屬性,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈2013-06-06JS使用jsBarcode生成條形碼(一維碼)簡(jiǎn)單實(shí)例
JsBarcode是一個(gè)用JavaScript編寫的條形碼生成器,它支持多種條形碼格式,可在瀏覽器和Node.js中使用,下面這篇文章主要給大家介紹了關(guān)于JS使用jsBarcode生成條形碼(一維碼)的相關(guān)資料,需要的朋友可以參考下2023-03-033分鐘教你用JavaScript實(shí)現(xiàn)電子簽名效果
電子簽名已經(jīng)成為現(xiàn)代商業(yè)中不可或缺的一部分,它可以提高業(yè)務(wù)流程的效率和安全性。本文將介紹如何使用HTML5的canvas元素和JavaScript在前端實(shí)現(xiàn)電子簽名,需要的可以參考一下2023-04-04javascript使用canvas實(shí)現(xiàn)餅狀圖效果
這篇文章主要為大家詳細(xì)介紹了javascript使用canvas實(shí)現(xiàn)餅狀圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09微信小程序支付功能 php后臺(tái)對(duì)接完整代碼分享
這篇文章主要為大家詳細(xì)介紹了微信小程序支付功能,分享了php后臺(tái)對(duì)接完整代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06js實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出為EXCEL(支持大量數(shù)據(jù)導(dǎo)出)
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出為EXCEL,支持大量數(shù)據(jù)導(dǎo)出,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03PHP實(shí)現(xiàn)基于Redis的MessageQueue隊(duì)列封裝操作示例
這篇文章主要介紹了PHP實(shí)現(xiàn)基于Redis的MessageQueue隊(duì)列封裝操作,結(jié)合實(shí)例形式分析了Redis的PHP消息隊(duì)列封裝與使用相關(guān)操作技巧,需要的朋友可以參考下2019-02-02動(dòng)態(tài)統(tǒng)計(jì)當(dāng)前輸入內(nèi)容的字節(jié)、字符數(shù)的實(shí)例詳解
這篇文章主要介紹了動(dòng)態(tài)統(tǒng)計(jì)當(dāng)前輸入內(nèi)容的字節(jié)、字符數(shù)的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10