数据结构与算法基础: 链表
链表链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的,每个元素由一个存储元素本身的节点和一个指向下一个元素的引用组成。相当于传统数组,链表的好处在于,添加或者移除元素的时候不需要移动其他元素。然而链表需要使用指针,因此实现链表时要额外注意。在数组中,我们阔以访问任何位置的任何元素,而想要访问链表中的一个元素,则需要从头开始迭代链表直到找到所需的元素。
链表(Linked list)是一种常见的基础数据结构,是一种线性表, 但是并不会按线性的顺序储存数据,而是在每一个节点里存到下一个节点的指针(Pointer)。 由于不必须按顺序储存,链表在插入的时候可以达到 o(1)的复杂度,比另一种线性表顺序表快得多, 但是查找一个节点或者访问特定编号的节点则需要 o(n)的时间,而顺序表响应的时间复杂度分别是 o(logn)和 o(1)。特点: 无需预先分配内存,可以充分利用计算机内存空间,实现灵活的内存动态管理 插入/删除节点不影响其他节点 随机访问速度较慢 增加了结点的指针域,空间开销比较大单向链表: 是链表中最简单的一种,它包含两个域,一个信息域和一 ...
前端进阶-大杂烩2
虽然早有准备,但还是被无情按在地上摩擦摩擦
作用域作用域是指程序源代码中定义变量的区域。作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。JavaScript 采用词法作用域(lexical scoping),也就是静态作用域
词法作用域(需要安静的理解下)词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,不是在执行它们的作用域里运行,因此当词法分析器处理代码时会保持作用域不变(大部分情况下是这样的)。而JavaScript采用的就是词法作用域,也称为静态作用域。词法作用域意味着作用域是由书写代码时函数声明的位置来决定的。编译的词法分析阶段基本能够完全知道全部标识符在哪里以及如何声明的,从而能够预测在执行过程中如何对他们进行查找
因为 JavaScript 采用的是词法作用域,函数的作用域在函数定义的时候就决定了。
而与词法作用域相对的是动态作用域,函数的作用域是在函数调用的时候才决定的。
12345678910111213141516171819var name = 'Mr.Han';function test ...
前端基础: Iterator
面试题,给出一个对象,如何封装一个类使其可遍历,就是算是手写一个Generator函数吧123456var test = { 0: 'chen', 1: 'da', 2: 'peng', length: 3}
思考一会,小试牛刀!!
12345678910111213141516171819202122var test = { 0: 'chen', 1: 'da', 2: 'peng', length: 3}class MakeIterator { constructor(obj) { this.length = Object.keys(obj).length; this.index = 0 this.obj = obj } [Symbol.iterator]() {return this}; // 这个是难点也是最重要的一点 next() { return this.index < t ...
前端进阶: generator-1
介绍Generator(生成器) 函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。
执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。
形式上,Generator 函数是一个普通函数,但是有两个特征。
function关键字与函数名之间有一个星号
函数体内部使用yield表达式,定义不同的内部状态(yield在英语里的意思就是“产出”)。
12345678function* hello() { yield 'hello'; yield 'cpp'; yield '专注';}var hG = hello()console.log(hG, Object.prototype.toString.call(hG)); // hello {<suspended>} "[object Generator]"hG.next ...
前端进阶-手写promise
promise基本用法以及手写
简单版20行手写promise目前见过最容易理解的promise
12345678910111213141516171819202122232425262728293031323334// promise 1function Promise(executor) { // Promise resolve时的回调函数集 this.callbacks = [] const resolve = (val) => { // 注意promise的then函数需要异步执行 setTimeout(() => { this.data = val; // cbs里用户传入的函数执行一遍 this.callbacks.forEach(cb => { cb(val) }); }, 0) } executor(resolve)}Promise.prototype.then = function(onRe ...
前端进阶: js执行机制
js执行是单线程的单线程是指Js引擎执行Js时只分了一个线程给他执行,也就是执行js时是单线程的。说白点就是一个时间点只能做一件事,这里只是说javascript,浏览器可不是单线程的,浏览器可是多进程的
js引擎JS引擎是浏览器的重要组成部分,主要用于读取并执行js。js引擎存在monitoring process进程,会持续不断的检查主线程执行栈是否为空,一旦为空,就会去Event Queue那里检查是否有等待被调用的函数。
各大浏览器的JS引擎:
浏览器
Js引擎
Chrome
V8
Firefox
SpiderMonkey
IE
Chakra(查克拉)
Safari
Nitro/JavaScript Core
浏览器浏览器(多进程)包含了Browser进程(浏览器的主进程)、第三方插件进程和GPU进程以及浏览器渲染进程,
浏览器进程浏览器最核心的进程,负责管理各个标签页的创建和销毁、页面显示和功能(前进,后退,收藏等)、网络资源的管理,下载等。
插件进程负责每个第三方插件的使用,每个第三方插件使用时候都会创建一个对应的进程、这可以避免第三方插件cr ...
前端进阶: promise-2
先通过刷题熟悉下Promise的基本用法
01123456789101112131415161718192021var first = () => (new Promise((resolve, reject) => { console.log(3); let p = new Promise((resolve, reject) => { console.log(7); setTimeout(() => { console.log(5); resolve(6); }, 0) resolve(1); }); resolve(2); p.then((arg) => { console.log(arg); });}));first().then((arg) => { console.log(arg);});c ...
我的2020年度总结
人生最曼妙的风景,是内心的淡定和从容
2020年一眨眼的功夫就没了,越来越觉得时间的重要性。人都是被逼出来的,我发现自己做事越来越专注,这是一种很好的趋势,希望自己能保持出。
刚过去的2020年,是值得永远铭记的一年,两位至亲突然离世让我一时难以接受现实,总以为时间还很长很长。病魔说来就来,人在这方面太过于渺小,毫无还手之力,难以改变命运。每个人都有走到终点的那一天,我只希望自己在行将就木的时候,能坦然面对。
2021年给自己提出的小目标就是身体健康永远是摆在第一位的,活一天就要健健康康一天。工作和学习 有一种感觉,到了2020年才感觉自己真正走进前端。以前总觉得很难理解的名词术语,现在慢慢开始理解了,刚开始第一遍不理解,过俩月,第二遍就理解加深一点,第三遍再去看的时候,是不是更加融会贯通一点,所以2021年给自己的目标是重学前端,从最基础的js/es6/css学起,到前端框架vue源码学习,前端工程化,如果有精力,nodejs这块,部署一个网站也是要学会和理解的。 不能再像以前一样,埋头苦干业务,干五年和干一年都一个样,很没有意义。要着眼于未来,所以,哪怕是在忙,也要 ...
前端之装饰者模式以及装饰器
定义给对象动态增加职责的方式称为装饰者模式。该模式能够在不改变对象自身的基础上,在程序运行期间给对象动态增加指责
装饰函数想要为函数增加额外功能,最简单粗暴的方式直接改写函数,但这很不友好,违反 封闭-开放原则
1234567var a = function() {alert(1)}// 改成var a = function () { alert(1); alert(2);}a()
在不改变函数源代码的方式能给函数增加功能,这正是开放-封闭原则。通过保存原引用的方式改写函数
1234567var a = function() {alert(1)}var _a = aa = function() { _a() alert(2)}a()
编写装饰器class decorator 类装饰器method decorator 方法装饰器property decorator 属性装饰器parameter decorator 参数装饰器
装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性 ...
node包里的package.json文件
敲了两年业务代码,从来不会去留意node包里的配置,一般业务用到哪个包就去直接npm i XX -D, 也不会去想这包里都有啥,这样浑浑噩噩过了好长时间。其实这样很不好,就是一个单纯的切图仔,我可不想一直这样,所以最近就开始捣鼓node包,开始看的时候 对 package.json 里的配置项不是很熟悉,现阶段就是看一点理解了就记录一点。先看下目前node包里的package.json文件配置
1234567891011121314151617181920212223242526272829303132333435363738394041{ "name": "webpack-learn", // 包名 一般采用中划线或者下划线,不建议采用小驼峰的形式命名 "version": "1.0.0", // 版本 "description": "vue webpack", "main": "dist/main.js", "module": "dist/main.js", "scripts": { "dev": "webpack-dev-server --p ...