摘要:創(chuàng)建一個(gè)日期對象中國標(biāo)準(zhǔn)時(shí)間在調(diào)用構(gòu)造函數(shù)而不傳參數(shù)的情況下,新創(chuàng)建的對象自動獲得當(dāng)前日期和時(shí)間。日期格式化方法類型還有一些專門用于將日期格式化為字符串的方法中國標(biāo)準(zhǔn)時(shí)間下午以上的這些方法都會根據(jù)系統(tǒng)環(huán)境而異。
咱們接著上面一篇繼續(xù)~
1. Date類型JavaScript中的Date類型使用自UTC時(shí)間,1970年1月1日零時(shí)開始的毫秒數(shù)來保存日期。
創(chuàng)建一個(gè)日期對象:
var now = new Date() console.log(now) //Fri Sep 22 2017 15:42:29 GMT+0800 (中國標(biāo)準(zhǔn)時(shí)間)
在調(diào)用Date構(gòu)造函數(shù)而不傳參數(shù)的情況下,新創(chuàng)建的對象自動獲得當(dāng)前日期和時(shí)間。
如果想根據(jù)特定的日期和時(shí)間創(chuàng)建日期對象,必須傳入表示日期的毫秒數(shù)(即從UTC時(shí)間開始截止到當(dāng)前的毫秒數(shù))。
var d = new Date(2165461213546) console.log(d) //Sun Aug 15 2038 13:00:13 GMT+0800 (中國標(biāo)準(zhǔn)時(shí)間)
Date.parse() 、 Date.UTC()
還有一些簡化的方法:Date.parse() 和 Date.UTC()。其中Date.parse()方法接受一個(gè)表示日期的字符串參數(shù),然后嘗試根據(jù)這個(gè)字符串返回相應(yīng)日期的毫秒數(shù)。(但是在JavaScript中并沒有規(guī)定傳入改方法的參數(shù)的格式):
Date.parse()通常有以下幾種格式的參數(shù): 1."月/年/日", 如:6/12/2017 2."英文月名 日,年",如:January 12,2004 3."英文星期幾 英文月名 日 年 時(shí):分:秒 時(shí)區(qū)",如Tue May 25 2004 00:00:00 GMT-0700 var some = new Date(Date.parse("May 25, 2004")) console.log(some) //Tue May 25 2004 00:00:00 GMT+0800 (中國標(biāo)準(zhǔn)時(shí)間) //其實(shí)這樣寫也是可以的,它在內(nèi)部會先調(diào)用Date.parse()方法 var someDate = new Date("May 25, 2004");
Date.UTC()方法同樣也是返回表示日期的毫秒數(shù),它和Date.parse()在構(gòu)建值時(shí)使用不同的信息。Date.UTC()接受的參數(shù)分別是年份,基于0的月份,月中的哪一天,小時(shí)數(shù),分鐘,秒,毫秒。在這些參數(shù)中,前兩個(gè)參數(shù)是必填的。如果沒有提供月中的日期數(shù),則會默認(rèn)為1,如果省略其他數(shù),則都假設(shè)為0.
var y2k = new Date(Date.UTC(2000, 0)) console.log(y2k) //Sat Jan 01 2000 08:00:00 GMT+0800 (中國標(biāo)準(zhǔn)時(shí)間) //其實(shí)這樣寫也是可以的. var d = new Date(2000, 0) var d1 = new Date(2005,4,5,17,55,55) 以上代碼創(chuàng)建的日期對象,只不過這次的日期對象是基于系統(tǒng)設(shè)置的be
Date.now()
該方法可以獲取當(dāng)前日期和時(shí)間的毫秒數(shù):
var start = Date.now() //獲取開始時(shí)間 do() //做些啥 var stop = Date.now() //獲取結(jié)束時(shí)間
如果某些瀏覽器不支持的話,我們可以通過以下技巧獲得當(dāng)前時(shí)間的毫秒數(shù),就是在前面加一個(gè)‘+’:
var s = +new Date() console.log(s) //1506069877901
繼承的方法
這里說下繼承自O(shè)bject的三個(gè)方法,toLocalString, toString, valueOf:
var d = new Date() d.toLocaleString() //"2017/9/22 下午4:49:43" d.toString() //"Fri Sep 22 2017 16:49:43 GMT+0800 (中國標(biāo)準(zhǔn)時(shí)間)" d.valueOf() //1506070183078
稍微下他們之間的區(qū)別,主要valueOf返回的是時(shí)間對象的毫秒數(shù)。
日期格式化方法
Date類型還有一些專門用于將日期格式化為字符串的方法:
var d = new Date() d.toDateString() //"Fri Sep 22 2017" d.toTimeString() //"17:02:27 GMT+0800 (中國標(biāo)準(zhǔn)時(shí)間)" d.toLocaleDateString() //"2017/9/22" d.toLocaleTimeString() //"下午5:02:27" d.toUTCString() //"Fri, 22 Sep 2017 09:02:27 GMT"
以上的這些方法都會根據(jù)系統(tǒng)環(huán)境而異。
日期/時(shí)間組件方法
下面介紹一下Date對象提供的一些方法,可以取得和設(shè)置日期值中特定部分的方法。
var d = new Date() 1. 獲取日期的毫秒數(shù),和valueOf方法返回的值相同。 d.getTime() //1506071307006 2. 通過毫秒設(shè)置日期,會改變當(dāng)前的日期對象。 d.setTime(1213123) console.log(d) //Thu Jan 01 1970 08:20:13 GMT+0800 (中國標(biāo)準(zhǔn)時(shí)間) 3. 獲取4位數(shù)的年份 d.getFullYear() // 1970 4. 返回UTC日期的4位數(shù)年份 d.getUTCFullYear() //1970 5. 返回日期中的月份,從0開始算起 d.getMonth() // 8 6. 返回UTC日期中的月份,從0開始算起 d.getUTCMonth() //8 7. 返回日期月份中的天數(shù), 如果傳入的值超過了該月應(yīng)有的天數(shù),則增加月份 d.getDate() // 22 8. 返回UTC日期月份中的天數(shù), 如果傳入的值超過了該月應(yīng)有的天數(shù),則增加月份 d.getUTCDate() // 22 9. 返回日期中星期的星期幾(0表示星期天,6表示星期6) d.getDay() //6 10. 返回UTC中的日期中的星期幾(0表示星期天,6表示星期6) d.getUTCDay() //1 11.返回日期中的小時(shí)數(shù)(0~23),傳入的值超過23則增加月份中的天數(shù) d.getHours() // 9 12. 返回UTC日期中的小時(shí)數(shù)(0~23),傳入的值超過23則增加月份中的天數(shù) d.getUTCHours() 13. 返回日期中的分鐘數(shù)(0~59),也可以進(jìn)行設(shè)置。 d.getMinutes() 14. 返回UTC中日期的分鐘數(shù),也可以進(jìn)行設(shè)置。 d.getUTCMinutes() 15. 返回日期中的秒數(shù)0~59,也可以進(jìn)行設(shè)置。 d.getSeconds() 16. 返回日期對象中UTC的秒數(shù) d.getUTCSeconds() 17. 返回日期中的毫秒數(shù),也可以進(jìn)行設(shè)置 d.getMilliseconds()二. Function類型
在JavaScript中,函數(shù)其實(shí)就是一個(gè)對象,每個(gè)函數(shù)都是Function類型的實(shí)例,而且和其他引用類型一樣具有屬性和方法。
因?yàn)楹瘮?shù)是一個(gè)對象,所以函數(shù)名其實(shí)是一個(gè)指向函數(shù)對象的指針,不會與某個(gè)函數(shù)綁定。
定義函數(shù)有兩種方法:函數(shù)聲明和函數(shù)表達(dá)式。
function fn(){ ... } var fn = function() { ... };
還有一種方法就是通過Function構(gòu)造函數(shù)。Function構(gòu)造函數(shù)可以接受任意數(shù)量的參數(shù),但最后一個(gè)參數(shù)始終都是被看成函數(shù)體。前面的額參數(shù)則枚舉新函數(shù)的參數(shù)。
var fn = new Function("num1", "num2", "return num1+num2")
從技術(shù)的角度來說,這是一個(gè)函數(shù)表達(dá)式。但是最佳實(shí)踐中并不推薦使用這種方法,因?yàn)檫@種方法會導(dǎo)致解析兩次代碼。第一次是正常的解析,第二次是解析傳入構(gòu)造函數(shù)中的字符串。
由于函數(shù)名是一個(gè)指針,所以函數(shù)可能會具有多個(gè)函數(shù)名:
function fn() {console.log(123)} var fn1 = fn 如果以下操作還可以繼續(xù)訪問: fn = null fn1() // 123
沒有重載
先看一個(gè)例子:
fucntion add (num){ return num + 100 } function add (num) { return num + 200 } console.log(add(100)) // 300
然后改寫下上面的例子:
var add = function(num) { return num + 100 } add = function (num) { return num + 200 } add(100) //300
函數(shù)表達(dá)式和函數(shù)聲明
之前說過創(chuàng)建函數(shù)的方法有兩種,函數(shù)聲明和函數(shù)表達(dá)式,我們來看下他們之間的區(qū)別。
js引擎在解析的時(shí)候會先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼之前可以訪問。因?yàn)樵诖a執(zhí)行之前,解析器就已經(jīng)通過一個(gè)函數(shù)聲明提升的過程,讀取并將函數(shù)聲明添加到執(zhí)行環(huán)境中。對代碼求值時(shí),JavaScript引擎會在第一遍聲明函數(shù),并將它們放到源代碼樹的頂部。
函數(shù)表達(dá)式,必須等解析器執(zhí)行到它所在的代碼行,才會真正的被解釋執(zhí)行:
console.log(fn(10, 10)) // error "fn is not a function" var fn = function(a, b) { return a + b }
以上代碼會報(bào)錯(cuò),因?yàn)樵诤瘮?shù)位于一個(gè)初始化語句中。而不是一個(gè)函數(shù)聲明。換句話說,在執(zhí)行到函數(shù)所在的語句之前,變量fn是不會保存對函數(shù)的引用。而且由于第一行已經(jīng)報(bào)錯(cuò)了,代碼也不會繼續(xù)向下執(zhí)行。
作為值的函數(shù)
JavaScript中,函數(shù)名本身也是一個(gè)變量,所以函數(shù)可以作為值來使用。所以函數(shù)可以作為另外一個(gè)函數(shù)的參數(shù),而且可以將一個(gè)函數(shù)作為另外一個(gè)函數(shù)的結(jié)果進(jìn)行返回。
function callSomeFn(fn, arg) { return fn(arg) }
如上,這個(gè)函數(shù)接受兩個(gè)參數(shù),第一個(gè)參數(shù)應(yīng)該是一個(gè)函數(shù),第二個(gè)參數(shù)是要傳遞給函數(shù)的一個(gè)值。然后,就可以如下:
function add(num) { return num+10 } var res = callSomeFn(fn, 10) console.log(res) //20 function greet (name) { return "hello" + name } var res = callSomeFn(greet, "world") console.log(res) //"hello world"
而且,我們可以在一個(gè)函數(shù)中返回另外一個(gè)函數(shù),如下我們通過函數(shù)創(chuàng)建另外一個(gè)函數(shù)然后返回:
function create(proName) { return function (obj1, obj2) { var val1 = obj1[proName] var val2 = obj[proName] if(val1 < val2) { return -1 }else if(val1 > val2) { return 1 }else { return 0 } } }
函數(shù)內(nèi)部屬性
callee
在函數(shù)內(nèi)部,有兩個(gè)特殊的對象:arguments和this。arguments是一個(gè)類數(shù)組的對象,它包含傳入函數(shù)中的所有參數(shù)。該對象還有一個(gè)callee的屬性,該屬性是一個(gè)指針,指向的是擁有這個(gè)arguments對象的函數(shù)。
function factor(num) { if(num <= 1) { return 1 }else{ return num * factor(num - 1) } }
如上是一個(gè)遞歸函數(shù),通過callee可以改寫成下面這樣:
function factor(num) { if(num < 1) { return 1 }else{ return num * argument.callee(num - 1) } }
this
函數(shù)內(nèi)部的另一個(gè)特殊對象是this,this引用的是函數(shù)當(dāng)前執(zhí)行的環(huán)境對象。this是在函數(shù)調(diào)用的時(shí)候進(jìn)行綁定的。完全取決于函數(shù)的調(diào)用位置。
當(dāng)某個(gè)函數(shù)在全局作用域中定義的,當(dāng)在全局作用域中調(diào)用改函數(shù)時(shí),this引用的是全局對象window.
var a = 12 function b() { console.log(this.a) } b() //12
在理解this的綁定過程之前,我們了解一下調(diào)用位置,調(diào)用位置表示的是函數(shù)所被調(diào)用的位置,而不是其聲明的位置。
如何知道函數(shù)的調(diào)用位置,最重要的是分析函數(shù)的調(diào)用棧(即為了到達(dá)當(dāng)前執(zhí)行位置所調(diào)用的所有函數(shù))。那么調(diào)用位置就是當(dāng)前正在執(zhí)行函數(shù)的前一個(gè)調(diào)用中。
function baz() { //當(dāng)前的調(diào)用棧是baz //當(dāng)前的調(diào)用位置是全局作用域,即當(dāng)前調(diào)用棧的前一個(gè)調(diào)用 console.log("baz"); bar(); } function bar() { //當(dāng)前調(diào)用棧是 baz-->bar //當(dāng)前的調(diào)用位置是:baz console.log("bar"); foo(); } function foo() { //當(dāng)前的調(diào)用棧是baz --> bar --> foo //當(dāng)前調(diào)用位置是bar } baz(); //<-- baz的調(diào)用位置就是全局作用域
caller
另外一個(gè)函數(shù)對象的屬性是:caller.該屬性保存著調(diào)用當(dāng)前函數(shù)的函數(shù)引用。如果在全局作用域中調(diào)用當(dāng)前函數(shù),它的值為null。
function outer() { inner() } function inner() { console.log(inner.caller) } outer()
函數(shù)屬性和方法
前面說過函數(shù)也是一個(gè)對象,所以函數(shù)也是有屬性和方法的。每個(gè)函數(shù)都包含兩個(gè)屬性:length和prototype.其中l(wèi)ength屬性表示函數(shù)接受命名參數(shù)的個(gè)數(shù)。
funtion setName(name) { console.log(name) } function sun(s1, s2){ //... } console.log(setName.length) // 1 console.log(sun.length) //2
再說下prototype屬性,它是保存所有實(shí)例方法的真正所在。
再說下apply()和call()。這兩個(gè)方法的用途都是在特定的作用域中調(diào)用函數(shù),實(shí)際上等于設(shè)置函數(shù)體內(nèi)this對象的值。它們是每個(gè)函數(shù)都具有的非繼承而來的方法。
apply()接受兩個(gè)參數(shù),一個(gè)是在其中運(yùn)行函數(shù)的作用域,另一個(gè)是參數(shù)數(shù)組。其中第二個(gè)參數(shù)可以是Array實(shí)例,也可以是arguments對象。
call()和apply()相同,它們的區(qū)別僅在于接受參數(shù)的方式不同。call()第一個(gè)參數(shù)是this的指向,其余的參數(shù)都是直接傳遞給函數(shù)。
--本篇記錄不是一次性寫完,中間有很多事情耽擱了,零零散散的感覺沒有什么邏輯,隨便看看了各位~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88679.html
摘要:內(nèi)存泄露內(nèi)存泄露概念在計(jì)算機(jī)科學(xué)中,內(nèi)存泄漏指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存。判斷內(nèi)存泄漏,以字段為準(zhǔn)。 本文是 重溫基礎(chǔ) 系列文章的第二十二篇。 今日感受:優(yōu)化學(xué)習(xí)方法。 系列目錄: 【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理) 【重溫基礎(chǔ)】1-14篇 【重溫基礎(chǔ)】15.JS對象介紹 【重溫基礎(chǔ)】16.JSON對象介紹 【重溫基礎(chǔ)】1...
摘要:作用域鏈?zhǔn)潜WC對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。如上,包含的作用域鏈包含它自己的變量對象和全局環(huán)境的變量對象,為什么能在函數(shù)內(nèi)訪問,這就是通過作用域鏈找的。 前言JavaScript的變量類型是弱類型的,在特定的時(shí)間內(nèi)保存一個(gè)特定的值,變量的值和數(shù)據(jù)類型可以在腳本的生命周期內(nèi)隨意改變。 1. 基本類型和引用類型的值 JavaScript包含兩種不同類型的值:基本類型和引用類...
摘要:今天把接下來引用類型中的一些內(nèi)容全部記錄完畢基本包裝類型為了便于操作基本類型值,還提供了種特殊的引用類型。這三種類型具有與各自的基本類型響應(yīng)的特殊行為。重寫后的返回對象表示的數(shù)值類型,另外兩個(gè)方法則返回字符串形式的數(shù)值。 今天把接下來引用類型中的一些內(nèi)容全部記錄完畢~ 基本包裝類型 為了便于操作基本類型值,JavaScript還提供了3種特殊的引用類型:Boolean, Number,...
摘要:繼承了如上,我們通過方法借調(diào)了超類的構(gòu)造函數(shù),實(shí)際上是在新創(chuàng)建的實(shí)力環(huán)境下調(diào)用了構(gòu)造函數(shù)。組合繼承組合繼承的基本思想將原型鏈和借用構(gòu)造函數(shù)的技術(shù)組合到一塊,從而發(fā)揮二者之長的一種繼承模式。繼承方法在上面這個(gè)例子中,構(gòu)造函數(shù)定義了兩個(gè)屬性和。 在ECMAScript中只支持實(shí)現(xiàn)繼承,而且實(shí)現(xiàn)繼承主要是依靠原型鏈來實(shí)現(xiàn)的。 1. 什么是原型鏈 繼承基本思想:利用原型讓一個(gè)引用類型繼承另一個(gè)...
摘要:系列目錄復(fù)習(xí)資料資料整理個(gè)人整理重溫基礎(chǔ)篇重溫基礎(chǔ)對象介紹重溫基礎(chǔ)對象介紹重溫基礎(chǔ)介紹重溫基礎(chǔ)相等性判斷本章節(jié)復(fù)習(xí)的是中的關(guān)于閉包,這個(gè)小哥哥呀,看看。這里隨著閉包函數(shù)的結(jié)束,執(zhí)行環(huán)境銷毀,變量回收。 本文是 重溫基礎(chǔ) 系列文章的第十九篇。今日感受:將混亂的事情找出之間的聯(lián)系,也是種能力。 系列目錄: 【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理) 【重溫基礎(chǔ)】...
閱讀 1035·2021-11-23 09:51
閱讀 2359·2021-10-08 10:22
閱讀 2653·2021-09-29 09:35
閱讀 871·2021-09-22 15:20
閱讀 2873·2019-08-30 15:53
閱讀 2422·2019-08-30 13:55
閱讀 1110·2019-08-29 17:27
閱讀 2879·2019-08-29 17:26