เครื่องหมายบวกทำใน '+ วันที่ใหม่'


238

ฉันเคยเห็นสิ่งนี้ในไม่กี่แห่ง

function fn() {
    return +new Date;
}

และฉันเห็นว่ามันส่งคืนการประทับเวลาแทนที่จะเป็นวัตถุวันที่ แต่ฉันไม่พบเอกสารใด ๆ เกี่ยวกับสิ่งที่เครื่องหมายบวกกำลังทำอยู่

มีใครอธิบายได้บ้าง


คำตอบ:


294

นั่นคือตัวดำเนินการ + unary ซึ่งเทียบเท่ากับ:

function(){ return Number(new Date); }

ดู: http://xkr.us/articles/javascript/unary-add/

และใน MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Unary_plus


4
แต่ทำไมคุณไม่ใช้getTimeวิธีการที่กำหนดไว้ในวัตถุวันที่!
tkone

30
ภายใต้สถานการณ์ที่คุณไม่ควรใช้สิ่งนี้จริงๆ ฉันเพิ่งถูกไฟไหม้นี้ + new date () นอกเหนือจากการดำเนินการทางคณิตศาสตร์ทุกประเภทจะได้รับการลงโทษที่สำคัญ ดู jsperf นี้, jsperf.com/new-date-timing
Geuis

9
@BradKoch ในการเขียนโปรแกรมความกะทัดรัดแน่นอนที่สุดไม่ได้เป็นปัญญาของจิตวิญญาณ ในขณะที่ชุมชนไพ ธ อนได้กำหนดไว้อย่างเพียงพอ "ชัดเจนดีกว่าการบอกเป็นนัยเสมอ" จะเกิดอะไรขึ้นถ้าเบราว์เซอร์เปลี่ยนการแปลงประเภทอัตโนมัติที่บอกเป็นนัยผ่านการถดถอย ตอนนี้รหัสของคุณไม่ทำงาน! .getTime()จะทำประกันเสมอ
tkone

11
@Geuis อีกเหตุผลที่ยอดเยี่ยมเพียงเพราะคุณไม่สามารถหมายความว่าคุณควร!
tkone

14
Sine ECMAScript 5 นั่นคือDate.now()ซึ่งเป็นวิธีที่ต้องการในการรับวันที่และเวลาเป็นมิลลิวินาที
cutemachine

43

JavaScript ถูกพิมพ์อย่างหลวม ๆ ดังนั้นมันจึงทำการบังคับ / แปลงประเภทในบางสถานการณ์:

http://blog.jeremymartin.name/2008/03/understanding-loose-typing-in.html
http://www.jibbering.com/faq/faq_notes/type_convert.html

ตัวอย่างอื่น ๆ :

>>> +new Date()
1224589625406
>>> +"3"
3
>>> +true
1
>>> 3 == "3"
true

>>> 3 === "3" false
David Spector

6

วันที่ JavaScript สามารถเขียนเป็นสตริง:

พ.ย. 10 2015 12:02:54 GMT + 0530 (IST)

หรือเป็นตัวเลข:

1441866774938

วันที่เขียนเป็นตัวเลขระบุจำนวนมิลลิวินาทีตั้งแต่ 1 มกราคม 1970, 00:00:00

เมื่อมาถึงคำถามของคุณพบว่าการเพิ่ม '+' หลังจากผู้ประกอบการที่ได้รับมอบหมาย '=' ทำให้การแปลง Date เป็นค่าตัวเลขที่เท่ากัน

เดียวกันสามารถทำได้โดยใช้ฟังก์ชัน Number () เช่น Number (new Date ());

var date = +new Date(); //same as 'var date =number(new Date());'


3

เพียงเพื่อให้ข้อมูลเพิ่มเติม:

หากคุณจำได้ว่าเมื่อคุณต้องการหาความแตกต่างของเวลาระหว่างวันที่สองวันคุณจะทำดังนี้

var d1 = new Date("2000/01/01 00:00:00"); 
var d2 = new Date("2000/01/01 00:00:01");  //one second later

var t = d2 - d1; //will be 1000 (msec) = 1 sec

typeof t; // "number"

ตอนนี้ถ้าคุณตรวจสอบประเภทของ d1-0 ก็เป็นตัวเลขเช่นกัน:

t = new Date() - 0; //numeric value of Date: number of msec's since 1 Jan 1970.
typeof t; // "number"

that + จะแปลง Date เป็น Number ด้วย:

typeof (+new Date()) //"number"

แต่ทราบว่า0 + new Date()จะไม่ได้รับการปฏิบัติในทำนองเดียวกัน! มันจะถูกตัดแบ่งเป็นสตริง:

0 + new Date() // "0Tue Oct 16 05:03:24 PDT 2018"

1

มันเป็นตัวดำเนินการเพิ่ม unaryและยังใช้สำหรับการแปลงตัวเลขอย่างชัดเจนดังนั้นเมื่อคุณโทร+new Date()มันจะพยายามรับค่าตัวเลขของวัตถุนั้นโดยใช้valueOf()เหมือนกับที่เราได้รับสายจากtoString()

new Date().valueOf() == (+new Date)  // true

-3

มันทำสิ่งเดียวกับ:

ฟังก์ชั่น () {กลับ 0 + วันที่ใหม่; }

ที่มีผลลัพธ์เช่นเดียวกับ:

ฟังก์ชัน () {ส่งคืนวันที่ใหม่ (). getTime (); }

11
ไม่วันที่ 0 + วันที่ใหม่ ครั้งแรกนั้นจะแปลงวันที่เป็นสตริงจากนั้นนำเสนอ "0" (เช่น: "0 ตุลาคม 21 2008 20:38:05 GMT-0400")
Chris Noe

2
1 * new Date จะ แต่ 1 + new Date -> String
Kent Fredric

ยาก็เช่นเดียวกันสำหรับnew Date/1
Ashish
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.