javascript中的奇怪语法:“sth”+ + new Date
Strange syntax in javascript: 'sth'+ +new Date
我正在阅读一个jquery插件,并发现这个有趣的语法:
'sth'+ +new Date
它创建一个数字字符串,作者将其用于唯一 id:sth1237004731731
我很好奇它是什么语法,是否有一些关于它的阅读材料?谢谢!
它使用 JavaScript 类型强制的一些副作用来构建唯一标识符(可能用于元素(。令人困惑的部分是+new Date
。在这里,new Date
(或new Date()
(返回一个Date
对象。但是将+
或-
放在前面会强制 JS 解释器将此值强制到Number
对象,而 JS Date
> Number
的方式是返回时间戳(或 getTime()
(。
所以这段代码可以像这样表达
:var date = new Date(), // "Mon May 14 2012 10:03:58 GMT-0400 (EST)"
timestamp = date.getTime(), // 1337004238612
identifierString = "sth" + timestamp.toString();
你可能会合理地声称没有必要这么冗长,所以我个人可能会把它写成:
var identifier = "sth" + (new Date()).getTime();
但是,如果您期望有人可能必须维护您的代码,请避免编写类似示例的内容。如果它阻止了你的脚步,它可能会阻止很多人。编码风格不仅仅是向解释器表达意图,而是向人类开发人员表达意图。如果代码在浏览器中工作,但在大多数有经验的开发人员的头脑中出现语法错误而失败,那么您就做错了,简单明了。
一元+
运算符的一个有趣用法。基本上,您可以将此表达式分解为三个独立的部分,在二进制+
运算符处拆分:
"sth"
,然后+
,然后+new Date
。
二进制+
的第一个操作数只是一个泛型字符串文本。第二个操作数使用一元+
运算符,如链接标准所述,将其操作数转换为Number
。
由于new
运算符具有最高的优先级,因此它比一元运算符"绑定得更紧密"+
,这意味着将首先评估new Date
。因此,一元+
的操作数反过来又是表达式 new Date
的结果。当然,new Date
只是创建一个空白Date
对象。根据 § 15.9.3.3 新日期((:
新构造的 [[PrimitiveValue]] 内部属性 对象设置为标识当前时间的时间值 (UTC(。
换句话说,new Date
只是表示当前时间的Date
对象。反过来,+new Date
会将空白Date
对象转换为数字。
简短的回答
该规范很长且难以遵循。简而言之,+new Date
返回与当前时间关联的 UNIX 时间戳。
长答案:遵循规范
遵循规范的长答案是,一元+
调用ToNumber(GetValue(expr))
其中expr
是计算的操作数。 GetValue(dateObj)
将简单地返回dateObj
,所以表达式变成ToNumber(dateObj)
。
ToNumber
的结果取决于参数的类型。对于对象,它返回ToNumber(ToPrimitive(input argument, hint Number))
.
反过来,ToPrimitive
将调用Date
对象的 valueOf
属性。这将返回一个 Number
,这是与Date
对象关联的时间值:最后,我们正在寻找什么!然后它回到链上:ToNumber(num)
只是返回num
。
当然,从那里,字符串"sth"
和+new Date
的结果是连接的(如果你愿意,你可以在规范中找到它(,这给了你正在寻找的结果。
- 使用:new Image()控制加载html.src=html_URL
- 如何在不使用 new 关键字的情况下从函数创建对象
- 为什么要做新的.Date()与new相差1小时.日期().到ISOString()
- “createImageData()”和“new ImageData(()”有何不同
- 返回值+new Date()与Date.now()是否不同
- new SharedWorker(“whatever.js”)返回一个错误
- new Datamap() 在调用之间保持内存的共享状态
- new XMLHttpRequest().responseType empty
- a=1和a=new Number()之间的差异
- JavaScript“new Date()”使用哪个时区
- JS new.target vs. instanceof
- 为什么(new RegExp(“w”)==/w/)在JS中为false
- JavaScript-使用B.prototype=new A()继承数组
- 为什么使用“new”创建一个Javascript数组被认为是不好的
- “new”关键字是在构造对象时自动设置“constructor”属性的唯一方法吗
- typeof new Function()总是“;函数”;
- new Date('2011-12-15 00:00:00') is showing up as NaN
- infobox.prototype=new google.maps.overlayview()错误,未定义google
- 为什么new Date()会删除一天?-Javascript
- javascript中的奇怪语法:“sth”+ + new Date