React.js學習筆記(9) Date對象 + ( Moment.js 時間格式化插件 ) + ( 形參,實參,傳值傳遞,傳址傳遞 )

(一) Date對象 概述

Date對象是JavaScript提供的日期和時間的操作接口。它可以表示的時間范圍是,1970年1月1日00:00:00前后的各1億天(單位為毫秒)。

(1)Date作為普通函數: Date() -------------------返回當前時間字符串

  • Date對象可以作為普通函數直接調用,返回一個代表當前時間的字符串。
  • Date對象作為普通函數使用時,即使帶有參數,返回的還是當前時間。
# Date對象作為普通函數,可以直接調用,返回當前時間字符串



Date()
// Sat Nov 18 2017 17:42:30 GMT+0800 (中國標準時間)



--------------------------------------


# 作為普通函數時,即使帶有參數,返回的還是當前時間



Date(2000, 1, 1)
// Sat Nov 18 2017 17:42:30 GMT+0800 (中國標準時間)

(2) Date作為構造函數: new Date()--------------------返回Date對象實例

  • Date還可以當作構造函數使用。對它使用new命令,會返回一個Date對象的實例。如果不加參數,生成的就是代表當前時間的對象
  • 這個Date實例對應的字符串值,就是當前時間。

var Today = new Date()

Today --------------------------------------------- // typeof是一個Object類型

等同于(相等)

today.toString()------------------------------------// typeof是一個String類型


最后的值都相等
// Sat Nov 18 2017 17:55:42 GMT+0800 (中國標準時間)

作為構造函數時,Date對象可以接受多種格式的參數。

[1] new Date(datestring)

Date對象接受一個日期字符串作為參數,返回所對應的時間。

  • 日期字符串的完整格式是“month day, year hours:minutes:seconds”,比如“December 25, 1995 13:30:00”。如果省略了小時、分鐘或秒數,這些值會被設為0。

#參數為日期字符串時,返回對應的時間:

# 如果省略了小時、分鐘或秒數,這些值會被設為0。

new Date('January 6, 2013');
// Sun Jan 06 2013 00:00:00 GMT+0800 (CST)


  • 但是,其他格式的日期字符串,也可以被解析。事實上,所有可以被Date.parse()方法解析的日期字符串,都可以當作Date對象的參數。

new Date('2013-2-15')
new Date('2013/2/15')
new Date('02/15/2013')
new Date('2013-FEB-15')
new Date('FEB, 15, 2013')
new Date('FEB 15, 2013')
new Date('Feberuary, 15, 2013')
new Date('Feberuary 15, 2013')
new Date('15 Feb 2013')
new Date('15, Feberuary, 2013')

// Fri Feb 15 2013 00:00:00 GMT+0800 (CST)


  • 總之,對于YYYY-MM-DD形式的字符串,JavaScript引擎可能會將其當作ISO格式來解析,采用格林尼治時區作為計時標準;而對于其他格式的日期字符串,一律視為非ISO格式,采用本地時區作為計時標準。(最好不要用這種方式,可以YYYY/MM/DD形式)
  • 日期字符串有沒有前導0,返回的結果是不一樣的。如果沒有前導0,JavaScript引擎假設用戶處于本地時區,所以本例返回0點0分。如果有前導0(即如果你以ISO格式表示日期),就假設用戶處于格林尼治國際標準時的時區,所以返回8點0分。但是,ES6改變了這種做法,規定凡是沒有指定時區的日期字符串,一律認定用戶處于本地時區。

[2] new Date(year, month [, day, hours, minutes, seconds, ms]), 這種寫法 至少要兩個參數(年,月)

  • Date對象還可以接受多個整數作為參數,依次表示年、月、日、小時、分鐘、秒和毫秒。
  • 如果采用這種格式,最少需要提供兩個參數(年和月),其他參數都是可選的,默認等于0。因為如果只使用“年”這一個參數,Date對象會將其解釋為毫秒數。
    year:四位年份,如果寫成兩位數,則加上1900
    month:表示月份,0表示一月,11表示12月---------月份從0開始算
    date:表示日期,1到31-----------------------------天數從1開始算
    hour:表示小時,0到23
    minute:表示分鐘,0到59
    second:表示秒鐘,0到59
    ms:表示毫秒,0到999
  • 注意,月份從0開始計算,但是,天數從1開始計算。另外,除了日期默認為1,小時、分鐘、秒鐘和毫秒默認都是0。

        let e81 = new Date(2018,0)
        let e82 = new Date(2018,1)
        let e865 = new Date(2018,5,5)
   
//  e81 = Mon Jan 01 2018 00:00:00 GMT+0800 (中國標準時間) 
//  e82 = Thu Feb 01 2018 00:00:00 GMT+0800 (中國標準時間)
// e865 = Tue Jun 05 2018 00:00:00 GMT+0800 (中國標準時間)

(二) Date實例對象的方法

Date的實例對象,有幾十個自己的方法,分為以下三類。

  • to類:從Date對象返回一個字符串,表示指定的時間。
  • get類:獲取Date對象的日期和時間。
  • set類:設置Date對象的日期和時間。

(1) to類:從Date對象返回一個字符串,表示指定的時間。

(1)Date.prototype.toString()
  • toString方法返回一個完整的日期字符串。


var d = new Date(2013, 0, 1);

d.toString()
// "Tue Jan 01 2013 00:00:00 GMT+0800 (CST)"

d
// "Tue Jan 01 2013 00:00:00 GMT+0800 (CST)" 



因為toString是默認的調用方法,所以如果直接讀取Date對象實例,就相當于調用這個方法。


(2)Date.prototype.toUTCString()
  • toUTCString方法返回對應的UTC時間,也就是比北京時間晚8個小時。

var d = new Date(2013, 0, 1);

d.toUTCString()
// "Mon, 31 Dec 2012 16:00:00 GMT"

d.toString()
// "Tue Jan 01 2013 00:00:00 GMT+0800 (CST)"

(3)Date.prototype.toDateString()
  • toDateString方法返回日期字符串。

var d = new Date(2013, 0, 1);
d.toDateString() // "Tue Jan 01 2013"

(4)Date.prototype.toTimeString()
  • toTimeString方法返回時間字符串

var d = new Date(2013, 0, 1);
d.toTimeString() // "00:00:00 GMT+0800 (CST)"

(5)Date.prototype.toLocaleDateString()

  • toLocaleDateString方法返回一個字符串,代表日期的當地寫法。

var d = new Date(2013, 0, 1);

d.toLocaleDateString()
// 中文版瀏覽器為"2013年1月1日"
// 英文版瀏覽器為"1/1/2013"

(6)Date.prototype.toLocaleTimeString()

  • toLocaleTimeString方法返回一個字符串,代表時間的當地寫法。


var d = new Date(2013, 0, 1);

d.toLocaleTimeString()
// 中文版瀏覽器為"上午12:00:00"
// 英文版瀏覽器為"12:00:00 AM"


(2) get類:獲取Date對象的日期和時間。

Date對象提供了一系列get*方法,用來獲取實例對象某個方面的值。

getTime():返回距離1970年1月1日00:00:00的毫秒數,等同于valueOf方法。
getDate():返回實例對象對應每個月的幾號(從1開始)。---------------------------------
getDay():返回星期幾,星期日為0,星期一為1,以此類推。-----------------------------
getYear():返回距離1900的年數。
getFullYear():返回四位的年份。-----------------------------------------------------------------
getMonth():返回月份(0表示1月,11表示12月)。----------------------------------------
getHours():返回小時(0-23)。-----------------------------------------------------------------
getMilliseconds():返回毫秒(0-999)。
getMinutes():返回分鐘(0-59)。--------------------------------------------------------------
getSeconds():返回秒(0-59)。----------------------------------------------------------------
getTimezoneOffset():返回當前時間與UTC的時區差異,以分鐘表示,返回結果考慮到了夏令時因素。

所有這些get*方法返回的都是整數,不同方法返回值的范圍不一樣。

分鐘和秒:0 到 59
小時:0 到 23

星期:0(星期天)到 6(星期六)
日期:1 到 31
月份:0(一月)到 11(十二月)
年份:距離1900年的年數


var d = new Date('January 6, 2013');

d.getDate() // 6-----------------------------------------
d.getMonth() // 0----------------------------------------
d.getYear() // 113
d.getFullYear() // 2013----------------------------------
d.getTimezoneOffset() // -480


(3) set類:設置Date對象的日期和時間。

Date對象提供了一系列set*方法,用來設置實例對象的各個方面。

  • set 這些方法基本是跟 get 方法一一對應的,但是沒有setDay方法,因為星期幾是計算出來的,而不是設置的。另外,需要注意的是,凡是涉及到設置月份,都是從0開始算的,即0是1月,11是12月。

setDate(date):設置實例對象對應的每個月的幾號(1-31),返回改變后毫秒時間戳。

setYear(year): 設置距離1900年的年數。
setFullYear(year [, month, date]):設置四位年份。
setHours(hour [, min, sec, ms]):設置小時(0-23)。
setMilliseconds():設置毫秒(0-999)。
setMinutes(min [, sec, ms]):設置分鐘(0-59)。
setMonth(month [, date]):設置月份(0-11)。
setSeconds(sec [, ms]):設置秒(0-59)。
setTime(milliseconds):設置毫秒時間戳。

Date對象








(二) Moment.js時間格式化插件

(1) 安裝

npm install moment --save

(2)引入和使用 - 在需要的地方引入

es5
var moment = require('moment');
moment().format();


es6
import moment from 'moment';
moment().format();

(3)示列:

//
2017-11-19T17:07:11+08:00 -------moment().format()
2016-06-06 -------moment().format('2016-06-06')
2016-6-6 -------moment().format('2016-6-6')
date.js:13-----------------------------------------------------
2017-11-19 -------moment().format('YYYY-MM-DD')
05/07/11 -------moment().format('hh/mm/ss')
date.js:16-----------------------------------------------------
17 "moment().hour()"
7 "moment().minute()"
11 "moment().second()"
date.js:20-----------------------------------------------------
2017 "moment().year()"
10 "moment().month()"
19 "moment().date()"
0 "moment().day()"
date.js:25-----------------------------------------------------
2018/11/19 -------moment().add(1,'y').format('YYYY/MM/DD')
2018 "moment().add(1,'years').year()-------這是number類型"
2018 -------moment().add(1,'years').format('YYYY')-------這是string類型
2016 "moment().subtract(1,'y').year()"
11 -------moment().startOf('month').format('MM')

moment.js







(三) ps: 形參和實參

(1)形參,是在定義函數時使用的參數,目的是用來接收調用該函數時傳進來的實際參數。

(2)實參:是在調用時傳遞給函數的參數


function myfun(a,b,c){
    ...  
}
myfun(1,2,3);


這里a,b,c就是形參。1,2,3為實參。 

形參和實參是不同的變量,他們在內存中處于不同的位置,形參在函數運行結束時將被釋放。

(四) 參數傳遞:傳值傳遞和傳址傳遞

(1)傳值傳遞

  • 函數參數(實參)如果是原始類型的值(數值、字符串、布爾值),
  • 那么傳遞方式是就是傳值傳遞(passes by value)。
  • 這意味著,在函數體內修改參數值,不會影響到函數外部。
    (傳值傳遞,在函數內部,參數值是原始值的拷貝,無論怎么修改,都不會影響到原始值。)

var p = 2;     // 數字作為參數   屬于   原始類型的值

function f(p) {     // 形參
  p = 3;            // 函數聲明和初始化
}
f(p);               // 實參,傳值傳遞-----------------------參數是數字,字符串,布爾值
                    // 調用f()函數,沒有返回值  
 
p // 2              // 傳值傳遞,在函數體內修改參數值,不會影響到函數外部






上面代碼中,變量p是一個原始類型的值,傳入函數f的方式是傳值傳遞。

因此,在函數內部,p的值是原始值的拷貝,無論怎么修改,都不會影響到原始值。

(2) 傳址傳遞

  • 如果函數參數是復合類型的值(數組、對象、其他函數),
  • 傳遞方式是傳址傳遞(pass by reference)。
  • 也就是說,傳入函數的原始值的地址,因此在函數內部修改參數,將會影響到原始值。

var obj = {p: 1};       // 對象作為參數    屬于     符合類型的值

function f(o) {         // 形參
  o.p = 2;
}
f(obj);                // 實參,傳址傳遞-----------------------參數是對象,數組,其他函數

obj.p // 2             // 傳址傳遞,在函數內部修改參數值,會影響到函數外部的原始值




上面代碼中,傳入函數f的是參數對象obj的地址。因此,在函數內部修改obj的屬性p,會影響到原始值。

(3) 注意:

如果函數內部修改的,不是參數對象的某個屬性,而是替換掉整個參數,這時不會影響到原始值。

var obj = [1, 2, 3];

function f(o){
  o = [2, 3, 4];
}
f(obj);

obj // [1, 2, 3]


上面代碼中,在函數f內部,參數對象obj被整個替換成另一個值。這時不會影響到原始值。


這是因為,形式參數(o)與實際參數obj存在一個賦值關系。

(4) 某些情況下,如果需要對某個原始類型的變量,獲取傳址傳遞的效果,可以將它寫成全局對象的屬性。

var a = 1;

function f(p) {
  window[p] = 2;
}
f('a');

a // 2



上面代碼中,變量a本來是傳值傳遞,但是寫成window對象的屬性,就達到了傳址傳遞的效果

傳值傳遞,傳址傳遞例子:


export default  class DatesTest extends Component {

    aaa = 1;
    bbb = 'abc';
    ccc = false;

    eee = [1,2,3];
    fff = {'a':1,'b':2};

    funTest = (a,b,c,e,f,g) => {
        a = 22222222222222;
        b = 'abccccccccccc';
        c = true;

        e[0] = 1111111111111111;
        f['a'] = 22222222222222
    }

    componentDidMount() {
        this.funTest(this.aaa,this.bbb,this.ccc,this.eee,this.fff)

        console.log(this.aaa,'this.aaa');
        console.log(this.bbb,'this.bbb');
        console.log(this.ccc,'this.ccc');
        console.log(this.eee,'this.eee');
        console.log(this.fff,'this.fff');
    }
}




// 執行結果:

1 "this.aaa"
abc this.bbb
false "this.ccc"
[1111111111111111, 2, 3] "this.eee"
Object {a: 22222222222222, b: 2} "this.fff"

傳值傳遞,傳址傳遞
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容