现代 JavaScript 参考(7)

String.raw 是ES2015,内置对象 String 的一个静态方法,把它作为Tag,可以做到只替换嵌入表达式而不转义字符。

const raw = String.raw`1\\2\\${1+2}`; console.log(raw); //1\\2\\3 console.log(raw.length); //7 const x = `1\\2\\${1+2}`; console.log(x); //1\2\3 console.log(x.length); //5 规避问题

Template literals遵从字符串的转义规则:

(1)以 \u 开头,后跟4个16进制数字,例如,\u00B1表示±
(2)以 \u 开头,使用大括号括起来的16进制数字,例如,\u{2F804} 表示 你
(3)以 \x 开头,后跟2个16进制数字,例如,\xB1 表示 ±
(4)以 \ 开头,后跟10进制数字,用来表示八进制字面量(注:strict mode下不支持)

解释器遇到 \u 和 \x ,如果发现后面的字符不满足以上条件,就会报语法错。例如,

> latex`\unicode` > Uncaught SyntaxError: Invalid Unicode escape sequence

不再展开,具体参考:。

愚人码头注,关于后面的剩余参数:

在第一个参数后的每一个参数,都是已经求值后的替换表达式。 看下面这个例子:

var a = 5; var b = 10; function tag(strings, ...values) { console.log(values[0]); // 15 console.log(values[1]); // 50 return values[0]+values[1]; //65 } tag`Hello ${ a + b } world ${ a * b}`;

上例中,剩余的2个参数值分别是 15 和 50;

——-愚人码头注结束——-

一个更有趣的例子:

function comma(strings, ...values) { return strings.reduce((prev, next) => { let value = values.shift() || []; value = value.join(", "); return prev + next + value; }, ""); } const snacks = ['apples', 'bananas', 'cherries']; comma`I like ${snacks} to snack on.`; // "I like apples, bananas, cherries to snack on." 扩展阅读 ES6 模块的导入 / 导出 (imports / exports)

ES6模块用于访问模块中显式导出的模块中的变量或函数。

我强烈建议您查看 MDN 上有关 import/export(请参阅下面的扩展阅读资源),它们写的既简洁又完整。

用示例代码说明 命名导出

命名导出用于从一个模块导出多个值。

注意: 您命名导出的变量是一等公民(first-class citizens)

// mathConstants.js export const pi = 3.14; export const exp = 2.7; export const alpha = 0.35; // ------------- // myFile.js import { pi, exp } from './mathConstants.js'; // 命名导入 -- 类似于解构语法 console.log(pi) // 3.14 console.log(exp) // 2.7 // ------------- // mySecondFile.js import * as constants from './mathConstants.js'; // 将所有导出的值注入到 constants 变量中 console.log(constants.pi) // 3.14 console.log(constants.exp) // 2.7

虽然命名导入看起来像是 解构(destructuring),但它们具有不同的语法,并且不一样。 他们不支持默认值,也不支持深层次的解构。

此外,您可以使用别名,但语法不同于解构中使用的语法:

import { foo as bar } from 'myFile.js'; // foo 被导入并注入到一个新的 bar 变量中 默认导入 / 导出 (imports / exports)

关于默认导出,每个模块只能有一个默认导出。默认导出可以是函数,类,对象或其他任何东西。这个值被认为是“主要”的导出值,因为它将是最简单的导入。 。

// coolNumber.js const ultimateNumber = 42; export default ultimateNumber; // ------------ // myFile.js import number from './coolNumber.js'; // 默认导出,将独立于其名称,自动注入到 number 这个变量; console.log(number) // 42

函数导出:

// sum.js export default function sum(x, y) { return x + y; } // ------------- // myFile.js import sum from './sum.js'; const result = sum(1, 2); console.log(result) // 3 扩展阅读 JavaScript 中的 this

this 操作符的行为与其他语言不同,在大多数情况之下是由函数的调用方式决定。 ()。

this 概念有很多细节,并不是那么容易理解,我强烈建议你深入了解下面的扩展阅读。因此,我会提供我个人对于 this 的一点理解和想法。我是从 学到了这个提示。

function myFunc() { ... } // 在每个述句后面,你都可以在 myFunc 中找到 this 的值 myFunc.call("myString", "hello") // "myString" -- 首先, .call的参数值被注入到 *this* // 在非严格模式下(non-strict-mode) myFunc("hello") // window -- myFunc() 是 myFunc.call(window, "hello") 的语法糖 // 在严格模式下(strict-mode) myFunc("hello") // undefined -- myFunc() 是 myFunc.call(undefined, "hello") 的语法糖 var person = { myFunc: function() { ... } } person.myFunc.call(person, "test") // person 对象 -- 首先, .call的参数值被注入到 *this* person.myFunc("test") // person 对象 -- person.myFunc() 是 person.myFunc.call(person, "test") 的语法糖 var myBoundFunc = person.myFunc.bind("hello") // 创造了一个函数,并且把 "hello" 注入到 *this* person.myFunc("test") // person 对象 -- bind 方法对原有方法并无造成影响 myBoundFunc("test") // "hello" -- myBoundFunc 是把带有 "hello" 的 person.myFunc 绑定到 *this* 扩展阅读

类(Class)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wywxjf.html