【问题标题】:How to limit the usage of "===" operator in javascript for specific object property如何在特定对象属性的javascript中限制“===”运算符的使用
【发布时间】:2021-05-12 02:32:11
【问题描述】:

例如,以下两个 javascript 对象的属性包括“name”、“age”和“phoneNumber”。

const personA = {
   name: Andy,
   age: "24",
   phoneNumber: "28173516374"
}
const personB = {
   name: "Amy",
   age: 25,
   phoneNumber: "+85 28173516374"
}

对于属性“phoneNumber”,我不希望其他人将它与运算符“===”一起使用以与其他字符串(如personA.phoneNumber === personB.phoneNumber)进行比较,因为对于 phoneNumber 的值,它应该与或没有前置国家代码。对于其他没有这方面知识背景的开发者,他们可能会使用=== 来比较两个变量与电话号码的值,这会产生一些错误。

所以我需要一种方法来限制 === 在特定属性上的使用。我想出了几个解决方案,但它们或多或少都有缺点。

解决方案1:将代表电话号码的所有属性的类型从string转换为类PhoneNumber,该类将处理所有比较和值格式。但是,我必须使用new 来创建该对象,并且应该修改很多地方。因为这个属性在我的项目中无处不在。尝试了几次后,我放弃了这个解决方案。

解决方案2:使用通用函数比较两个电话号码。正如我之前所说,并非所有开发人员和审阅者都知道该功能。即使我在文件中提到它,仍然有人忘记它。

现在我正在尝试开发一个 eslint 规则来限制 === 在特定属性上的使用。你有其他想法吗?

【问题讨论】:

  • 可能不会,这真的很奇怪。那么,如何才能访问这样的财产呢?
  • 不,这是不可能的。 What's up with comparison operators today?
  • 例如,一个对象有一个名为phoneNumber的属性。众所周知,前面加或不加国家代码的两个电话号码是一样的,所以不能简单的跟===比较。我们应该调用一个函数来进行比较。但是,我无法确定其他人是否具备这些背景知识。
  • 您可能希望为此创建一个类并为其提供类似于 checkPhoneNumberMatches 方法的内容。
  • 有没有你的项目有这样一个比较电话号码的功能?

标签: javascript typescript ecmascript-6


【解决方案1】:

对不起我的英语不好。

如果任务是控制谁可以读取字段值,谁不能,那么这可以通过多种方式解决。

  1. 如果您可以更改 Object 的结构,那么 getter 和 setter 适合您。 MDN: GetterMDN: Setter

简化的示例解决方案如下所示:

{
    let admin;
    const personA = {

        age: "24",
        sex: "man",

        privateName: "Jhon",
        get name() {

            return (admin === true ? this.privateName : "***");
        },
        set name(v) {
            return (admin === true ? this.privateName = v : "***")

        }
    }
  admin = false;
    personA.name = "Mary"
    console.log(personA.name)
  
    admin = true;
    console.log(personA.name)
    personA.name = "Mary"
    console.log(personA.name)
}
我们可以返回异常,而不是输出 ***。
  1. 如果你不能改变结构,那么同样可以使用代理来完成。 MDN: Proxy

  2. 如果您不能使用代理,那么您可以使用以下方法更改对象属性的行为 对象.定义属性。也就是说,在已经存在的对象上设置相同的 getter 和 setter。 MDN: Object.defineProperty

【讨论】:

  • 感谢您的回答。这不能解决我的痛点。我只想控制=== 对特定属性的使用
猜你喜欢
  • 1970-01-01
  • 2015-06-09
  • 2017-08-18
  • 2010-11-23
  • 2021-07-07
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
相关资源
最近更新 更多