gpt4 book ai didi

javascript - 唯一 ID 或对象签名

转载 作者:行者123 更新时间:2023-11-29 20:01:57 33 4
gpt4 key购买 nike

我正在开发一个日志系统,并期待实现一个log once方法。

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

我的想法是:

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]对于基本对象,[object <type>]对于其他任何事情。没有 ID,什么都没有。

我也尝试了 toSource()函数,但在 Chrome 中它不想处理基本对象。

不过,我需要的是让它适用于每种类型的对象。无论是字符串、整数还是函数,我都需要获得该签名/ID。

也许已经在某个地方实现了这样的功能?

更新

这是为了循环记录日志,但不是每次迭代都记录,而是只记录一次以防止控制台污染。

我的特定循环实际上是一个游戏循环,我正在寻找调试一些信息。

喜欢:

for (var i = 0; i < 100; i++)
{
console.log('message');
}
// this would log 100 entries

地点:

for (var i = 0; i < 100; i++)
{
Log.once('message');
}
// would execute behind the scenes console.log() only once.

最佳答案

您可以使用 JSON.stringify 获取任意值的“签名”。当然这不会保存对象类型,并且不适用于 DateFunction 实例;它也不区分具有相同值的不同对象。如果你想要那样,你将需要存储对它们的显式引用(当然会阻止垃圾收集器释放它们):

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);
});

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

… function(arg) {
return !arg.__hasbeenlogged__ &&
Object.defineProperty(arg, "__hasbeenlogged__", {value: true});
// configurable, enumarable and writable are implicitly false
} …

请注意,此解决方案不适用于原始值,甚至无法用于 nullundefined - 您可能需要混合使用这两种方法。

关于javascript - 唯一 ID 或对象签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13941933/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com