Javascript 唯一ID或对象签名

Javascript 唯一ID或对象签名,javascript,Javascript,我正在开发一个日志系统,并期待着实现一次日志方法 我遇到的问题是,如何检索唯一标识符和/或对象签名,以用作哈希键 我的想法是: var Log = { messages : {}, once : function(message) { // get unique id and/or passed objects signature, use it as a key var key = unique( message );

我正在开发一个日志系统,并期待着实现一次日志方法

我遇到的问题是,如何检索唯一标识符和/或对象签名,以用作哈希键

我的想法是:

var Log = {
    messages : {},
    once : function(message)
    {
        // get unique id and/or passed objects signature, use it as a key
        var key = unique( message );

        if ( !Log.messages.hasOwnProperty(key) )
        {
            Log.messages[key] = message;
        }
    }
};
我尝试了
.toString()
,但对于基本对象,它只返回
[object]
,对于其他任何对象,它只返回
[object]
。没有身份证,什么都没有

我还尝试了
toSource()
函数,但在Chrome中它不想使用基本对象

不过,我需要的是,它能够处理所有类型的对象。无论是字符串、整数还是函数,我都需要得到签名/id

也许已经有这样一个功能的实现了

更新 这意味着要在循环中记录日志,但不是每次迭代都记录日志,而是只记录一次,以防止控制台污染

我的特定循环实际上是一个游戏循环,我希望调试一些信息

比如:

for(变量i=0;i<100;i++)
{
console.log('message');
}
//这将记录100个条目
其中:

for (var i = 0; i < 100; i++)
{
    Log.once('message');
}
// would execute behind the scenes console.log() only once.
for(变量i=0;i<100;i++)
{
Log.one('message');
}
//将只在后台控制台.log()执行一次。

您可以使用
JSON.stringify
获取任意值的“签名”。当然,这不保存对象类型,也不适用于
日期
函数
实例;此外,它不会区分具有相同值的不同对象。如果需要,您需要存储对它们的显式引用(当然会妨碍垃圾收集器释放它们):

如果不想存储对它们的引用,则需要通过添加隐藏属性(就像UID生成器那样)将它们标记为“已记录”:


请注意,此解决方案不适用于基本值,甚至对
null
未定义的
也不起作用-您可能需要混合使用这两种方法。

只是试图防止函数执行一次以上,还是我误读了?或者您是否试图阻止某条
消息被多次记录?在这种情况下,
消息
可以是从字符串到对象的任何内容?或者它仅仅是一个字符串?您可以将数字和字符串推送到一个数组中,但对于
{}!=={}
(函数foo(){})!=(函数foo(){})
。可能与[JavaScript对象Id][1]重复。[1] :在
uniqueId
的循环中,thingy没有帮助,因为每次我调用
Log.once()
,它都会创建一个
新字符串
实例,因此,增加
id
,然后再次记录。
for (var i = 0; i < 100; i++)
{
    Log.once('message');
}
// would execute behind the scenes console.log() only once.
var loggedVals = [];
console.once = function() {
    var args = [].slice.call(arguments).filter(function(arg) {
        return (loggedVals.lastIndexOf(arg)==-1) && loggedVals.push(arg);
    });
    if (args.length)
        console.log.apply(console, args);
});
… function(arg) {
        return !arg.__hasbeenlogged__ && 
          Object.defineProperty(arg, "__hasbeenlogged__", {value: true});
          // configurable, enumarable and writable are implicitly false
    } …