Skip to content

Commit

Permalink
zh-cn: Format /web/javascript using Prettier (part 5) (#14701)
Browse files Browse the repository at this point in the history
Co-authored-by: Allo <[email protected]>
  • Loading branch information
queengooborg and yin1999 authored Jul 29, 2023
1 parent 320ff75 commit a4e5c12
Show file tree
Hide file tree
Showing 94 changed files with 1,400 additions and 1,282 deletions.
3 changes: 2 additions & 1 deletion .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ build/
/files/ru/learn/server-side/django/introduction/index.md
/files/ru/learn/html/introduction_to_html/the_head_metadata_in_html/index.md
/files/zh-cn/learn/server-side/django/forms/index.md
/files/zh-cn/web/javascript/reference/operators/exponentiation/index.md
/files/zh-cn/web/javascript/reference/operators/exponentiation_assignment/index.md

# A full pass on all Markdown files is being performed.
# The following folders still need a full pass:
Expand Down Expand Up @@ -90,4 +92,3 @@ build/
# zh-cn
/files/zh-cn/web/api/**/*.md
/files/zh-cn/web/css/**/*.md
/files/zh-cn/web/javascript/reference/**/*.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,35 +37,42 @@ RangeError: Invalid array buffer length (Chrome)
```js example-bad
new Array(Math.pow(2, 40));
new Array(-1);
new ArrayBuffer(Math.pow(2, 32));
new ArrayBuffer(Math.pow(2, 32)); // 32 位系统
new ArrayBuffer(-1);

let a = [];
const a = [];
a.length = a.length - 1; // 将 length 属性的值设置为 -1

let b = new Array(Math.pow(2, 32) - 1);
const b = new Array(Math.pow(2, 32) - 1);
b.length = b.length + 1; // 将 length 属性的值设置为 2^32
b.length = 2.5; // 将 length 属性设置为浮点数

const c = new Array(2.5); // 传入浮点数
```

### 正确的示例

```js example-good
[ Math.pow(2, 40) ]; // [ 1099511627776 ]
[ -1 ]; // [ -1 ]
[Math.pow(2, 40)]; // [ 1099511627776 ]
[-1]; // [ -1 ]
new ArrayBuffer(Math.pow(2, 32) - 1);
new ArrayBuffer(Math.pow(2, 33)); // 64-bit systems after Firefox 89
new ArrayBuffer(0);

let a = [];
const a = [];
a.length = Math.max(0, a.length - 1);

let b = new Array(Math.pow(2, 32) - 1);
const b = new Array(Math.pow(2, 32) - 1);
b.length = Math.min(0xffffffff, b.length + 1);

// 0xffffffff 是 2^32 - 1 的 十六进制 表示方式
// 0xffffffff 0xffffffff 是 2^32 - 1 的十六进制表示方式
// 它也可以被写作 (-1 >>> 0)

b.length = 3;

const c = new Array(3);
```

## 相关页面
## 参见

- {{jsxref("Array")}}
- {{jsxref("Array.length")}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ slug: Web/JavaScript/Reference/Global_Objects/Error/stack
下面这段 html 代码展示了`stack` 属性的使用方法

```html
<!DOCTYPE html>
<!doctype html>
<meta charset="UTF-8" />
<title>Stack Trace Example</title>
<body>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,22 @@ Math.clz32 (x)
Math.clz32(1); // 31
Math.clz32(1000); // 22
Math.clz32(); // 32
[NaN, Infinity, -Infinity, 0, -0, null, undefined, "foo", {}, []].filter(function (n) {
return Math.clz32(n) !== 32
}); // []

const stuff = [
NaN,
Infinity,
-Infinity,
0,
-0,
false,
null,
undefined,
"foo",
{},
[],
];
stuff.every((n) => Math.clz32(n) === 32); // true

Math.clz32(true); // 31
Math.clz32(3.5); // 30
```
Expand All @@ -51,43 +64,46 @@ Math.clz32(3.5); // 30

先看以下代码:

```plain
var a = 32776; // 00000000000000001000000000001000 (16 个前导 0)
Math.clz32(a); // 16
```js
const a = 32776; // 0000000000000000100000000000100016 个前导 0
Math.clz32(a); // 16

var b = ~32776; // 11111111111111110111111111110111 (对 32776 取反,0 个前导 0)
Math.clz32(b); // 0 (相当于 0 个前导 1)
const b = ~32776; // 11111111111111110111111111110111对 32776 取反,0 个前导 0
Math.clz32(b); // 0(这与 a 中有多少个前导 0 等价)
```

通过以上方法,`clon` 函数可以定义如下:

```plain
var clz = Math.clz32;
function clon(integer){
return clz(~integer);
```js
const clz = Math.clz32;

function clon(integer) {
return clz(~integer);
}
```

现在,我们可以进一步实现计算“尾随 0”和“尾随 1”的个数了。下面的`ctrz`函数将第一个 1 之后的高数位全部置为 1 然后取反,再用`Math.clz32 求得`尾随 0 的个数。
现在,我们可以进一步实现计算“尾随 0”和“尾随 1”的个数了。下面的 `ctrz` 函数将第一个 1 之后的高数位全部置为 1 然后取反,再用 `Math.clz32` 求得尾随 0 的个数。

```plain
```js
var clz = Math.clz32;
function ctrz(integer){ // 计算尾随 0 个数
// 1. 将第一个 1 之后的高数位全部置为 1
// 00000000000000001000000000001000 => 11111111111111111111111111111000
integer |= integer << 16;
integer |= integer << 8;
integer |= integer << 4;
integer |= integer << 2;
integer |= integer << 1;
// 2. 然后,对该数取反,此时低位的 1 的个数即为所求
return 32 - clz(~integer) |0; // `|0`用于保证结果为整数
function ctrz(integer) {
// 计算尾随 0 个数
// 1. 将第一个 1 之后的高数位全部置为 1
// 00000000000000001000000000001000 => 11111111111111111111111111111000
integer |= integer << 16;
integer |= integer << 8;
integer |= integer << 4;
integer |= integer << 2;
integer |= integer << 1;
// 2. 然后,对该数取反,此时低位的 1 的个数即为所求
return (32 - clz(~integer)) | 0; // `| 0` 用于保证结果为整数
}
function ctron(integer){ // 计算尾随 1 个数
// JavaScript 中没有移位补 1 的运算符
// 所以下面的代码是最快的
return ctrz(~integer);
/* 为了看起来比较对称,你也可以使用以下代码:
function ctron(integer) {
// 计算尾随 1 个数
// JavaScript 中没有移位补 1 的运算符
// 所以下面的代码是最快的
return ctrz(~integer);
/* 为了看起来比较对称,你也可以使用以下代码:
// 1. 将第一个 0 之后的高数位全部置为 0
integer &= (integer << 16) | 0xffff;
integer &= (integer << 8 ) | 0x00ff;
Expand All @@ -102,29 +118,31 @@ function ctron(integer){ // 计算尾随 1 个数

将以上函数改写成 ASM.JS 模块——然后,你就可以去跟别人炫耀了!ASM.JS 就是用来干这个的。

```plain
var countTrailsMethods = (function(stdlib, foreign, heap) {
"use asm";
var clz = stdlib.Math.clz32;
function ctrz(integer) { // 计算尾随 0 个数
integer = integer | 0; // 确保是整数
// 1. 将第一个 1 之后的高数位全部置为 1
// ASMjs 中不允许^=、&=、和 |=
integer = integer | (integer << 16);
integer = integer | (integer << 8);
integer = integer | (integer << 4);
integer = integer | (integer << 2);
integer = integer | (integer << 1);
// 2. 然后,对该数取反,此时低位的 1 的个数即为所求
return 32 - clz(~integer) |0;
}
function ctron(integer) { // 计算尾随 1 个数
integer = integer | 0; // 确保是整数
return ctrz(~integer) |0;
}
// 蛋疼的是,ASM.JS 必须使用糟糕的 object 类型:
// unfourtunately, ASM.JS demands slow crummy objects:
return {a: ctrz, b: ctron};
```js
var countTrailsMethods = (function (stdlib, foreign, heap) {
"use asm";
var clz = stdlib.Math.clz32;
function ctrz(integer) {
// 计算尾随 0 个数
integer = integer | 0; // 确保是整数
// 1. 将第一个 1 之后的高数位全部置为 1
// ASMjs 中不允许^=、&=、和 |=
integer = integer | (integer << 16);
integer = integer | (integer << 8);
integer = integer | (integer << 4);
integer = integer | (integer << 2);
integer = integer | (integer << 1);
// 2. 然后,对该数取反,此时低位的 1 的个数即为所求
return (32 - clz(~integer)) | 0;
}
function ctron(integer) {
// 计算尾随 1 个数
integer = integer | 0; // 确保是整数
return ctrz(~integer) | 0;
}
// 蛋疼的是,ASM.JS 必须使用糟糕的 object 类型:
// unfourtunately, ASM.JS demands slow crummy objects:
return { a: ctrz, b: ctron };
})(window, null, null);
var ctrz = countTrailsMethods.a;
var ctron = countTrailsMethods.b;
Expand All @@ -134,16 +152,17 @@ var ctron = countTrailsMethods.b;

这个 polyfill 效率最高。

```plain
if (!Math.clz32) Math.clz32 = (function(log, LN2){
return function(x) {
var asUint = x >>> 0; // 将 x 转换为 Uint32 类型
if (asUint === 0) {
return 32;
}
return 31 - (log(asUint) / LN2 | 0) |0; // "| 0"相当于 Math.floor
};
})(Math.log, Math.LN2);
```js
if (!Math.clz32)
Math.clz32 = (function (log, LN2) {
return function (x) {
var asUint = x >>> 0; // 将 x 转换为 Uint32 类型
if (asUint === 0) {
return 32;
}
return (31 - ((log(asUint) / LN2) | 0)) | 0; // “| 0”相当于 Math.floor
};
})(Math.log, Math.LN2);
```

## 规范
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ JavaScript 的 `Number` 类型是一个[双精度 64 位二进制格式 IEEE 754
- 不允许使用[数字分隔符](/zh-CN/docs/Web/JavaScript/Reference/Lexical_grammar#numeric_separators)
- [BigInt](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/BigInt) 抛出 {{jsxref("TypeError")}},以防止意外的强制隐式转换损失精度。
- [Symbol](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol) 抛出 {{jsxref("TypeError")}}。
- 对象首先按顺序调用 [`@@toPrimitive]()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive)(将 `"number"` 作为 hint)、`valueOf()``toString()` 方法将其[转换为原始值](/zh-CN/docs/Web/JavaScript/Data_structures#强制原始值转换)。然后将生成的原始值转换为数值。
- 对象首先按顺序调用 [`[@@toPrimitive]()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive)(将 `"number"` 作为 hint)、`valueOf()``toString()` 方法将其[转换为原始值](/zh-CN/docs/Web/JavaScript/Data_structures#强制原始值转换)。然后将生成的原始值转换为数值。

有两种方法可以在 JavaScript 中实现几乎相同的效果。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ console.log(uint8.length); // 2
console.log(uint8.BYTES_PER_ELEMENT); // 1

// 来自数组
var arr = new Uint8Array([21,31]);
var arr = new Uint8Array([21, 31]);
console.log(arr[1]); // 31

// 来自另一个 TypedArray
Expand All @@ -133,7 +133,9 @@ var buffer = new ArrayBuffer(8);
var z = new Uint8Array(buffer, 1, 4);

// 来自一个迭代器
var iterable = function*(){ yield* [1,2,3]; }();
var iterable = (function* () {
yield* [1, 2, 3];
})();
var uint8 = new Uint8Array(iterable);
// Uint8Array[1, 2, 3]
```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ console.log(uintc8.length); // 2
console.log(uintc8.BYTES_PER_ELEMENT); // 1

// From an array
var arr = new Uint8ClampedArray([21,31]);
var arr = new Uint8ClampedArray([21, 31]);
console.log(arr[1]); // 31

// From another TypedArray
Expand All @@ -136,7 +136,9 @@ var buffer = new ArrayBuffer(8);
var z = new Uint8ClampedArray(buffer, 1, 4);

// From an iterable
var iterable = function*(){ yield* [1,2,3]; }();
var iterable = (function* () {
yield* [1, 2, 3];
})();
var uintc8 = new Uint8ClampedArray(iterable);
// Uint8ClampedArray[1, 2, 3]
```
Expand Down
Loading

0 comments on commit a4e5c12

Please sign in to comment.