Javascript ES6的好处反映了API

Javascript ES6的好处反映了API,javascript,ecmascript-6,Javascript,Ecmascript 6,我一直在努力升级一些代码以使用ES6语法。我有以下代码行: 删除此项。\u foo 我的linter建议使用: Reflect.deleteProperty(这是“ufoo”) 您可以找到此方法的文档 MDN文档说明: Reflect.deleteProperty方法允许您删除上的属性 物体。它返回一个布尔值,指示属性 已成功删除。它几乎与非严格的 删除运算符 我知道delete关键字不会返回表示成功的值,但它的详细程度要低得多 如果我不依赖于delete的成功/失败,是否有任何理由支持Refl

我一直在努力升级一些代码以使用ES6语法。我有以下代码行:

删除此项。\u foo

我的linter建议使用:

Reflect.deleteProperty(这是“ufoo”)

您可以找到此方法的文档

MDN文档说明:

Reflect.deleteProperty方法允许您删除上的属性 物体。它返回一个布尔值,指示属性 已成功删除。它几乎与非严格的 删除运算符

我知道
delete
关键字不会返回表示成功的值,但它的详细程度要低得多

如果我不依赖于
delete
的成功/失败,是否有任何理由支持
Reflect.deleteProperty
delete
不严格是什么意思


我觉得
Reflect
API的许多用例都是为了解决异常情况和/或提供更好的条件流,但代价是语句更加冗长。如果我目前的使用没有遇到任何问题,我想知道使用
Reflect
API是否有任何好处。

Reflect
API暴露了隐藏在常见JavaScript习惯用法后面的抽象操作它的主要用途是提供合理的方法来转发在
代理上调用的操作
陷阱
。所有
Reflect
方法都匹配同名代理陷阱的签名,因此您可以使用
newproxy(target,Reflect)
创建行为与
target
对象相同的对象-所有内容都将被转发,包括特殊的JavaScript怪癖

这对于getter和原型尤其重要,因为

如果遇到getter,则为调用target提供的
this

考虑以下代码:

var target = {
    get foo() {
        return this.bar;
    },
    bar: 3
};
var handler = {
    get(target, propertyKey, receiver) {
        if (propertyKey === 'bar') return 2;

        console.log(Reflect.get(target, propertyKey, receiver)); // this in foo getter references Proxy instance; logs 2
        console.log(target[propertyKey]); // this in foo getter references "target" - logs 3
    }
};
var obj = new Proxy(target, handler);
当您编写
代理
时,您希望它能完全覆盖目标对象——没有
反射
,就没有惯用的方法来实现这一点


此外,将运算符用作函数对于函数式编程来说很方便。

我想说不,使用
deleteProperty()
似乎没有任何其他好处。如果您不需要知道删除是否成功,只需使用
delete
就可以了。
delete
如果属性是自己的不可配置属性,我猜是
deleteProperty()
不会在linter建议的这种情况下抛出错误?@Bergi ESLint的prefer reflect规则:当然,这是选择性加入,不足以实现潜在用例。只是好奇我是应该尊重它还是让它安静下来。许多与对象和属性的构造有关的方法都被添加到了新的
Reflect
API中。即使
Reflect.deleteProperty()
不会引发错误,它也不会删除不可配置的属性。新代理(目标,Reflect)中不需要Reflect。要创建行为类似于目标对象的代理,可以传递一个空的处理程序。根据文档:“所有陷阱都是可选的。如果尚未定义陷阱,默认行为是将操作转发到目标。”