有没有工具可以检查JavaScript属性是否存在?

4

给出一个示例代码:

var yyy = { abc : 1 },
    xxx = yyy.abcc + 1;

这段代码不会抛出任何错误,但是存在一个错字,yyy.abcc应该是yyy.abc,所以因为错别字的存在,xxx现在等于“NaN”。

我使用jslint、jshint检查代码中是否有问题,但是它们无法告诉您abcc是否是一个有效的属性。

是否存在类似jslint或jshint的工具可以检查这个问题呢?


1
"if (undefined != yyy.abc)" 应该可以完成任务吧?或者是 "if (NaN != ParseInt(yyy.abc))"。 - Ricola3D
2
@Ricola3D:但那不是一个工具 ;) - Felix Kling
1
不确定有什么工具,但如果您使用TypeScript,编译器肯定会抛出错误。所有的JavaScript都与TypeScript兼容,所以您可以直接复制粘贴您的代码。 - Arun
@Arun 谢谢!它确实能够检查问题,但这意味着我可能需要将我的代码转换为TypeScript才能享受全部功能。因为仅仅复制并粘贴我的JavaScript代码到TypeScript中进行检查,它无法检查依赖项(例如,如果我的代码使用jQuery,则会出现错误TS2095:找不到符号“$”)。 - forestclown
1
使用工具测试这个真的很难,因为你可能已经修改了对象原型以拥有一个名为 abcc 的属性。虽然可能仍有一些工具可以提供至少警告,但我不确定。我建议使用单元测试来查找代码中的此类错误。 - basilikum
2个回答

0

处理这些常见的错别字和错误确实是 Javascript 生态系统中一个巨大的空缺,我希望更多的人关心。事实上,这个问题在八年前被提出来,现在仍然没有得到一个好的答案,这是一个巨大的问题。

我看了一堆 Javascript 工具,唯一一个我发现可以在你的情况下有点用的是 Typescript 编译器 tsc

不幸的是,由于 Javascript 映射的动态特性,它并不能像你写的那样严格处理你的情况,因为映射没有严格的属性可以被强制执行,即使是编译器也无法做到。但是,如果你使用一个适当的 Javascript 类,它确实可以工作,而且你真的应该为其他类提供的好处而这么做。

例如,如果我将你的代码重写为:

class MyClass {
    constructor() {
        this.abc = 1;
    }
}

var yyy = new MyClass();
var xxx = yyy.abcc + 1;

将其放入文件test.js中,然后创建一个Typescript配置文件tsconfig.json文件,其中包含(主要是从tsc --init的默认输出):

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "allowJs": true,
    "checkJs": true,
    "outDir": "./dist",
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": [
    "test.js"
  ]
}

然后执行:

tsc --build tsconfig.json

它正确地输出了错误:

test.js:11:15 - error TS2551: Property 'abcc' does not exist on type 'MyClass'. Did you mean 'abc'?

11 var xxx = yyy.abcc + 1;
                 ~~~~

  test.js:6:9
    6         this.abc = 1;
              ~~~~~~~~~~~~
    'abc' is declared here.


Found 1 error.

更好的是,它提供了一个有用的解决方案,这在编译器中很少见。
要安装tsc和它依赖的类型定义,您可以运行以下命令:
sudo npm install typescript -g
npm install @types/node --save-dev

0

不要把事情复杂化 :) 第一个答案很好,JavaScript中的每个对象都有一个原型,可以通过“if(undefined != yyy.abc)”来检查,这将告诉您“abc”是否存在于变量yyy中,从而证明yyy本身不是未定义的。


1
我假设我们不会在每个出现的地方都检查yyy.abc吧?比如说yyy.abc在代码的不同区域被频繁使用,我们只在主要区域检查( undefined != yyy.abc )而不是每个出现的地方都检查吗?如果不是这样,那么每个变量都需要进行很多次检查。 - forestclown
嗯,我不知道你的代码,无法回答这个问题 :),但通常情况下,如果是这种情况,那么可能需要进行一些重构。但是只有看到代码,我才能回答这个问题 :) - CarlosB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接