给出一个示例代码:
var yyy = { abc : 1 },
xxx = yyy.abcc + 1;
这段代码不会抛出任何错误,但是存在一个错字,yyy.abcc应该是yyy.abc,所以因为错别字的存在,xxx现在等于“NaN”。
我使用jslint、jshint检查代码中是否有问题,但是它们无法告诉您abcc是否是一个有效的属性。
是否存在类似jslint或jshint的工具可以检查这个问题呢?
给出一个示例代码:
var yyy = { abc : 1 },
xxx = yyy.abcc + 1;
这段代码不会抛出任何错误,但是存在一个错字,yyy.abcc应该是yyy.abc,所以因为错别字的存在,xxx现在等于“NaN”。
我使用jslint、jshint检查代码中是否有问题,但是它们无法告诉您abcc是否是一个有效的属性。
是否存在类似jslint或jshint的工具可以检查这个问题呢?
处理这些常见的错别字和错误确实是 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
不要把事情复杂化 :) 第一个答案很好,JavaScript中的每个对象都有一个原型,可以通过“if(undefined != yyy.abc)”来检查,这将告诉您“abc”是否存在于变量yyy中,从而证明yyy本身不是未定义的。
abcc
的属性。虽然可能仍有一些工具可以提供至少警告,但我不确定。我建议使用单元测试来查找代码中的此类错误。 - basilikum