jQuery .now()不是唯一的

我有一个jsfiddle 。

obj = {}; obj[0] = 'hej'; obj[1] = 'hopp'; $.each( obj, function( key, value ) { console.log($.now()); }); 

$.now()与控制台中的数字相同。

如何生成唯一编号?

你可以有一个计数器,每个对象递增一次。 然后,您可以将此计数器添加到$ .now()以确保它是唯一的:

 obj = {}; obj[0] = 'hej'; obj[1] = 'hopp'; counter=1; $.each( obj, function( key, value ) { console.log($.now() + counter); counter+=1; }); 

jQuery.now()不应该给你一个唯一的数字,只是一个“代表当前时间的数字”( http://api.jquery.com/jQuery.now/ )。 更具体地说是“自1970年1月1日00:00:00 UTC以来的毫秒数”( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime )。

生成唯一标识符的最简单方法取决于标识符必须唯一的范围。

1:如果标识符必须在函数范围内是唯一的,那么SteveP建议的计数器可能会做得最好。

2:如果标识符在您的应用程序范围内必须是唯一的 – 并且您无法跟踪分配的标识符(如1) – 您的工作就更难了。 在实际应用程序中,可以通过将时间戳与随机数组合在一起来解决这种情况

 var identifier = $.now() + "_" + Math.round(Math.random() * 1e10) 

虽然Math.round(Math.random() * 1e10)可以在一毫秒内返回两次相同的值,但这种方法并不能保证identifier真正唯一性。 根据您生成这样的字符串的频率,您仍然不太可能最终使用相同的字符串两次。

3:如果你的目标是“跨越时空的独特性”,你可以从http://www.ietf.org/rfc/rfc4122.txt获得灵感。

应该注意纯JavaScript的实现,如JavaScript中的Create GUID / UUID? 仅使用随机数,因此不会生成真正唯一的标识符。 对于跨空间和时间的真正唯一标识符,必须使用诸如mac-address之类的真正独特元素作为标识符的一部分。

从jquery api引用:

$ .now()方法是表达式(new Date).getTime()返回的数字的简写。

所以你基本上使用new Date().getTime() 。 但是getTime()不准确…来自本文的有趣报价:

实际上,这些浏览器每15毫秒只更新一次内部getTime表示。 这意味着如果您尝试查询更新的时间,它将始终向下舍入到计时器更新的最后一次(平均而言,这将是大约7.5毫秒之前)。

简而言之: getTime()并不准确(在某些浏览器中)。

如果您需要随机数(就像您一样),请使用:

 var randomVal = Math.random(); // eg 0.6137274974025786 var randomValI = Math.round(Math.random()*100000000000000000) // eg 6137274974025786 

当你需要更正式的’guid’时,请使用以下内容 :

 function createGUID() { function S4() { return (((1+Math.random())*0x10000)|0).toString(16).substring(1); } // then to call it, plus stitch in '4' in the third group return (S4() + S4() + "-" + S4() + "-4" + S4().substr(0,3) + "-" + S4() + "-" + S4() + S4() + S4()).toLowerCase(); } var guid = createGUID(); 

当然$.now只显示当前时间戳。 有一个随机数使用Math.random()