From 8bf0e77b0000034533bc68444c28eadadcf51309 Mon Sep 17 00:00:00 2001 From: erniu <25457788@qq.com> Date: Thu, 12 May 2016 18:02:05 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E7=AC=94=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/number.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/number.md b/docs/number.md index 1080ee5..7a34dc8 100644 --- a/docs/number.md +++ b/docs/number.md @@ -24,7 +24,7 @@ ES6提供了二进制和八进制数值的新的写法,分别用前缀`0b`( })() // Uncaught SyntaxError: Octal literals are not allowed in strict mode. ``` -如果要将`0b`和`0x`前缀的字符串数值转为十进制,要使用`Number`方法。 +如果要将`0b`和`0o`前缀的字符串数值转为十进制,要使用`Number`方法。 ```javascript Number('0b111') // 7 From e448091da7f44709d22d2177a70dd7af344b86c2 Mon Sep 17 00:00:00 2001 From: Xcat Liu Date: Fri, 13 May 2016 15:57:54 +0800 Subject: [PATCH 2/6] Adding code padding Adding padding-left to code --- css/app.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/css/app.css b/css/app.css index cb9528a..a582ecc 100644 --- a/css/app.css +++ b/css/app.css @@ -166,7 +166,8 @@ input.searchButton { } #content code { - padding-right: 5px; + padding-left: 3px; + padding-right: 3px; color: #a6e22e; font-size: 0.7rem; From 78112e85b0f0d11e066c6c2a171f935c119ab23a Mon Sep 17 00:00:00 2001 From: Xcat Liu Date: Fri, 13 May 2016 16:17:59 +0800 Subject: [PATCH 3/6] Fix some code syntax problem in docs/let.md Followed the previous coding style, added some `;` and space to the code. --- docs/let.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/let.md b/docs/let.md index 6ceb940..1abe059 100644 --- a/docs/let.md +++ b/docs/let.md @@ -21,9 +21,9 @@ b // 1 `for`循环的计数器,就很合适使用let命令。 ```javascript -for(let i = 0; i < arr.length; i++){} +for (let i = 0; i < arr.length; i++) {} -console.log(i) +console.log(i); //ReferenceError: i is not defined ``` @@ -189,14 +189,14 @@ ES5只有全局作用域和函数作用域,没有块级作用域,这带来 ```javascript var tmp = new Date(); -function f(){ +function f() { console.log(tmp); - if (false){ + if (false) { var tmp = "hello world"; } } -f() // undefined +f(); // undefined ``` 上面代码中,函数f执行后,输出结果为`undefined`,原因在于变量提升,导致内层的tmp变量覆盖了外层的tmp变量。 @@ -206,7 +206,7 @@ f() // undefined ```javascript var s = 'hello'; -for (var i = 0; i < s.length; i++){ +for (var i = 0; i < s.length; i++) { console.log(s[i]); } @@ -251,7 +251,7 @@ ES6允许块级作用域的任意嵌套。 ```javascript {{{{ let insane = 'Hello World'; - {let insane = 'Hello World';} + {let insane = 'Hello World'} }}}}; ``` @@ -294,7 +294,7 @@ function f() { console.log('I am outside!'); } return a; } } -f() // 报错 +f(); // 报错 ``` 上面代码中,块级作用域外部,无法调用块级作用域内部定义的函数。如果确实需要调用,就要像下面这样处理。 @@ -305,9 +305,9 @@ let f; let a = 'secret'; f = function () { return a; - } + }; } -f() // "secret" +f(); // "secret" ``` ES5的严格模式规定,函数只能在顶层作用域和函数内声明,其他情况(比如`if`代码块、循环代码块)的声明都会报错。 @@ -342,7 +342,7 @@ if (true) if (true) { function f() {} } -f() // ReferenceError: f is not defined +f(); // ReferenceError: f is not defined ``` 上面代码中,函数`f`是在块级作用域内部声明的,外部是不可用的。 @@ -425,7 +425,7 @@ foo.prop = 123; foo.prop // 123 -foo = {} // TypeError: "foo" is read-only +foo = {}; // TypeError: "foo" is read-only ``` 上面代码中,常量`foo`储存的是一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把`foo`指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。 From fd714a39bf51a72486e52e6d968c51f081451ac7 Mon Sep 17 00:00:00 2001 From: Xcat Liu Date: Fri, 13 May 2016 16:35:06 +0800 Subject: [PATCH 4/6] Fix coding style in docs/destructuring.md --- docs/destructuring.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/destructuring.md b/docs/destructuring.md index 3ca2648..5dc836c 100644 --- a/docs/destructuring.md +++ b/docs/destructuring.md @@ -96,7 +96,7 @@ const [v1, v2, ..., vN ] = array; 对于Set结构,也可以使用数组的解构赋值。 ```javascript -let [x, y, z] = new Set(["a", "b", "c"]) +let [x, y, z] = new Set(["a", "b", "c"]); x // "a" ``` @@ -126,8 +126,8 @@ sixth // 5 var [foo = true] = []; foo // true -[x, y = 'b'] = ['a'] // x='a', y='b' -[x, y = 'b'] = ['a', undefined] // x='a', y='b' +[x, y = 'b'] = ['a']; // x='a', y='b' +[x, y = 'b'] = ['a', undefined]; // x='a', y='b' ``` 注意,ES6内部使用严格相等运算符(`===`),判断一个位置是否有值。所以,如果一个数组成员不严格等于`undefined`,默认值是不会生效的。 @@ -145,7 +145,7 @@ x // null 如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用到的时候,才会求值。 ```javascript -function f(){ +function f() { console.log('aaa'); } @@ -321,7 +321,7 @@ x // null 如果解构失败,变量的值等于`undefined`。 ```javascript -var {foo} = {bar: 'baz'} +var {foo} = {bar: 'baz'}; foo // undefined ``` @@ -329,7 +329,7 @@ foo // undefined ```javascript // 报错 -var {foo: {bar}} = {baz: 'baz'} +var {foo: {bar}} = {baz: 'baz'}; ``` 上面代码中,等号左边对象的`foo`属性,对应一个子对象。该子对象的`bar`属性,解构时会报错。原因很简单,因为`foo`这时等于`undefined`,再取子属性就会报错,请看下面的代码。 @@ -426,7 +426,7 @@ function add([x, y]){ return x + y; } -add([1, 2]) // 3 +add([1, 2]); // 3 ``` 上面代码中,函数`add`的参数表面上是一个数组,但在传入参数的那一刻,数组参数就被解构成变量`x`和`y`。对于函数内部的代码来说,它们能感受到的参数就是`x`和`y`。 @@ -434,7 +434,7 @@ add([1, 2]) // 3 下面是另一个例子。 ```javascript -[[1, 2], [3, 4]].map(([a, b]) => a + b) +[[1, 2], [3, 4]].map(([a, b]) => a + b); // [ 3, 7 ] ``` @@ -471,7 +471,7 @@ move(); // [0, 0] `undefined`就会触发函数参数的默认值。 ```javascript -[1, undefined, 3].map((x = 'yes') => x) +[1, undefined, 3].map((x = 'yes') => x); // [ 1, 'yes', 3 ] ``` @@ -583,11 +583,11 @@ var { foo, bar } = example(); ```javascript // 参数是一组有次序的值 function f([x, y, z]) { ... } -f([1, 2, 3]) +f([1, 2, 3]); // 参数是一组无次序的值 function f({x, y, z}) { ... } -f({z: 3, y: 2, x: 1}) +f({z: 3, y: 2, x: 1}); ``` **(4)提取JSON数据** @@ -599,11 +599,11 @@ var jsonData = { id: 42, status: "OK", data: [867, 5309] -} +}; let { id, status, data: number } = jsonData; -console.log(id, status, number) +console.log(id, status, number); // 42, "OK", [867, 5309] ``` From 732701ac355d1d6742646acb91949bb5f4a4259f Mon Sep 17 00:00:00 2001 From: Xcat Liu Date: Fri, 13 May 2016 17:22:12 +0800 Subject: [PATCH 5/6] Fix code wrapper in docs/regex.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 这一篇的代码标签有点乱,我整理了一下 --- docs/regex.md | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/regex.md b/docs/regex.md index 14ef14d..5a66f1b 100644 --- a/docs/regex.md +++ b/docs/regex.md @@ -58,13 +58,13 @@ ES6对正则表达式添加了`u`修饰符,含义为“Unicode模式”,用 // true ``` -上面代码中,“\uD83D\uDC2A”是一个四个字节的UTF-16编码,代表一个字符。但是,ES5不支持四个字节的UTF-16编码,会将其识别为两个字符,导致第二行代码结果为true。加了u修饰符以后,ES6就会识别其为一个字符,所以第一行代码结果为`false`。 +上面代码中,`\uD83D\uDC2A`是一个四个字节的UTF-16编码,代表一个字符。但是,ES5不支持四个字节的UTF-16编码,会将其识别为两个字符,导致第二行代码结果为`true`。加了`u`修饰符以后,ES6就会识别其为一个字符,所以第一行代码结果为`false`。 -一旦加上u修饰符号,就会修改下面这些正则表达式的行为。 +一旦加上`u`修饰符号,就会修改下面这些正则表达式的行为。 **(1)点字符** -点(.)字符在正则表达式中,含义是除了换行符以外的任意单个字符。对于码点大于`0xFFFF`的Unicode字符,点字符不能识别,必须加上u修饰符。 +点(`.`)字符在正则表达式中,含义是除了换行符以外的任意单个字符。对于码点大于`0xFFFF`的Unicode字符,点字符不能识别,必须加上`u`修饰符。 ```javascript var s = '𠮷'; @@ -73,11 +73,11 @@ var s = '𠮷'; /^.$/u.test(s) // true ``` -上面代码表示,如果不添加u修饰符,正则表达式就会认为字符串为两个字符,从而匹配失败。 +上面代码表示,如果不添加`u`修饰符,正则表达式就会认为字符串为两个字符,从而匹配失败。 **(2)Unicode字符表示法** -ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达式中必须加上u修饰符,才能识别。 +ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达式中必须加上`u`修饰符,才能识别。 ```javascript /\u{61}/.test('a') // false @@ -85,11 +85,11 @@ ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达 /\u{20BB7}/u.test('𠮷') // true ``` -上面代码表示,如果不加u修饰符,正则表达式无法识别`\u{61}`这种表示法,只会认为这匹配61个连续的u。 +上面代码表示,如果不加`u`修饰符,正则表达式无法识别`\u{61}`这种表示法,只会认为这匹配61个连续的`u`。 **(3)量词** -使用u修饰符后,所有量词都会正确识别大于码点大于`0xFFFF`的Unicode字符。 +使用`u`修饰符后,所有量词都会正确识别大于码点大于`0xFFFF`的Unicode字符。 ```javascript /a{2}/.test('aa') // true @@ -98,24 +98,24 @@ ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达 /𠮷{2}/u.test('𠮷𠮷') // true ``` -另外,只有在使用u修饰符的情况下,Unicode表达式当中的大括号才会被正确解读,否则会被解读为量词。 +另外,只有在使用`u`修饰符的情况下,Unicode表达式当中的大括号才会被正确解读,否则会被解读为量词。 ```javascript /^\u{3}$/.test('uuu') // true ``` -上面代码中,由于正则表达式没有u修饰符,所以大括号被解读为量词。加上u修饰符,就会被解读为Unicode表达式。 +上面代码中,由于正则表达式没有`u`修饰符,所以大括号被解读为量词。加上`u`修饰符,就会被解读为Unicode表达式。 **(4)预定义模式** -u修饰符也影响到预定义模式,能否正确识别码点大于`0xFFFF`的Unicode字符。 +`u`修饰符也影响到预定义模式,能否正确识别码点大于`0xFFFF`的Unicode字符。 ```javascript /^\S$/.test('𠮷') // false /^\S$/u.test('𠮷') // true ``` -上面代码的`\S`是预定义模式,匹配所有不是空格的字符。只有加了u修饰符,它才能正确匹配码点大于0xFFFF的Unicode字符。 +上面代码的`\S`是预定义模式,匹配所有不是空格的字符。只有加了`u`修饰符,它才能正确匹配码点大于`0xFFFF`的Unicode字符。 利用这一点,可以写出一个正确返回字符串长度的函数。 @@ -133,7 +133,7 @@ codePointLength(s) // 2 **(5)i修饰符** -有些Unicode字符的编码不同,但是字型很相近,比如,\u004B与\u212A都是大写的K。 +有些Unicode字符的编码不同,但是字型很相近,比如,`\u004B`与`\u212A`都是大写的K。 ```javascript /[a-z]/i.test('\u212A') // false @@ -160,7 +160,7 @@ r1.exec(s) // ["aa"] r2.exec(s) // null ``` -上面代码有两个正则表达式,一个使用`g`修饰符,另一个使用`y`修饰符。这两个正则表达式各执行了两次,第一次执行的时候,两者行为相同,剩余字符串都是`_aa_a`。由于g修饰没有位置要求,所以第二次执行会返回结果,而y修饰符要求匹配必须从头部开始,所以返回`null`。 +上面代码有两个正则表达式,一个使用`g`修饰符,另一个使用`y`修饰符。这两个正则表达式各执行了两次,第一次执行的时候,两者行为相同,剩余字符串都是`_aa_a`。由于`g`修饰没有位置要求,所以第二次执行会返回结果,而`y`修饰符要求匹配必须从头部开始,所以返回`null`。 如果改一下正则表达式,保证每次都能头部匹配,`y`修饰符就会返回结果了。 @@ -197,7 +197,7 @@ REGEX.exec('xaxa') // null 上面代码中,`lastIndex`属性指定每次搜索的开始位置,`g`修饰符从这个位置开始向后搜索,直到发现匹配为止。 -y修饰符同样遵守`lastIndex`属性,但是要求必须在`lastIndex`指定的位置发现匹配。 +`y`修饰符同样遵守`lastIndex`属性,但是要求必须在`lastIndex`指定的位置发现匹配。 ```javascript const REGEX = /a/y; @@ -217,16 +217,16 @@ match.index // 3 REGEX.lastIndex // 4 ``` -进一步说,`y`修饰符号隐含了头部匹配的标志ˆ。 +进一步说,`y`修饰符号隐含了头部匹配的标志`^`。 ```javascript /b/y.exec('aba') // null ``` -上面代码由于不能保证头部匹配,所以返回`null`。`y`修饰符的设计本意,就是让头部匹配的标志ˆ在全局匹配中都有效。 +上面代码由于不能保证头部匹配,所以返回`null`。`y`修饰符的设计本意,就是让头部匹配的标志`^`在全局匹配中都有效。 -在`split`方法中使用y修饰符,原字符串必须以分隔符开头。这也意味着,只要匹配成功,数组的第一个成员肯定是空字符串。 +在`split`方法中使用`y`修饰符,原字符串必须以分隔符开头。这也意味着,只要匹配成功,数组的第一个成员肯定是空字符串。 ```javascript // 没有找到匹配 @@ -298,7 +298,7 @@ tokenize(TOKEN_G, '3x + 4') ## sticky属性 -与y修饰符相匹配,ES6的正则对象多了sticky属性,表示是否设置了y修饰符。 +与`y`修饰符相匹配,ES6的正则对象多了`sticky`属性,表示是否设置了`y`修饰符。 ```javascript var r = /hello\d/y; @@ -307,7 +307,7 @@ r.sticky // true ## flags属性 -ES6为正则表达式新增了flags属性,会返回正则表达式的修饰符。 +ES6为正则表达式新增了`flags`属性,会返回正则表达式的修饰符。 ```javascript // ES5的source属性 @@ -335,7 +335,7 @@ escapeRegExp(str) // "\/path\/to\/resource\.html\?search=query" ``` -上面代码中,str是一个正常字符串,必须使用反斜杠对其中的特殊字符转义,才能用来作为一个正则匹配的模式。 +上面代码中,`str`是一个正常字符串,必须使用反斜杠对其中的特殊字符转义,才能用来作为一个正则匹配的模式。 已经有[提议](https://esdiscuss.org/topic/regexp-escape)将这个需求标准化,作为RegExp对象的静态方法[RegExp.escape()](https://github.com/benjamingr/RexExp.escape),放入ES7。2015年7月31日,TC39认为,这个方法有安全风险,又不愿这个方法变得过于复杂,没有同意将其列入ES7,但这不失为一个真实的需求。 @@ -358,7 +358,7 @@ var regex = new RegExp(RegExp.escape(str), 'g'); assert.equal(String(regex), '/hello\. how are you\?/g'); ``` -目前,该方法可以用上文的escapeRegExp函数或者垫片模块[regexp.escape](https://github.com/ljharb/regexp.escape)实现。 +目前,该方法可以用上文的`escapeRegExp`函数或者垫片模块[regexp.escape](https://github.com/ljharb/regexp.escape)实现。 ```javascript var escape = require('regexp.escape'); From aecabb2e2b3a22c61ee6252615d11e2f328b73c1 Mon Sep 17 00:00:00 2001 From: Xcat Liu Date: Fri, 13 May 2016 19:23:53 +0800 Subject: [PATCH 6/6] Fix coding style in docs/number.md --- docs/number.md | 82 +++++++++++++++++++++++++------------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/docs/number.md b/docs/number.md index 1080ee5..ed75f69 100644 --- a/docs/number.md +++ b/docs/number.md @@ -141,7 +141,7 @@ Number.isInteger("15") // false Number.isInteger(true) // false ``` -ES5可以通过下面的代码,部署Number.isInteger()。 +ES5可以通过下面的代码,部署`Number.isInteger()`。 ```javascript (function (global) { @@ -196,7 +196,7 @@ Number.EPSILON.toFixed(20) ```javascript function withinErrorMargin (left, right) { - return Math.abs(left - right) < Number.EPSILON + return Math.abs(left - right) < Number.EPSILON; } withinErrorMargin(0.1 + 0.2, 0.3) // true @@ -286,9 +286,9 @@ function trusty (left, right, result) { Number.isSafeInteger(right) && Number.isSafeInteger(result) ) { - return result + return result; } - throw new RangeError('Operation cannot be trusted!') + throw new RangeError('Operation cannot be trusted!'); } trusty(9007199254740993, 990, 9007199254740993 - 990) @@ -334,7 +334,7 @@ Math.trunc(); // NaN ```javascript Math.trunc = Math.trunc || function(x) { return x < 0 ? Math.ceil(x) : Math.floor(x); -} +}; ``` ### Math.sign() @@ -368,7 +368,7 @@ Math.sign = Math.sign || function(x) { return x; } return x > 0 ? 1 : -1; -} +}; ``` ### Math.cbrt() @@ -449,9 +449,9 @@ Math.clz32(true) // 31 `Math.imul`方法返回两个数以32位带符号整数形式相乘的结果,返回的也是一个32位的带符号整数。 ```javascript -Math.imul(2, 4); // 8 -Math.imul(-1, 8); // -8 -Math.imul(-2, -2); // 4 +Math.imul(2, 4) // 8 +Math.imul(-1, 8) // -8 +Math.imul(-2, -2) // 4 ``` 如果只考虑最后32位,大多数情况下,`Math.imul(a, b)`与`a * b`的结果是相同的,即该方法等同于`(a * b)|0`的效果(超过32位的部分溢出)。之所以需要部署这个方法,是因为JavaScript有精度限制,超过2的53次方的值无法精确表示。这就是说,对于那些很大的数的乘法,低位数值往往都是不精确的,`Math.imul`方法可以返回正确的低位数值。 @@ -471,11 +471,11 @@ Math.imul(0x7fffffff, 0x7fffffff) // 1 Math.fround方法返回一个数的单精度浮点数形式。 ```javascript -Math.fround(0); // 0 -Math.fround(1); // 1 -Math.fround(1.337); // 1.3370000123977661 -Math.fround(1.5); // 1.5 -Math.fround(NaN); // NaN +Math.fround(0) // 0 +Math.fround(1) // 1 +Math.fround(1.337) // 1.3370000123977661 +Math.fround(1.5) // 1.5 +Math.fround(NaN) // NaN ``` 对于整数来说,`Math.fround`方法返回结果不会有任何不同,区别主要是那些无法用64个二进制位精确表示的小数。这时,`Math.fround`方法会返回最接近这个小数的单精度浮点数。 @@ -504,7 +504,7 @@ Math.hypot(-3); // 3 上面代码中,3的平方加上4的平方,等于5的平方。 -如果参数不是数值,Math.hypot方法会将其转为数值。只要有一个参数无法转为数值,就会返回NaN。 +如果参数不是数值,`Math.hypot`方法会将其转为数值。只要有一个参数无法转为数值,就会返回NaN。 ### 对数方法 @@ -515,9 +515,9 @@ ES6新增了4个对数相关方法。 `Math.expm1(x)`返回ex - 1,即`Math.exp(x) - 1`。 ```javascript -Math.expm1(-1); // -0.6321205588285577 -Math.expm1(0); // 0 -Math.expm1(1); // 1.718281828459045 +Math.expm1(-1) // -0.6321205588285577 +Math.expm1(0) // 0 +Math.expm1(1) // 1.718281828459045 ``` 对于没有部署这个方法的环境,可以用下面的代码模拟。 @@ -533,10 +533,10 @@ Math.expm1 = Math.expm1 || function(x) { `Math.log1p(x)`方法返回`1 + x`的自然对数,即`Math.log(1 + x)`。如果`x`小于-1,返回`NaN`。 ```javascript -Math.log1p(1); // 0.6931471805599453 -Math.log1p(0); // 0 -Math.log1p(-1); // -Infinity -Math.log1p(-2); // NaN +Math.log1p(1) // 0.6931471805599453 +Math.log1p(0) // 0 +Math.log1p(-1) // -Infinity +Math.log1p(-2) // NaN ``` 对于没有部署这个方法的环境,可以用下面的代码模拟。 @@ -549,14 +549,14 @@ Math.log1p = Math.log1p || function(x) { **(3)Math.log10()** -`Math.log10(x)`返回以10为底的x的对数。如果x小于0,则返回NaN。 +`Math.log10(x)`返回以10为底的`x`的对数。如果`x`小于0,则返回NaN。 ```javascript -Math.log10(2); // 0.3010299956639812 -Math.log10(1); // 0 -Math.log10(0); // -Infinity -Math.log10(-2); // NaN -Math.log10(100000); // 5 +Math.log10(2) // 0.3010299956639812 +Math.log10(1) // 0 +Math.log10(0) // -Infinity +Math.log10(-2) // NaN +Math.log10(100000) // 5 ``` 对于没有部署这个方法的环境,可以用下面的代码模拟。 @@ -569,15 +569,15 @@ Math.log10 = Math.log10 || function(x) { **(4)Math.log2()** -`Math.log2(x)`返回以2为底的x的对数。如果x小于0,则返回NaN。 +`Math.log2(x)`返回以2为底的`x`的对数。如果`x`小于0,则返回NaN。 ```javascript -Math.log2(3) // 1.584962500721156 -Math.log2(2) // 1 -Math.log2(1) // 0 -Math.log2(0) // -Infinity -Math.log2(-2) // NaN -Math.log2(1024) // 10 +Math.log2(3) // 1.584962500721156 +Math.log2(2) // 1 +Math.log2(1) // 0 +Math.log2(0) // -Infinity +Math.log2(-2) // NaN +Math.log2(1024) // 10 Math.log2(1 << 29) // 29 ``` @@ -593,12 +593,12 @@ Math.log2 = Math.log2 || function(x) { ES6新增了6个三角函数方法。 -- Math.sinh(x) 返回x的双曲正弦(hyperbolic sine) -- Math.cosh(x) 返回x的双曲余弦(hyperbolic cosine) -- Math.tanh(x) 返回x的双曲正切(hyperbolic tangent) -- Math.asinh(x) 返回x的反双曲正弦(inverse hyperbolic sine) -- Math.acosh(x) 返回x的反双曲余弦(inverse hyperbolic cosine) -- Math.atanh(x) 返回x的反双曲正切(inverse hyperbolic tangent) +- `Math.sinh(x)` 返回`x`的双曲正弦(hyperbolic sine) +- `Math.cosh(x)` 返回`x`的双曲余弦(hyperbolic cosine) +- `Math.tanh(x)` 返回`x`的双曲正切(hyperbolic tangent) +- `Math.asinh(x)` 返回`x`的反双曲正弦(inverse hyperbolic sine) +- `Math.acosh(x)` 返回`x`的反双曲余弦(inverse hyperbolic cosine) +- `Math.atanh(x)` 返回`x`的反双曲正切(inverse hyperbolic tangent) ## 指数运算符