You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
function promiseAll(promises) {
return new Promise(function(resolve, reject) {
if (!isArray(promises)) {
return reject(new TypeError('arguments must be an array'));
}
var resolvedCounter = 0;
var promiseNum = promises.length;
var resolvedValues = new Array(promiseNum);
for (var i = 0; i < promiseNum; i++) {
(function(i) {
Promise.resolve(promises[i]).then(function(value) {
resolvedCounter++
resolvedValues[i] = value
if (resolvedCounter == promiseNum) {
return resolve(resolvedValues)
}
}, function(reason) {
return reject(reason)
})
})(i)
}
})
}
promise的then返回值
then方法返回的是一个新的Promise实例
catch方法返回的还是一个 Promise 对象,因此后面还可以接着调用then方法
promise的三种状态
Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))
/* min/max number in an array */
var numbers = [5, 6, 2, 3, 7];
/* using Math.min/Math.max apply */
var max = Math.max.apply(null, numbers);
/* This about equal to Math.max(numbers[0], ...) or Math.max(5, 6, ...) */
var min = Math.min.apply(null, numbers);
类数组(Array-like)对象/集合转换成一个新数组
function list() {
return Array.prototype.slice.call(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]
console.log(list1);
let str = "abcabcabcbbccccc";
let num = 0;
let char = '';
// 使其按照一定的次序排列
str = str.split('').sort().join('');
// "aaabbbbbcccccccc"
// 定义正则表达式
let re = /(\w)\1+/g;
str.replace(re,($0,$1) => {
if(num < $0.length){
num = $0.length;
char = $1;
}
});
console.log(`字符最多的是${char},出现了${num}次`);
实现千位分隔符
// $& 最后匹配的字符
// (?=exp) 匹配exp前面的位置
// x(?=y)
//Meaning:Matches x only if x is followed by y.
//解释:当x后面跟着y(即y的正则匹配成功)的时候,匹配成功
function parseToMoney(num) {
num = parseFloat(num.toFixed(3));
let [integer, decimal] = String.prototype.split.call(num, '.');
integer = integer.replace(/\d(?=(\d{3})+$)/g, '$&,');
return integer + '.' + (decimal ? decimal : '');
}
parseToMoney(1234.56);
js事件循环(eventloop)
https://juejin.im/post/5c394da4518825253661bd4d
Tasks, microtasks, queues and schedules 强烈推荐,图文并茂可查看每一步执行动画
引用贺老师知乎上的一个例子
简化理解为:
ES5继承和ES6继承的区别
ES5的继承实质上是先创建子类的实例对象,然后再将父类的方法添加到this上(Parent.call(this)).
ES6的继承有所不同,实质上是先创建父类的实例对象this,然后再用子类的构造函数修改this。因为子类没有自己的this对象,所以必须先调用父类的super()方法,否则新建实例报错。
new对象的具体实现过程
https://blog.csdn.net/Neokekeke/article/details/79394197
new的本质:
模块引入 es6的import 和 commonjs的 require的主要区别是什么( CommonJS 和 ES Module 的区别)
加载时机:CommonJS 是运行时加载(动态加载),ES Module 是编译时加载(静态加载)
加载模块:CommonJS 模块就是对象,加载的是该对象,ES Module 模块不是对象,加载的不是对象,是接口
加载结果:CommonJS 加载的是整个模块,即将所有的接口全部加载进来,ES Module 可以单独加载其中的某个接口(方法)
输出:CommonJS 输出值的拷贝,ES Module 输出值的引用
this: CommonJS 指向当前模块,ES Module 指向 undefined
跨域请求cookie是否会传送到服务端
设置 withCredentials 为 true
defer 和 async 的区别
自己实现promise.all
https://segmentfault.com/a/1190000010765655
promise的then返回值
promise的三种状态
你真的完全掌握了promise么
从一道Promise执行顺序的题目看Promise实现
原生js实现排行榜列表(dom)结构的首位调转顺序
Js严格模式与非严格模式
https://larryzhuo.github.io/2015/11/03/20151103/
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode
防抖和节流
结合应用场景
debounce 防抖
throttle 节流
实现一个 Promise
https://www.cxymsg.com/guide/jsWritten.html#%E5%AE%9E%E7%8E%B0promise
NodeJS的Event Loop
https://www.cxymsg.com/guide/eventLoop.html#nodejs%E7%9A%84event-loop
Reflect
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect
Function.prototype.call.apply作用详解
参照 Reflect.apply
相当于
http://www.softwhy.com/article-7058-1.html
https://www.jianshu.com/p/87eafacf51cf
利用apply调用系统max方法获取最大值
类数组(Array-like)对象/集合转换成一个新数组
重新认识string.replace
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace#%E8%AF%AD%E6%B3%95
查找字符串中出现最多的字符和个数
Canvas API
https://juejin.im/post/5ac437b5f265da238f12c1c6
再谈前端虚拟列表的实现
https://zhuanlan.zhihu.com/p/34585166
Reflect对象
http://es6.ruanyifeng.com/#docs/reflect
一个例子看懂循环和闭包之间的关系
https://www.nodejs.red/#/javascript/func?id=%e4%b8%80%e4%b8%aa%e4%be%8b%e5%ad%90%e7%9c%8b%e6%87%82%e5%be%aa%e7%8e%af%e5%92%8c%e9%97%ad%e5%8c%85%e4%b9%8b%e9%97%b4%e7%9a%84%e5%85%b3%e7%b3%bb
区分event对象中的[clientX,offsetX,screenX,pageX]
https://www.jianshu.com/p/a52077e8369d
cookie samesite
https://www.chromestatus.com/feature/5088147346030592
https://juejin.im/post/5e1437c6e51d45415b4760cb
https://zhuanlan.zhihu.com/p/73261967
postMessage跨页面传递数据
MDN postMessage
localhost:3000 与 localhost:5000 的 cookie 信息是否共享
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
①__proto__和constructor属性是对象所独有的;
② prototype属性是函数所独有的,因为函数也是一种对象,所以函数也拥有__proto__和constructor属性。
__proto__属性的作用就是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里找,一直找,直到__proto__属性的终点null,然后返回undefined,再往上找就相当于在null上取值,会报错。
通过__proto__属性将对象连接起来的这条链路即我们所谓的原型链。
prototype属性的作用就是让该函数所实例化的对象们都可以找到公用的属性和方法,即f1.proto === Foo.prototype。
constructor属性的含义就是指向该对象的构造函数,所有函数(此时看成对象了)最终的构造函数都指向Function。 另外 proto 属性是浏览器对es5的实现,而不是es标准
栈:
存储基础数据类型
按值访问
存储的值大小固定
由系统自动分配内存空间
空间小,运行效率高
先进后出,后进先出
栈中的DOM,ajax,setTimeout会依次进入到队列中,当栈中代码执行完毕后,再将队列中的事件放到执行栈中依次执行。
微任务和宏任务
堆:
存储引用数据类型
按引用访问
存储的值大小不定,可动态调整
主要用来存放对象
空间大,但是运行效率相对较低
无序存储,可根据引用直接获取
对于同源页面,常见的方式包括:
广播模式:Broadcast Channe / Service Worker / LocalStorage + StorageEvent
共享存储模式:Shared Worker / IndexedDB / cookie
口口相传模式:window.open + window.opener
基于服务端:Websocket / Comet / SSE 等
而对于非同源页面,则可以通过嵌入同源 iframe 作为“桥”,将非同源页面通信转换为同源页面通信。
js实现readonly
位运算的妙用
https://juejin.im/post/5a98ea2f6fb9a028bb186f34
https://juejin.im/entry/57317b2679df540060d5d6c2
js 类数组对象
https://juejin.im/post/5be561a6f265da613f2efb73
类数组对象与数组的区别
如果类数组对象能够和数组一样使用数组的方法,应该怎么做
前端图片&二进制操作
参考资料
The text was updated successfully, but these errors were encountered: