Skip to content

Commit

Permalink
[zh-cn]: update the translation of global_objects/nan (#23464)
Browse files Browse the repository at this point in the history
Co-authored-by: A1lo <[email protected]>
  • Loading branch information
tianyeeT and yin1999 authored Sep 9, 2024
1 parent 71cd8dd commit e7b8882
Showing 1 changed file with 29 additions and 13 deletions.
42 changes: 29 additions & 13 deletions files/zh-cn/web/javascript/reference/global_objects/nan/index.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,27 @@
---
title: NaN
slug: Web/JavaScript/Reference/Global_Objects/NaN
l10n:
sourceCommit: 915c9519f3cca1c616c2f554d5ad9e1483bbb170
---

{{jsSidebar("Objects")}}

全局属性 **`NaN`** 是一个表示非数字的值。

{{js_property_attributes(0, 0, 0)}}

{{EmbedInteractiveExample("pages/js/globalprops-nan.html")}}

##

其与 {{jsxref("Number.NaN")}} 的值相同。

{{js_property_attributes(0, 0, 0)}}

## 描述

`NaN`*全局对象*的一个属性。换句话说,它是全局作用域中的一个变量。
`NaN` *全局对象*的一个属性。换句话说,它是全局作用域中的一个变量。

`NaN` 的初始值不是数字——与 {{jsxref("Number.NaN")}} 的值相同。在现代浏览器中,`NaN` 是一个不可配置、不可写的属性。即使不是这样,也要避免重写它。在程序中很少使用 `NaN`
在现代浏览器中,`NaN` 是一个不可配置、不可写的属性。即使不是这样,也要避免重写它。

有五种不同类型的操作返回 `NaN`

Expand All @@ -27,8 +33,8 @@ slug: Web/JavaScript/Reference/Global_Objects/NaN

`NaN` 及其行为不是 JavaScript 发明的。它在浮点运算中的语义(包括 `NaN !== NaN`)是由 [IEEE 754](https://zh.wikipedia.org/wiki/雙精度浮點數) 指定的。`NaN` 的行为包括:

- 如果 `NaN` 涉及数学运算(但不涉及[位运算](/zh-CN/docs/Web/JavaScript/Reference/Operators#位移运算符)),结果通常也是 `NaN`。(参见下面的[反例](#默默逃离_nan)。)
-`NaN` 是任何关系比较(`>`, `<`, `>=`, `<=`)的操作数之一时,结果总是 `false`
- 如果 `NaN` 涉及数学运算(但不涉及[位运算](/zh-CN/docs/Web/JavaScript/Reference/Operators#位移运算符)),结果通常也是 `NaN`。(参见下面的[反例](#静默逃逸的_nan_值)。)
-`NaN` 是任何关系比较(`>``<``>=``<=`)的操作数之一时,结果总是 `false`
- `NaN` 不等于(通过 [`==`](/zh-CN/docs/Web/JavaScript/Reference/Operators/Equality)[`!=`](/zh-CN/docs/Web/JavaScript/Reference/Operators/Inequality)[`===`](/zh-CN/docs/Web/JavaScript/Reference/Operators/Strict_equality)[`!==`](/zh-CN/docs/Web/JavaScript/Reference/Operators/Strict_inequality))任何其他值——包括与另一个 `NaN` 值。

`NaN` 也是 JavaScript 中的[](/zh-CN/docs/Glossary/Falsy)值之一。
Expand Down Expand Up @@ -75,31 +81,41 @@ const arr = [2, 4, NaN, 12];
arr.indexOf(NaN); // -1
arr.includes(NaN); // true

// Methods accepting a properly defined predicate can always find NaN
// 接受正确定义的断言的方法总是能够找到 NaN
arr.findIndex((n) => Number.isNaN(n)); // 2
```

有关 `NaN` 及其比较的更多信息,请参阅[相等性判断](/zh-CN/docs/Web/JavaScript/Equality_comparisons_and_sameness)

### 明显不同的 NaN 值

这是 `NaN` 与自身不平等的动机。可以用不同的二进制表示生成两个都是 `NaN` 的浮点数,因为在 [IEEE 754 编码](https://zh.wikipedia.org/wiki/NaN#浮点数)中,任何指数为 `0x7ff` 且尾数非零的浮点数都是 `NaN`。在 JavaScript 中,你可以使用[类型化数组](/zh-CN/docs/Web/JavaScript/Typed_arrays)来进行位操作。
可以用不同的二进制表示生成两个都是 `NaN` 的浮点数,这是因为在 [IEEE 754 编码](https://zh.wikipedia.org/wiki/NaN#浮点数)中,任何指数为 `0x7ff` 且尾数非零的浮点数都是 `NaN`。在 JavaScript 中,你可以使用[类型化数组](/zh-CN/docs/Web/JavaScript/Typed_arrays)来进行位操作。

```js
const f2b = (x) => new Uint8Array(new Float64Array([x]).buffer);
const b2f = (x) => new Float64Array(x.buffer)[0];
// Get a byte representation of NaN
// 获取 NaN 的字节表示
const n = f2b(NaN);
// Change the first bit, which is the sign bit and doesn't matter for NaN
n[0] = 1;
const m = f2b(NaN);
// 更改符号位,对于 NaN 而言,这个比特位不重要。
n[7] += 2 ** 7;
// n[0] += 2**7; 对于大端处理器
const nan2 = b2f(n);
console.log(nan2); // NaN
console.log(Object.is(nan2, NaN)); // true
console.log(f2b(NaN)); // Uint8Array(8) [0, 0, 0, 0, 0, 0, 248, 127]
console.log(f2b(nan2)); // Uint8Array(8) [1, 0, 0, 0, 0, 0, 248, 127]
console.log(f2b(nan2)); // Uint8Array(8) [0, 0, 0, 0, 0, 0, 248, 255]
// 更改第一个比特位,即符号位,对于 NaN 而言,这个比特位不重要。
m[0] = 1;
// m[7] = 1; 对于大端处理器
const nan3 = b2f(m);
console.log(nan3); // NaN
console.log(Object.is(nan3, NaN)); // true
console.log(f2b(NaN)); // Uint8Array(8) [0, 0, 0, 0, 0, 0, 248, 127]
console.log(f2b(nan3)); // Uint8Array(8) [1, 0, 0, 0, 0, 0, 248, 127]
```

### 默默逃离 NaN
### 静默逃逸的 NaN

`NaN` 通过数学运算进行传播,因此通常在计算结束时测试 `NaN` 一次就足以检测错误条件。`NaN` 被静默转义的唯一情况是使用指数为 `0` [求幂](/zh-CN/docs/Web/JavaScript/Reference/Operators/Exponentiation)时,它立即返回 `1` 而不测试基数的值。

Expand Down

0 comments on commit e7b8882

Please sign in to comment.