mirror of
https://git.proxmox.com/git/pve-eslint
synced 2025-10-05 20:24:05 +00:00

includes a (minimal) working wrapper Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
80 lines
2.7 KiB
Markdown
80 lines
2.7 KiB
Markdown
# Disallow Use of `undefined` Variable (no-undefined)
|
||
|
||
The `undefined` variable in JavaScript is actually a property of the global object. As such, in ECMAScript 3 it was possible to overwrite the value of `undefined`. While ECMAScript 5 disallows overwriting `undefined`, it's still possible to shadow `undefined`, such as:
|
||
|
||
```js
|
||
function doSomething(data) {
|
||
var undefined = "hi";
|
||
|
||
// doesn't do what you think it does
|
||
if (data === undefined) {
|
||
// ...
|
||
}
|
||
|
||
}
|
||
```
|
||
|
||
Because `undefined` can be overwritten or shadowed, reading `undefined` can give an unexpected value. (This is not the case for `null`, which is a keyword that always produces the same value.) To guard against this, you can avoid all uses of `undefined`, which is what some style guides recommend and what this rule enforces. Those style guides then also recommend:
|
||
|
||
* Variables that should be `undefined` are simply left uninitialized. (All uninitialized variables automatically get the value of `undefined` in JavaScript.)
|
||
* Checking if a value is `undefined` should be done with `typeof`.
|
||
* Using the `void` operator to generate the value of `undefined` if necessary.
|
||
|
||
As an alternative, you can use the [no-global-assign](no-global-assign.md) and [no-shadow-restricted-names](no-shadow-restricted-names.md) rules to prevent `undefined` from being shadowed or assigned a different value. This ensures that `undefined` will always hold its original, expected value.
|
||
|
||
|
||
## Rule Details
|
||
|
||
This rule aims to eliminate the use of `undefined`, and as such, generates a warning whenever it is used.
|
||
|
||
Examples of **incorrect** code for this rule:
|
||
|
||
```js
|
||
/*eslint no-undefined: "error"*/
|
||
|
||
var foo = undefined;
|
||
|
||
var undefined = "foo";
|
||
|
||
if (foo === undefined) {
|
||
// ...
|
||
}
|
||
|
||
function foo(undefined) {
|
||
// ...
|
||
}
|
||
```
|
||
|
||
Examples of **correct** code for this rule:
|
||
|
||
```js
|
||
/*eslint no-undefined: "error"*/
|
||
|
||
var foo = void 0;
|
||
|
||
var Undefined = "foo";
|
||
|
||
if (typeof foo === "undefined") {
|
||
// ...
|
||
}
|
||
|
||
global.undefined = "foo";
|
||
```
|
||
|
||
## When Not To Use It
|
||
|
||
If you want to allow the use of `undefined` in your code, then you can safely turn this rule off.
|
||
|
||
## Further Reading
|
||
|
||
* [undefined - JavaScript \| MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined)
|
||
* [Understanding JavaScript’s ‘undefined’ \| JavaScript, JavaScript...](https://javascriptweblog.wordpress.com/2010/08/16/understanding-undefined-and-preventing-referenceerrors/)
|
||
* [ECMA262 edition 5.1 §15.1.1.3: undefined](https://es5.github.io/#x15.1.1.3)
|
||
|
||
## Related Rules
|
||
|
||
* [no-undef-init](no-undef-init.md)
|
||
* [no-void](no-void.md)
|
||
* [no-shadow-restricted-names](no-shadow-restricted-names.md)
|
||
* [no-global-assign](no-global-assign.md)
|