jQuery.now()不是唯一的

jQuery .now() not unique

本文关键字:唯一 now jQuery      更新时间:2024-07-17

我有一个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-api:报价

$.now()方法是expression(new Date).getTime().

所以你基本上使用new Date().getTime()。但是getTime()并不准确。。。本文中的相互关联引用:

实际上,这些浏览器只是在更新其内部getTime每15毫秒表示一次。这意味着如果你尝试要查询更新的时间,它总是四舍五入到最后计时器更新的时间(平均而言,大约7.5毫秒前)。

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

当你需要一个随机数时(正如你所做的),使用:

var randomVal = Math.random(); // e.g. 0.6137274974025786
var randomValI = Math.round(Math.random()*100000000000000000)  // e.g. 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();

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:如果标识符在函数范围内必须是唯一的,那么StevenP建议的计数器可能会做得最好。

2:如果标识符需要在您的应用程序范围内是唯一的,并且您不可能跟踪分配的标识符(如1所示),那么您的工作将更加困难。在实际应用中,这种情况可以通过将时间戳与随机数相结合来解决,就像一样

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

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

3:然而,如果你的目标是"跨越空间和时间的独特性",你可以从中获得灵感http://www.ietf.org/rfc/rfc4122.txt

需要注意的是,像在Javascript中创建GUID:UUID这样的纯Javascript实现?也只能使用随机数,因此不会生成真正的唯一标识符。对于跨越空间和时间的真正唯一标识符,必须使用确实的唯一元素(如mac地址)作为标识符的一部分。

当然$.now只显示当前时间戳。要获得随机数,请使用Math.random()