现代化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])
解构赋值
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有三种状态:
- pending 结果还不可用
- fulfilled/resolved 操作完成,结果可用
- rejected 错误发生,阻止了结果生成
truthy(真值)
falsy 值 (虚值)
在 javascript 中只有 7 个 falsy 值。
false | false 关键字 |
---|---|
0 | 数值 zero |
0n | 当 bigint 作为布尔值使用时, 遵从其作为数值的规则. 0n 是 falsy 值. |
“", ‘', `` | 这是一个空字符串 (字符串的长度为零). javascript 中的字符串可用双引号 “", 单引号 ‘', 或 模板字面量 `` 定义。 |
null | null - 缺少值 |
undefined | undefined - 原始值 |
nan | nan - 非数值 |