📜  怪诞的意思 - Javascript (1)

📅  最后修改于: 2023-12-03 15:09:55.302000             🧑  作者: Mango

怪诞的 JavaScript

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

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
undefined 和 null

JavaScript 中还有两个特殊的值:undefinednull。它们都表示“无值”,但在一些情况下它们有所不同。

当我们试图访问一个不存在的属性时,返回 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 文档中找到。作为程序员,我们需要理解这些怪诞的特性,并在编写代码时避免它们带来的问题。