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