现代化javascript拾遗

现代化javascript拾遗

变量

es6 引入了 const 和 let,由于var的怪异行为,现在不推荐使用var定义变量. https://www.youtube.com/watch?v=sjyjbl5fkp8&feature=youtu.be

条件运算符

https://developer.mozilla.org/zh-cn/docs/web/javascript/reference/operators/conditional%5Foperator

condition ? expriftrue : expriffalse

array

因为数组的长度可随时改变,并且其数据在内存中也可以不连续,所以 javascript 数组不一定是密集型的,这取决于它的使用方式。 即使使用 const 声明一个数组,数组的内容依然是可以变的

push

往数组中插入一个元素

concat

返回一个新的数组,不改变原有数组内容

map()

https://developer.mozilla.org/zh-cn/docs/web/javascript/reference/global%5Fobjects/array/map

reduce()

https://developer.mozilla.org/zh-cn/docs/web/javascript/reference/global%5Fobjects/array/reduce 数组中所有值的和

var total = [ 0, 1, 2, 3 ].reduce(
  ( acc, cur ) => acc + cur,
  0
);

nb 要累加对象数组中包含的值,必须提供初始值,以便各个item正确通过你的函数。

var initialvalue = 0;
var sum = [{x: 1}, {x:2}, {x:3}].reduce(
	(accumulator, currentvalue) => accumulator + currentvalue.x
	,initialvalue
);

console.log(sum) // logs 6

filter()

https://developer.mozilla.org/zh-cn/docs/web/javascript/reference/global%5Fobjects/array/filter

var newarray = arr.filter(callback(element[, index[, array]])[, thisarg])

解构赋值

https://developer.mozilla.org/zh-cn/docs/web/javascript/reference/operators/destructuring%5Fassignment

var a, b, rest;
[a, b] = [10, 20];
console.log(a); // 10
console.log(b); // 20

[a, b, ...rest] = [10, 20, 30, 40, 50];
console.log(a); // 10
console.log(b); // 20
console.log(rest); // [30, 40, 50]

({ a, b } = { a: 10, b: 20 });
console.log(a); // 10
console.log(b); // 20

nb: 无声明赋值

javascript 引擎会将{x}理解成一个代码块,从而发生语法错误。 只有不将大括号写在行首,避免 javascript 将其解释为代码块,才能解决这个问题。

赋值语句周围的圆括号 ( … ) 在使用对象字面量无声明解构赋值时是必须的。 {a, b} = {a: 1, b: 2} 不是有效的独立语法,因为左边的 {a, b} 被认为是一个块而不是对象字面量。 然而,({a, b} = {a: 1, b: 2}) 是有效的,正如 var {a, b} = {a: 1, b: 2} 你的 ( … ) 表达式之前需要有一个分号,否则它可能会被当成上一行中的函数执行。

对象的解构赋值

对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定; 而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

object

对象字面量-常见的定义对象的方式

对象字面值是封闭在花括号对({})中的一个对象的零个或多个"属性名-值"对的(元素)列表。

var car = { mycar: "saturn", getcar: cartypes("honda"), special: sales };

对象方法和this

使用 bind 方法可以解决一些场景(settimeout)的 this 指向问题 https://developer.mozilla.org/zh-cn/docs/web/javascript/reference/global%5Fobjects/function/bind

理解this的视频教程: https://egghead.io/courses/understand-javascript-s-this-keyword-in-depth

function

函数声明: https://developer.mozilla.org/zh-cn/docs/web/javascript/reference/statements/function

箭头函数

es6引入 https://developer.mozilla.org/zh-cn/docs/web/javascript/reference/functions/arrow%5Ffunctions “箭头出现在参数列表后面,然后是函数的主体。 它表达了一些东西,类似“这个输入(参数)产生这个结果(主体)”。”

//加括号的函数体返回对象字面量表达式:
params => ({foo: bar})

闭包

考虑这样的程序需要一些实践。 一个好的心智模型是,将函数值看作值,包含他们主体中的代码和它们的创建环境。 被调用时,函数体会看到它的创建环境,而不是它的调用环境。有点像偏函数。

class

es6引入 javascript 类实质上是 javascript 现有的基于原型的继承的语法糖。 https://developer.mozilla.org/zh-cn/docs/web/javascript/reference/classes

继承

javascript使用原型式继承 —— prototypal inheritance https://developer.mozilla.org/zh-cn/docs/learn/javascript/objects/inheritance

展开语法

可以在函数调用/数组构造时, 将数组表达式或者string在语法层面展开;还可以在构造字面量对象时, 将对象表达式按key-value的方式展开。有点像python的解包

function sum(x, y, z) {
  return x + y + z;
}

const numbers = [1, 2, 3];

console.log(sum(...numbers));
// expected output: 6

console.log(sum.apply(null, numbers));
// expected output: 6

函数式编程

https://www.youtube.com/playlist?list=pl0zvegevsaeed9hlmcxrk5yuyquag-n84 高阶函数,map,reduce

并发模型与事件循环

https://developer.mozilla.org/zh-cn/docs/web/javascript/eventloop

promise

https://developer.mozilla.org/zh-cn/docs/web/javascript/guide/using%5Fpromises

本质上,promise 是一个被某些函数传出的对象,我们附加回调函数(callback)使用它,而不是将回调函数传入那些函数内部。 通常,一遇到异常抛出,promise 链就会停下来,直接调用链式中的 catch 处理程序来继续当前执行。 promise有三种状态:

  1. pending 结果还不可用
  2. fulfilled/resolved 操作完成,结果可用
  3. rejected 错误发生,阻止了结果生成

truthy(真值)

falsy 值 (虚值)

在 javascript 中只有 7 个 falsy 值。

false false 关键字
0 数值 zero
0n 当 bigint 作为布尔值使用时, 遵从其作为数值的规则. 0n 是 falsy 值.
“", ‘', `` 这是一个空字符串 (字符串的长度为零). javascript 中的字符串可用双引号 “", 单引号 ‘', 或 模板字面量 `` 定义。
null null - 缺少值
undefined undefined - 原始值
nan nan - 非数值

footnotes

comment local variables

React从入门到放弃

Python装饰器与partial