访问未定义的对象属性时的Javascript通知

访问未定义的对象属性时的Javascript通知,javascript,compiler-errors,Javascript,Compiler Errors,我觉得Javascript想杀了我。任何静态类型语言(包括FORTRAN)中的编译器都会捕捉到错误,或者在任何合适的动态类型语言中变成运行时异常,这些错误都会被Javascript默默地吞没,耐心地等待在其他地方显示为bug 无论何时我们编写前端代码(现在使用Angular),我们都会花费大部分时间来查找错误,例如编写$scope.result=data.results,而不是data.result。虽然有些工具有帮助,但它仍然需要惊人的工作量 当有人试图读取不存在的对象属性时,是否有办法使Ja

我觉得Javascript想杀了我。任何静态类型语言(包括FORTRAN)中的编译器都会捕捉到错误,或者在任何合适的动态类型语言中变成运行时异常,这些错误都会被Javascript默默地吞没,耐心地等待在其他地方显示为bug

无论何时我们编写前端代码(现在使用Angular),我们都会花费大部分时间来查找错误,例如编写
$scope.result=data.results
,而不是
data.result
。虽然有些工具有帮助,但它仍然需要惊人的工作量


当有人试图读取不存在的对象属性时,是否有办法使Javascript环境(在浏览器中)记录警告?我不想更改语言的语义-访问
数据。结果
仍应返回
未定义
,我只想在控制台上看到一条警告,说“已访问不存在的属性,文件…行…”。

这可能看起来很业余,但是,您可以将所有变量存储在一个可循环的对象(如数组或对象)中,然后循环检查其中是否有未定义的变量,然后打印结果。您可能可以使用带有
key:value
对的词典。但并不理想。

我认为这是这个问题的重复:


简而言之:对于您的用例没有令人满意的解决方案,但是如果您都使用firefox,您可以使用
javascript.options.strict
设置为true以在这种情况下发出警告:)

在ECMAScript 2015中,您可以使用它来执行此操作,例如:

function createObject(obj) {
    const handler = {
        get: function(target, name){
            if (name in target) {
                return target[name];
            } else {
                console.warn("accessing undefined object property: " + name);
                return undefined;
            }
        }
    };
    return new Proxy(obj, handler);
}


let a = createObject({
    b: 1,
    c: undefined
});

a.b;
a.c;
a.d; // accessing not existing object property: d

已尝试
try..catch
?访问对象中不存在的属性不会引发任何异常,它只会返回
未定义的
。我要抓住什么?我总是可以切换到打字脚本。我可能别无选择……我希望这是“自动”完成的,不需要对代码进行重大更改。人们应该像往常一样继续编码。是的,我想这可能是个问题。Firefox!我一定要试试,我真的希望它能奏效!所以我需要用这个代理来包装每个对象(有些是由外部代码创建的,比如Angular)。这还不错!如果Firefox是最简单的解决方案,我将首先尝试Firefox设置。