当前位置: 首页 > 面试题库 >

有没有办法Object.freeze()一个JavaScript Date?

濮俭
2023-03-14
问题内容

根据MDN Object.freeze()文档:

Object.freeze()
方法冻结对象:即,防止向其添加新属性;防止现有属性被删除;并防止更改现有属性或其可枚举性,可配置性或可写性。本质上,对象实际上是不可变的。该方法返回被冻结的对象。

我期望在某个日期调用冻结会阻止对该日期进行更改,但是它似乎没有用。这是我正在做的(运行Node.js v5.3.0):

let d = new Date()
Object.freeze(d)
d.setTime(0)
console.log(d) // Wed Dec 31 1969 16:00:00 GMT-0800 (PST)

我本以为调用setTime会失败或什么都不做。任何想法如何冻结日期?


问题答案:

有没有办法Object.freeze()一个JavaScript Date?

我不这么认为。但是,您可以 关闭 ,请参阅下面的代码行。但是首先让我们看看为什么Object.freeze不起作用。

我期望在某个日期调用冻结会阻止对该日期进行更改…

它将 如果 Date使用一个对象的属性,以保持其内部时间价值,但事实并非如此。它使用[[DateValue]]
内部插槽
代替。内部插槽不是属性:

内部插槽对应于与对象关联并由各种ECMAScript规范算法使用的内部状态。内部插槽不是对象属性…

因此,冻结对象对其变异[[DateValue]]内部插槽的能力没有任何影响。

无论如何,您 都可以 冻结Date,或有效地冻结它:用no-
op函数(或引发错误的函数)替换其所有mutator方法,然后再替换freeze。但是,正如zzzzBov
(很好!)_所观察到的那样
,这并不能阻止某人这样做(故意绕过冻结的对象,或作为他们使用的一些复杂代码的副产品)。所以 _很近
,但是没有雪茄。
Date.prototype.setTime.call(d, 0)

这是一个示例(我在这里使用ES2015功能,因为我let在您的代码中看到了它,因此您需要使用最新的浏览器来运行它;但这也可以通过仅ES5的功能来完成):

"use strict";



let d = new Date();

freezeDate(d);

d.setTime(0);

snippet.log(d);



function nop() {

}



function freezeDate(d) {

  allNames(d).forEach(name => {

    if (name.startsWith("set") && typeof d[name] === "function") {

      d[name] = nop;

    }

  });

  Object.freeze(d);

  return d;

}

function allNames(obj) {

  var names = Object.create(null); // Or use Map here

  var thisObj;



  for (thisObj = obj; thisObj; thisObj = Object.getPrototypeOf(thisObj)) {

    Object.getOwnPropertyNames(thisObj).forEach(name => {

      names[name] = 1;

    });

  }

  return Object.keys(names);

}


<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->

<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

认为Date开头的所有mutator方法都可以set,但是如果没有的话,可以很容易地对其进行调整。



 类似资料:
  • 我在Kubernetes集群中有一个服务和RabbitMQ。我想做的是,我希望服务的不同实例(或副本)在启动时声明一个全新的队列。这些队列将绑定到同一个exchange。 我可以在这里放一个最后的变量吗: 本质上,我只需要一种方法,用生成的名称创建一个队列,然后使用@RabbitListener侦听这个队列。

  • 问题内容: 假设我有一个使用lambda表达式(闭包)定义的对象列表。有没有一种方法可以检查它们以便进行比较? 我最感兴趣的代码是 完整的代码是 似乎唯一的解决方案是将每个lambda定义为一个字段,并且仅使用这些字段。如果要打印出称为的方法,最好使用。lambda表达式有更好的方法吗? 此外,是否可以打印lambda并获得人类可读的内容?如果你打印而不是 得到类似的东西 甚至使用和方法。 问题答

  • 我使用的界面看起来大致如下: 并且我目前正在使用一个匿名类来实现接口,但我并不关心这两种方法中的一种。大致如下: 现在,我已经在Java8中尽可能地使用新的lambda表达式,我想在这种情况下使用增加的简单性。毕竟,我只是在实现其中的一个方法,但由于接口中有两个方法,所以我不能在一个lambda表达式中使用它。

  • 问题内容: 使用PMD,如果要忽略特定的警告,则可以使该行被忽略。 FindBugs有类似的东西吗? 问题答案: FindBugs的初始方法涉及XML配置文件(也称为过滤器)。这确实不如PMD解决方案方便,但是FindBugs只能在字节码上工作,而不能在源代码上工作,因此注释显然不是一个选择。例: 但是,为解决此问题,FindBugs稍后引入了另一个基于注释的解决方案(请参阅参考资料),您可以在类

  • 我试着检测一个整音符和一个半音符,但对于半音符,我似乎检测不出来,因为它是一个镂空的圆圈。有没有办法检测出镂空的圆圈? 下面是我的代码:

  • 问题在标题中,这里很新,所以还不太了解这个网站。想使用哈希来创建“更多的随机性”,但还不确定Java的数学。Random()还没有,有可能破解它吗?