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
} …