- 一些概念
- for in, for of, forEach
- String
- NaN
- this
- arguments
- 发布订阅
- Array
- Object
- rest 运算符
- 立即执行函数
- 闭包
- 立即执行函数
- 深浅拷贝
- 原型
- 堆栈
- apply-call-bind
一些概念
见 https://github.com/LahmYing/front-end-tools/tree/master/%E8%AF%AD%E8%A8%80/js
for in, for of, forEach
for in 语句以任意顺序迭代对象的可枚举属性
for of 语句遍历可迭代对象定义要迭代的数据
for in 是为遍历对象属性而构建的,不建议与数组一起使用,数组可以用 Array.prototype.forEach() 和 for of
建议使用 for of 而不是 forEach
forEach 会跳过空值
1 | const array1 = ["a", , "c"]; |
String
1 | // 字符串可看作数组的一种进行操作 |
NaN
1 | // NaN === NaN // false |
this
非箭头函数:会变动,运行时确定,可用 call() 改写后确定
箭头函数:定义时确定,本身没绑定 this,取父级的 context,最近的 {} 即为父级
arguments
1 | let publish = function () { |
发布订阅
1 | let PubSub = { |
Array
array.map 是否改变原数组
map 不修改调用它的原数组本身(当然可以在 callback 执行时改变原数组)
Array.of
Array.of()基本上可以用来替代Array()或new Array(),并且不存在由于参数不同而导致的重载。它的行为非常统一
find
返回第一个符合条件的数组成员
1 | [1, 4, -5, 10].find((n) => n < 0); |
findIndex
返回第一个符合条件的数组成员的位置
1 | [1, 5, 10, 15].findIndex(function (value, index, arr) { |
fill
1 | ["a", "b", "c"].fill(7, 1, 2); // ['a', 7, 'c'] |
转成一维数组
1 | // 返回一个新数组 |
排序
1 | const arr = ["peach", "straw", "apple", "spork"]; |
其他
1 | // 首操作 shift unshift |
Object
Object.is 与 ===
不同之处只有两个:
- +0 不等于-0
- NaN 等于自身
1 | Object.is("xixi", "xixi"); //true |
浅拷贝
1 | // 浅拷贝 |
proto
1 | // __proto__ 建议换成 |
返回对象自身属性(非继承)
1 | // 返回指定对象所有自身属性(非继承属性)的描述对象 |
遍历
1 | // 遍历 keys(不含继承的) |
冻结
1 | // 冻结 |
Object.values/keys/entries
1 | Object.values({ x: 1, y: 2, a: 3, b: 4 }); |
rest 运算符
与扩展符都是 ... ,作用相反,用于代替 arguments 变量
1 | bar = function (a, ...args) { |
1 | let arr = [ |
立即执行函数
立即执行函数其实就是一个语句
1 | // 变量可以这样传递 |
闭包
- 函数 A 有(或返回)内部函数 B,函数 B 中使用了函数 A 的变量 a,这种情况成为闭包
- 注意不同的闭包实例 a 变量的值
- 执行的函数或实例被回收后,a 变量才会被回收
1 | function init() { |