Javascript是否可能保持相同的表达式值?
Is it possible that Javascript keep same expression value?
我想知道javascript是否计算(再次)相同的表达式,因为它遇到它们:
例如:
alert(new Date().getTime()+1-1+1-1+1-1+1-1+1-1+1-1+1-1+1-1+1-1+1-1-new Date().getTime())
output : 0
很难测试它,但我认为所有的+/-1
将需要一些时间(一个tick),所以我可以看到一个差异。
但答案是0。
它是零,因为它只是太快,还是因为JS把第一个新的日期()作为相同的后一个?
GetTime()
返回自Unix纪元以来的毫秒数。考虑到在理论中,一个加法在现代处理器上只需要一个FLOP(运行在数十亿个FLOPS),我想说处理器极有可能在不到一毫秒的时间内执行整个语句。
当然,真正测试这一点的方法是在一个循环中运行数十亿次,让大数定律来解决剩下的问题。为了使事情变得更简单,您还可以尝试使用任意大的数字交替使用乘法和除法,以使执行时间更长。
无论如何,请记住,一般来说,语言不会倾向于优化函数,除非它总是或几乎总是有意义的。在您的特定情况下,程序如何能够合理地假设您没有尝试测量算术所需的时间?如果将单行语句分解为几个更小的语句呢?你也会做同样的事…在这种情况下,日期/时间函数的行为不同是否合理?
简而言之,我能想到很多情况下缓存日期/时间会在程序执行中导致严重的问题。我无法想象缓存提供的无限小的性能提升可以弥补它们。
是的,10个+
操作和10个-
操作可能不会占用一毫秒。您可以这样测试它:
var c = (new Date().getTime() + calc() - new Date().getTime());
function calc() {
for (var i = 0; i < 100000000; i++) {}
return 0;
}
console.log(c);
你真的会得到一个不等于0的输出
回答你的问题的关键,而其他的答案似乎都遗漏了;不,这是不可能的,这两个调用new Date()
被优化成相同的东西。这两个单独的调用返回不同的对象,对于引擎来说,简单地将两个不同的调用优化为一个调用是完全无效的。
考虑一下,例如,如果你用一个不同的方法来做这件事,这个方法返回一个新的Date
对象,但是这个方法包含了一个20秒的延迟(或者每次调用一个递增的返回值)——两个getTime
结果应该相隔数千个滴答,但是你提议的"优化"将使它们返回相同的值。
如果Date()
函数返回1到10,000之间的随机整数怎么办?
如果不知道返回值应该是什么,引擎将无法知道这两个调用应该返回相同的值(顺便说一下,它们不应该返回相同的值),为了知道这一点,它无论如何都必须执行两个方法。
所以,是的,这是因为调用间隔不到一毫秒完成。
这取决于JavaScript引擎。如果代码是预编译的,你的+/- 1计算可能会被优化掉。
- ES6是否引入了一种机制来生成块范围的函数语句(而不是表达式)
- 是否有任何Javascript函数从指定的索引中进行正则表达式匹配
- 尝试使用Javascript正则表达式来获取“&"分隔文本,无论它是否's是最后一个值
- 是否可以扩展正则表达式元字符的范围
- 是否存在将String转换为可执行的c++表达式的方法
- Webpack:是否可以在编译时评估javascript表达式
- 确定 JavaScript 代码是否为表达式
- 验证数字是否在0.00到20.00之间的正则表达式
- 如何在javascript中测试字符串是否包含带正则表达式的数字
- JavaScript:是否有完全支持查找的正则表达式库
- 在Polymer中,双向绑定与属性表达式是否可能
- Javascript正则表达式,用于检查字符串是否为有效数字
- Go中是否存在与此JS表达式等效的表达式
- 是否可以在自定义指令中使用理解表达式
- 由表达式文本创建的正则表达式是否共享单个实例
- 如何检测正则表达式是否有任何匹配项
- 这个JavaScript正则表达式是否替换空格
- Javascript中带括号的表达式是否返回引用
- 对象数据源的AngularJS ngOptions表达式-是否可以将属性键存储在某个位置
- 如何在脚本中识别正则表达式是否为空