📅  最后修改于: 2023-12-03 15:09:55.302000             🧑  作者: Mango
JavaScript 是最受欢迎的编程语言之一,它被用于编写 Web 应用、桌面应用、移动应用、游戏等等。但在 JavaScript 中有一些令人哭笑不得的怪诞行为,让人感到有些懵逼。让我们来探索一些最怪异的 JavaScript 特性。
相等运算符 ==
和恒等运算符 ===
是 JavaScript 中最令人困惑的部分之一。考虑下面的例子:
console.log(1 == '1'); // true
console.log(1 === '1'); // false
尽管 1
和 '1'
不是相同的类型,第一个例子使用双等号时会自动将它们转换为相同的类型,结果返回 true
。而使用三个等号时,它们不会被转换,结果返回 false
。
另一个令人惊讶的例子:
console.log('' == false); // true
console.log('' === false); // false
空字符串 ''
被认为是 falsy 值,因此当使用双等号与 false
进行比较时返回 true
。然而,当使用恒等运算符时,它们被视为不同的类型,返回 false
。
NaN
是一个特殊的数字值,表示“不是数字”。它通常会在我们试图将一个无法被识别为数字的值转换为数字时出现,例如:
console.log(parseInt('abc')); // NaN
NaN
与自己不相等:
console.log(NaN == NaN); // false
console.log(NaN === NaN); // false
这是因为 NaN
被认为是一个“无法比较”的值。
要检查一个值是否是 NaN
,可以使用 isNaN()
函数:
console.log(isNaN(NaN)); // true
console.log(isNaN('abc')); // true
console.log(isNaN(123)); // false
JavaScript 中还有两个特殊的值:undefined
和 null
。它们都表示“无值”,但在一些情况下它们有所不同。
当我们试图访问一个不存在的属性时,返回 undefined
:
const obj = { name: 'Alice' };
console.log(obj.age); // undefined
undefined
表示变量声明了但没有赋值:
let x;
console.log(x); // undefined
null
表示变量明确地被赋予了一个空值:
const y = null;
console.log(y); // null
注意:当使用 typeof
运算符时,null
会被认为是一个对象(这是一个历史遗留问题):
console.log(typeof null); // object
JavaScript 中有一些奇怪的运算符和关键字,它们很容易让人迷惑。以下是一些例子:
delete
运算符可以用于删除对象的属性:
const obj = { name: 'Alice' };
delete obj.name;
console.log(obj); // {}
注意:使用 delete
运算符无法删除对象的属性,例如:
const obj = { name: 'Alice' };
Object.defineProperty(obj, 'age', { value: 21 });
delete obj.age;
console.log(obj.age); // 21
typeof
运算符可以用于检测值的类型:
console.log(typeof 123); // number
console.log(typeof 'abc'); // string
console.log(typeof true); // boolean
console.log(typeof { name: 'Alice' }); // object
console.log(typeof undefined); // undefined
void
运算符可以用于让表达式返回 undefined
:
const x = void 0;
console.log(x); // undefined
with
关键字可以用于创建一个新的作用域链:
const obj = { x: 1 };
with (obj) {
console.log(x); // 1
}
注意:使用 with
可能会导致性能问题和安全问题,因此不建议使用它。
JavaScript 中有许多奇怪的特性,我们只讲述了其中的一部分,更多的内容可以在维基百科和 JavaScript 文档中找到。作为程序员,我们需要理解这些怪诞的特性,并在编写代码时避免它们带来的问题。