相关疑难解决方法(0)

什么是JavaScript的最高整数值,数字可以达到而不会丢失精度?

这是由语言定义的吗?是否有定义的最大值?在不同的浏览器中是不同的?

javascript browser math cross-browser

923
推荐指数
13
解决办法
48万
查看次数

如何获得JavaScript对象的类?

我创建了一个JavaScript对象,但是我如何确定该对象的类?

我想要类似于Java的.getClass()方法.

javascript oop

665
推荐指数
11
解决办法
62万
查看次数

如何克隆javascript ES6类实例

如何使用ES6克隆Javascript类实例.

我对基于jquery或$ extend的解决方案不感兴趣.

我已经看到对对象克隆的相当古老的讨论表明这个问题非常复杂,但是使用ES6可以得到一个非常简单的解决方案 - 我会把它放在下面,看看人们是否认为它是令人满意的.

编辑:建议我的问题是重复的; 我看到了这个答案,但它已经有7年的历史,并且使用前ES6 js涉及非常复杂的答案.我建议我的问题,允许ES6,有一个非常简单的解决方案.

javascript node.js ecmascript-6 es6-class

70
推荐指数
4
解决办法
2万
查看次数

如何获取javascript对象引用或引用计数?

如何获取对象的引用计数

  • 是否可以确定javascript对象是否有多个引用
  • 或者如果它除了我正在访问它的那个之外还有引用?
  • 或者甚至只是为了获得引用计数本身?
  • 我可以从javascript本身找到这些信息,还是需要跟踪我自己的参考计数器.

显然,对于我的代码访问对象,必须至少有一个引用它.但我想知道的是,是否有任何其他引用,或者我的代码是唯一访问它的地方.如果没有别的东西引用它,我希望能够删除该对象.

如果您知道答案,则无需阅读本问题的其余部分.以下只是一个让事情更加清晰的例子.


用例

在我的应用程序中,我有一个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)

javascript garbage-collection reference

54
推荐指数
1
解决办法
2万
查看次数

如何确定性地验证JSON对象是否未被修改?

根据JSON.stringify的MDN文档:

不保证非数组对象的属性按任何特定顺序进行字符串化.不要依赖于字符串化内同一对象内的属性排序.

我曾希望通过缓存对象的字符串化版本来确定对象是否已更改,然后将其与随后的字符串化对象版本进行比较.这似乎比递归迭代对象并进行比较要简单得多.问题是因为JSON.stringify函数不是确定性的,所以当我对同一个对象进行字符串化时,我可以在技术上得到一个不同的字符串.

我还有其他选择吗?或者我是否必须编写令人讨厌的比较函数来确定对象相等性?

javascript json

37
推荐指数
3
解决办法
9084
查看次数

如何可靠地散列JavaScript对象?

有没有一种可靠的方法来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在实现中并不是唯一的问题:

  • 在node.js/V8中,JSON.stringify返回没有不必要的空格的JSON字符串,例如"{"user_id":3}.
  • Python的simplejson.dumps留下了一些空格,例如'{"user_id":3}'
  • 可能其他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)

javascript hash json node.js

28
推荐指数
5
解决办法
4万
查看次数

ES6 Map如何工作

根据我对文档的理解(这里这里),需要引用内存地址才能工作:

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 typescript ecmascript-6

14
推荐指数
2
解决办法
1583
查看次数