这是由语言定义的吗?是否有定义的最大值?在不同的浏览器中是不同的?
我创建了一个JavaScript对象,但是我如何确定该对象的类?
我想要类似于Java的.getClass()方法.
如何使用ES6克隆Javascript类实例.
我对基于jquery或$ extend的解决方案不感兴趣.
我已经看到对对象克隆的相当古老的讨论表明这个问题非常复杂,但是使用ES6可以得到一个非常简单的解决方案 - 我会把它放在下面,看看人们是否认为它是令人满意的.
编辑:建议我的问题是重复的; 我看到了这个答案,但它已经有7年的历史,并且使用前ES6 js涉及非常复杂的答案.我建议我的问题,允许ES6,有一个非常简单的解决方案.
显然,对于我的代码访问对象,必须至少有一个引用它.但我想知道的是,是否有任何其他引用,或者我的代码是唯一访问它的地方.如果没有别的东西引用它,我希望能够删除该对象.
如果您知道答案,则无需阅读本问题的其余部分.以下只是一个让事情更加清晰的例子.
在我的应用程序中,我有一个Repository名为的对象实例contacts,其中包含所有联系人的数组.还有多个Collection对象实例,例如 friends集合和coworkers集合.每个集合都包含一个数组,其中包含一组不同的项目contacts Repository.
为了使这个概念更具体,请考虑下面的代码.Repository对象的每个实例都包含特定类型的所有项的列表.您可能拥有联系人存储库和单独的事件存储库.为了简单起见,您可以获取,添加和删除项目,并通过构造函数添加许多项目.
var Repository = function(items) {
this.items = items || [];
}
Repository.prototype.get = function(id) {
for (var i=0,len=this.items.length; i<len; i++) {
if (items[i].id === id) {
return this.items[i];
}
}
}
Repository.prototype.add = function(item) {
if (toString.call(item) === "[object Array]") { …Run Code Online (Sandbox Code Playgroud) 不保证非数组对象的属性按任何特定顺序进行字符串化.不要依赖于字符串化内同一对象内的属性排序.
我曾希望通过缓存对象的字符串化版本来确定对象是否已更改,然后将其与随后的字符串化对象版本进行比较.这似乎比递归迭代对象并进行比较要简单得多.问题是因为JSON.stringify函数不是确定性的,所以当我对同一个对象进行字符串化时,我可以在技术上得到一个不同的字符串.
我还有其他选择吗?或者我是否必须编写令人讨厌的比较函数来确定对象相等性?
有没有一种可靠的方法来JSON.stringify一个JavaScript对象,保证所有浏览器,node.js等的ceated JSON字符串是相同的,因为Javascript对象是相同的?
我想哈希JS对象
{
signed_data: object_to_sign,
signature: md5(JSON.stringify(object_to_sign) + secret_code)
}
Run Code Online (Sandbox Code Playgroud)
并将它们传递给Web应用程序(例如Python和node.js)和用户,以便用户可以对一个服务进行身份验证,并显示该服务的下一个服务"签名数据",以检查数据是否可信.
但是,我遇到了JSON.stringify在实现中并不是唯一的问题:
有可靠的跨平台stringify方法吗?有没有"正规化的JSON"?
你会推荐其他方法来散列像这样的对象吗?
更新:
这是我用作解决方法的方法:
normalised_json_data = JSON.stringify(object_to_sign)
{
signed_data: normalised_json_data,
signature: md5(normalised_json_data + secret_code)
}
Run Code Online (Sandbox Code Playgroud)
因此,在这种方法中,不是对象本身,而是对其JSON表示(特定于sigining平台)进行签名.这很好用,因为我现在签名的是一个明确的字符串,我可以在检查签名哈希后轻松地JSON.parse数据.
这里的缺点是,如果我将整个{signed_data,signature}对象作为JSON发送,我必须两次调用JSON.parse并且它看起来不太好,因为内部对象被转义:
{"signature": "1c3763890298f5711c8b2ea4eb4c8833", "signed_data": "{\"user_id\":5}"}
Run Code Online (Sandbox Code Playgroud) 根据我对文档的理解(这里和这里),需要引用内存地址才能工作:
const foo = {};
const map = new Map();
map.set(foo,'123'); // Can only be done if memory address of `foo` is known. Any other shimming would require stringification of foo
Run Code Online (Sandbox Code Playgroud)
这是因为JavaScript对象{}键只能是字符串(至少在ES5中).
但是我看到Map垫片可用:https://github.com/zloirock/core-js#map.我尝试阅读源代码,但它过于整齐抽象(内部使用强大的集合,然后再导入10个文件)
请回答以下任何一项
foo以在其上存储一些字符串然后将其用作关键字?javascript ×7
ecmascript-6 ×2
json ×2
node.js ×2
browser ×1
es6-class ×1
hash ×1
math ×1
oop ×1
reference ×1
typescript ×1