diff --git a/.prettierignore b/.prettierignore index ed8fcdefd5ad7c..5f0d0ac23fce44 100644 --- a/.prettierignore +++ b/.prettierignore @@ -92,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 diff --git a/files/zh-cn/web/javascript/reference/errors/invalid_array_length/index.md b/files/zh-cn/web/javascript/reference/errors/invalid_array_length/index.md index 8fd53c226b094e..a05508ddad077b 100644 --- a/files/zh-cn/web/javascript/reference/errors/invalid_array_length/index.md +++ b/files/zh-cn/web/javascript/reference/errors/invalid_array_length/index.md @@ -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")}} diff --git a/files/zh-cn/web/javascript/reference/global_objects/error/stack/index.md b/files/zh-cn/web/javascript/reference/global_objects/error/stack/index.md index 71703012d9b1ce..d0795954e3cacb 100644 --- a/files/zh-cn/web/javascript/reference/global_objects/error/stack/index.md +++ b/files/zh-cn/web/javascript/reference/global_objects/error/stack/index.md @@ -22,7 +22,7 @@ slug: Web/JavaScript/Reference/Global_Objects/Error/stack 下面这段 html 代码展示了`stack` 属性的使用方法 ```html - + Stack Trace Example diff --git a/files/zh-cn/web/javascript/reference/global_objects/math/clz32/index.md b/files/zh-cn/web/javascript/reference/global_objects/math/clz32/index.md index 1b27759c7f9965..3232733888740c 100644 --- a/files/zh-cn/web/javascript/reference/global_objects/math/clz32/index.md +++ b/files/zh-cn/web/javascript/reference/global_objects/math/clz32/index.md @@ -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 ``` @@ -51,43 +64,46 @@ Math.clz32(3.5); // 30 先看以下代码: -```plain -var a = 32776; // 00000000000000001000000000001000 (16 个前导 0) -Math.clz32(a); // 16 +```js +const a = 32776; // 00000000000000001000000000001000(16 个前导 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; @@ -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; @@ -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); ``` ## 规范 diff --git a/files/zh-cn/web/javascript/reference/global_objects/number/index.md b/files/zh-cn/web/javascript/reference/global_objects/number/index.md index b8037f51a8feb0..4c370bb40d0091 100644 --- a/files/zh-cn/web/javascript/reference/global_objects/number/index.md +++ b/files/zh-cn/web/javascript/reference/global_objects/number/index.md @@ -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 中实现几乎相同的效果。 diff --git a/files/zh-cn/web/javascript/reference/operators/grouping/index.md b/files/zh-cn/web/javascript/reference/operators/grouping/index.md index ecf5ae26f04bf3..5efa70e606c37f 100644 --- a/files/zh-cn/web/javascript/reference/operators/grouping/index.md +++ b/files/zh-cn/web/javascript/reference/operators/grouping/index.md @@ -11,10 +11,8 @@ slug: Web/JavaScript/Reference/Operators/Grouping ## 语法 -译者:下列语法是 MDN 上已知的最简单的之一。 - -```plain - ( ) +```js-nolint +(expression) ``` ## 说明 @@ -25,21 +23,20 @@ slug: Web/JavaScript/Reference/Operators/Grouping 下面的代码展示了加法运算先于乘法运算的情况。 -```js -var a = 1; -var b = 2; -var c = 3; +```js-nolint +const a = 1; +const b = 2; +const c = 3; -// default precedence +// 默认优先级 a + b * c; // 7 -// evaluated by default like this +// 默认运算顺序同下 a + (b * c); // 7 -// now overriding precedence -// addition before multiplication +// 现在优先考虑乘法之前的加法 (a + b) * c; // 9 -// which is equivalent to +// 这相当于 a * c + b * c; // 9 ``` @@ -51,7 +48,7 @@ a * c + b * c; // 9 {{Compat}} -## 相关链接 +## 参见 - [运算符优先级](/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_precedence) - {{jsxref("Operators/delete", "delete")}} diff --git a/files/zh-cn/web/javascript/reference/operators/logical_or/index.md b/files/zh-cn/web/javascript/reference/operators/logical_or/index.md index 6cb47479863a19..a038eaa35e1427 100644 --- a/files/zh-cn/web/javascript/reference/operators/logical_or/index.md +++ b/files/zh-cn/web/javascript/reference/operators/logical_or/index.md @@ -58,7 +58,7 @@ console.log(B() || A()); 以下表达式看起来等价,但实际上不是,因为 `&&` 运算符比 `||` 运算符先执行(参见[运算符优先级](/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_precedence))。 -```js +```js-nolint true || false && false; // 返回 true,因为 && 先执行 (true || false) && false; // 返回 false,因为分组运算符优先级更高 ```