近期在浏览器中使用 Smalltalk,由于其底层基于 JavaScript(ES6),近期抽空重新过了一下 JavaScript 的语法和特性。
在函数调用/数组构造时, 将数组表达式语法层面展开;还可以在构造字面量对象时, 将对象表达式按key-value的方式展开。
|
|
|
|
For loops
|
|
函数式风格,易于阅读和扩展,但对迭代的控制较少,不能 return 跳过元素。
JavaScript 数组具有非常健壮的 API,提供了许多惊人的工具

map : 将提供的转换应用于原始数组的每个元素, 结果是一个数组的长度与原始数组相同
|
|
filter: 使用过滤函数创建新数组,以仅保留 true 基于该函数返回的元素。结果是一个等于或小于原始数组长度的数组
|
|
reduce: 根据 reduce 函数和初始值创建任何类型的单一输出值。
|
|
reduce 相关参数与细节参考 Array.prototype.reduce()
find: 返回匹配器函数返回的第一个元素 true。结果是原始数组中的单个元素。
|
|
String
|
|
Set
|
|
NodeList
|
|
MDN: for…of 语句 for…in 语句循环一个指定的变量来循环一个对象所有可枚举的属性。
for…of 语句在可迭代对象(包括Array、Map、Set、arguments 等等)上创建了一个循环,对值的每一个独特属性调用一次迭代。
for...in 可用于数组字符串或普通对象,但不能用于 Map 或 Set 对象。(适合我)
|
|
forEach()仅迭代数组,但它可以在迭代时访问每个元素的值和索引。
|
|
for...of 可用于数组,字符串 Map 或 Set 对象,但不能用于普通对象。
|
|
|
|
|
|
reduce() 方法对数组中的每个元素执行一个由您提供的 reducer 函数(升序执行),将其结果汇总为单个返回值。
reducer 函数接收 4 个参数:
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
参数细节参考原文。
initialValue: 作为第一次调用 callback 函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。
|
|
在javascript中,一个对象可以是一个单独的拥有属性和类型的实体。我们拿它和一个杯子做下类比。一个杯子是一个对象(物体),拥有属性。杯子有颜色,图案,重量,由什么材质构成等等。同样,javascript对象也有属性来定义它的特征。
使用getter和setter方法扩展 Date原型,为预定义好的Date类添加一个year的属性。
|
|
在JavaScript中,this关键字指的是当前正在执行代码的对象。简而言之,常见情况:
|
|
|
|
|
|
|
|
实例的属性必须定义在类的方法里. ES6 类的方法内部如果含有this,它默认指向类的实例。
|
|
Promise 很棒的一点就是链式调用(chaining)。
参考:
Self语言基于 prototype
在 ES2015/ES6 中引入了 class 关键字,但那只是语法糖,JavaScript 仍然是基于原型的
JavaScript 对象是动态的属性“包”(指其自己的属性)。JavaScript 对象有一个指向一个原型对象的链。
|
|
当继承的函数被调用时,this 指向的是当前继承的对象,而不是继承的函数所在的原型对象。
ECMAScript 2017 JavaScript版的一部分
简单来说,它们是基基于promises的语法糖,使异步代码更易于编写和阅读。通过使用它们,异步代码看起来更像是老式同步代码
|
|
将 async 关键字加到函数申明中,可以告诉它们返回的是 promise,而不是直接返回值。此外,它避免了同步函数为支持使用 await 带来的任何潜在开销。
await 只在异步函数里面才起作用。它可以放在任何异步的,基于 promise 的函数之前。它会暂停代码在该行上,直到 promise 完成,然后返回结果值。
|
|
由于 async 关键字将函数转换为 promise,您可以使用 promise 和 await 的混合方式
|
|
闭包在实现上是一个结构体,它存储了一个函数和一个关联的环境。环境里是若干对符号和值的对应关系.
闭包跟函数最大的不同在于,当捕捉闭包的时候,它的自由变量会在捕捉时被确定,这样即便脱离了捕捉时的上下文,它也能照常运行.
|
|
在一些编程语言中,一个函数中的局部变量仅存在于此函数的执行期间。一旦 makeFunc() 执行完毕,你可能会认为 name 变量将不能再被访问。
JavaScript 中情况显然与此不同。 displayName 的实例维持了一个对它的词法环境(变量 name 存在于其中)的引用。因此,当 myFunc 被调用时,变量 name 仍然可用,其值 Mozilla 就被传递到alert中。
反射(reflection)是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。
Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。
|
|
在 ECMAScript 6 中引入的 Proxy 对象可以拦截某些操作并实现自定义行为)
|
|
Proxy 对象定义了一个目标(这里是一个空对象)和一个实现了 get 陷阱的 handler 对象。这里,代理的对象在获取未定义的属性时不会返回 undefined,而是返回 42。
事件 是你正在编写的 系统 中发生的动作或事件,系统告诉你的是这些动作或事件,如果需要的话,你可以以某种方式对它们做出反应。
|
|
|
|
从ECMAScript 6开始,有两个新的类型的参数:默认参数,剩余参数。
在JavaScript中,函数参数的默认值是undefined。
|
|
剩余参数语法允许将不确定数量的参数表示为数组。
|
|
函数的实际参数会被保存在一个类似数组的arguments对象中。
|
|
在函数之外声明的变量,叫做全局变量, 因为它可被 当前文档 中的任何其他代码所访问。
ES 6 有 语句块 作用域;语句块中声明的变量将成为 语句块 所在函数(或全局作用域)的局部变量
|
|
let不像 var 一样,let不会在全局对象里新建一个属性。
语句块通常用于流程控制,如if,for,while等等。 该块由一对大括号界定
|
|
|
|
全局变量是全局对象的属性。在网页中,(译注:缺省的)全局对象是 window ,所以你可以用形如 window.variable 的语法来设置和访问全局变量。
用关键字 const 创建一个只读的常量
常量的作用域规则与 let 块级作用域变量相同。
|
|
正则表达式是用于匹配字符串中字符组合的模式。
在 JavaScript中,正则表达式也是对象。这些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的 match、matchAll、replace、search 和 split 方法。
var re = /ab+c/;var re = new RegExp("ab+c");
|
|
浏览器开始原生支持。
<script type="module"> 属性用于指示引入的模块:
|
|
只能在模块内部使用 import 和export 语句 ;不是普通脚本文件
|
|
|
|
|
|
|
|
最新的浏览器开始原生支持模块功能
使用JavaScript 模块依赖于import和 export
Dynamic ES module loader
SystemJS允许编写和使用依赖于 ES6 导入和导出语句的模块化javacsript代码。
|
|
|
|
我侧重使用函数式风格(map/reduce/filter)的表达方式,js 可真是有着 C 语法的 LISP
近期在浏览器中使用 Smalltalk,由于其底层基于 JavaScript(ES6),近期抽空重新过了一下 JavaScript 的语法和特性。
在函数调用/数组构造时, 将数组表达式语法层面展开;还可以在构造字面量对象时, 将对象表达式按key-value的方式展开。
|
|
|
|
For loops
|
|
函数式风格,易于阅读和扩展,但对迭代的控制较少,不能 return 跳过元素。
JavaScript 数组具有非常健壮的 API,提供了许多惊人的工具

map : 将提供的转换应用于原始数组的每个元素, 结果是一个数组的长度与原始数组相同
|
|
filter: 使用过滤函数创建新数组,以仅保留 true 基于该函数返回的元素。结果是一个等于或小于原始数组长度的数组
|
|
reduce: 根据 reduce 函数和初始值创建任何类型的单一输出值。
|
|
reduce 相关参数与细节参考 Array.prototype.reduce()
find: 返回匹配器函数返回的第一个元素 true。结果是原始数组中的单个元素。
|
|
String
|
|
Set
|
|
NodeList
|
|
MDN: for…of 语句 for…in 语句循环一个指定的变量来循环一个对象所有可枚举的属性。
for…of 语句在可迭代对象(包括Array、Map、Set、arguments 等等)上创建了一个循环,对值的每一个独特属性调用一次迭代。
for...in 可用于数组字符串或普通对象,但不能用于 Map 或 Set 对象。(适合我)
|
|
forEach()仅迭代数组,但它可以在迭代时访问每个元素的值和索引。
|
|
for...of 可用于数组,字符串 Map 或 Set 对象,但不能用于普通对象。
|
|
|
|
|
|
reduce() 方法对数组中的每个元素执行一个由您提供的 reducer 函数(升序执行),将其结果汇总为单个返回值。
reducer 函数接收 4 个参数:
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
参数细节参考原文。
initialValue: 作为第一次调用 callback 函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。
|
|
在javascript中,一个对象可以是一个单独的拥有属性和类型的实体。我们拿它和一个杯子做下类比。一个杯子是一个对象(物体),拥有属性。杯子有颜色,图案,重量,由什么材质构成等等。同样,javascript对象也有属性来定义它的特征。
使用getter和setter方法扩展 Date原型,为预定义好的Date类添加一个year的属性。
|
|
在JavaScript中,this关键字指的是当前正在执行代码的对象。简而言之,常见情况:
|
|
|
|
|
|
|
|
实例的属性必须定义在类的方法里. ES6 类的方法内部如果含有this,它默认指向类的实例。
|
|
Promise 很棒的一点就是链式调用(chaining)。
参考:
Self语言基于 prototype
在 ES2015/ES6 中引入了 class 关键字,但那只是语法糖,JavaScript 仍然是基于原型的
JavaScript 对象是动态的属性“包”(指其自己的属性)。JavaScript 对象有一个指向一个原型对象的链。
|
|
当继承的函数被调用时,this 指向的是当前继承的对象,而不是继承的函数所在的原型对象。
ECMAScript 2017 JavaScript版的一部分
简单来说,它们是基基于promises的语法糖,使异步代码更易于编写和阅读。通过使用它们,异步代码看起来更像是老式同步代码
|
|
将 async 关键字加到函数申明中,可以告诉它们返回的是 promise,而不是直接返回值。此外,它避免了同步函数为支持使用 await 带来的任何潜在开销。
await 只在异步函数里面才起作用。它可以放在任何异步的,基于 promise 的函数之前。它会暂停代码在该行上,直到 promise 完成,然后返回结果值。
|
|
由于 async 关键字将函数转换为 promise,您可以使用 promise 和 await 的混合方式
|
|
闭包在实现上是一个结构体,它存储了一个函数和一个关联的环境。环境里是若干对符号和值的对应关系.
闭包跟函数最大的不同在于,当捕捉闭包的时候,它的自由变量会在捕捉时被确定,这样即便脱离了捕捉时的上下文,它也能照常运行.
|
|
在一些编程语言中,一个函数中的局部变量仅存在于此函数的执行期间。一旦 makeFunc() 执行完毕,你可能会认为 name 变量将不能再被访问。
JavaScript 中情况显然与此不同。 displayName 的实例维持了一个对它的词法环境(变量 name 存在于其中)的引用。因此,当 myFunc 被调用时,变量 name 仍然可用,其值 Mozilla 就被传递到alert中。
反射(reflection)是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。
Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。
|
|
在 ECMAScript 6 中引入的 Proxy 对象可以拦截某些操作并实现自定义行为)
|
|
Proxy 对象定义了一个目标(这里是一个空对象)和一个实现了 get 陷阱的 handler 对象。这里,代理的对象在获取未定义的属性时不会返回 undefined,而是返回 42。
事件 是你正在编写的 系统 中发生的动作或事件,系统告诉你的是这些动作或事件,如果需要的话,你可以以某种方式对它们做出反应。
|
|
|
|
从ECMAScript 6开始,有两个新的类型的参数:默认参数,剩余参数。
在JavaScript中,函数参数的默认值是undefined。
|
|
剩余参数语法允许将不确定数量的参数表示为数组。
|
|
函数的实际参数会被保存在一个类似数组的arguments对象中。
|
|
在函数之外声明的变量,叫做全局变量, 因为它可被 当前文档 中的任何其他代码所访问。
ES 6 有 语句块 作用域;语句块中声明的变量将成为 语句块 所在函数(或全局作用域)的局部变量
|
|
let不像 var 一样,let不会在全局对象里新建一个属性。
语句块通常用于流程控制,如if,for,while等等。 该块由一对大括号界定
|
|
|
|
全局变量是全局对象的属性。在网页中,(译注:缺省的)全局对象是 window ,所以你可以用形如 window.variable 的语法来设置和访问全局变量。
用关键字 const 创建一个只读的常量
常量的作用域规则与 let 块级作用域变量相同。
|
|
正则表达式是用于匹配字符串中字符组合的模式。
在 JavaScript中,正则表达式也是对象。这些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的 match、matchAll、replace、search 和 split 方法。
var re = /ab+c/;var re = new RegExp("ab+c");
|
|
浏览器开始原生支持。
<script type="module"> 属性用于指示引入的模块:
|
|
只能在模块内部使用 import 和export 语句 ;不是普通脚本文件
|
|
|
|
|
|
|
|
最新的浏览器开始原生支持模块功能
使用JavaScript 模块依赖于import和 export
Dynamic ES module loader
SystemJS允许编写和使用依赖于 ES6 导入和导出语句的模块化javacsript代码。
|
|
|
|
我侧重使用函数式风格(map/reduce/filter)的表达方式,js 可真是有着 C 语法的 LISP