给出一个示例代码:
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 compiler 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”是否存在var yyy 证明 yyy 本身不是未定义的。