程序员成长指北

Results 39 issues of 程序员成长指北

# 前言 ![](https://user-gold-cdn.xitu.io/2019/6/22/16b7e5de56617bfb?w=940&h=400&f=png&s=367315) 之前面试了几个开发者,他们确实做过不少项目,能力也是不错的,但是发现js基础不扎实, 于是决定写一下这篇javascrip数据类型相关的基础文章,其实也不仅仅是因为面试了他们,之前自己在面试的时候,也曾经被虐过,面试官说过的最深刻的一句话我到现在都记得。 > 基础很重要,只有基础好才会很少出`bug`,大多数的`bug`都是基础不扎实造成的。 这里给出两道我们公司数据类型基础相关的面试题和答案,如果都能做对并且知道为什么(可以选择忽略本文章): ```javascript //类型转换相关问题 var bar=true; console.log(bar+0); console.log(bar+"xyz"); console.log(bar+true); console.log(bar+false); console.log('1'>bar); console.log(1+'2'+false); console.log('2' + ['koala',1]); var obj1 = { a:1, b:2 } console.log('2'+obj1); var...

![](https://user-gold-cdn.xitu.io/2019/6/19/16b6cfc3724efe31?w=400&h=240&f=jpeg&s=44191) 对象着手 在谈原型链之前,先了解对象。 所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型) 所有函数拥有prototype属性(显式原型)(仅限函数) 原型对象:拥有prototype属性的对象,在定义函数时就被创建 prototype与__proto__两个概念 prototype:此属性只有构造函数才有,它指向的是当前构造函数的原型对象。 proto:此属性是任何对象在创建时都会有的一个属性,它指向了产生当前对象的构造函数的原型对象,由于并非标准规定属性,不要随便去更改这个属性的值,以免破坏原型链,但是可以借助这个属性来学习,所谓的原型链就是由__proto__连接而成的链。 原型链详解 在js代码中 通过对象创建(下面一段简单的代码)详细分析原型链 一段简单代码: function foo(){} foo.prototype.z=3; var obj=new foo(); obj.y=2; obj.x=1; //调用 obj.x;//1 obj.y;//2 obj.z;//3 typeof obj.toString;//'function' 'z' in obj;//true...

js最初设计是运行在浏览器中,单线程是为了防止DOM渲染冲突问题 比如有这样一个场景: 假设有2个线程, 当它们同时对同一个DON进行操作, 一个进行修改,而另一个进行删除, 此时就会产生冲突 所以为了避免出现这样的冲突, javascript从一诞生就是单线程. 但是呢单线程始终是一个痛点, 为了利用多核 CPU 的计算能力,HTML5 提出 Web Worker 标准,允许 JavaScript 脚本创建多个线程。但是子线程完全受主线程控制,且不得操作 DOM

javascript

## 概念 ### 关系型数据库 SQL (Structured Query Language) 数据库,指关系型数据库 - 主要代表:SQL Server,Oracle,MySQL(开源),PostgreSQL(开源)。 ### 非关系型数据库 NoSQL(Not Only SQL)泛指非关系型数据库 - 主要代表:MongoDB,Redis,CouchDB。 ## 二者对比 ### 存储方式: SQL数据存在特定结构的表中;而 NoSQL 则更加灵活和可扩展,存储方式可以省是JSON文档、哈希表或者其他方式。 SQL通常以数据库表形式存储数据。举个栗子,存个学生借书数据: ![](https://user-gold-cdn.xitu.io/2019/12/9/16eeb3849e054564?w=1530&h=288&f=png&s=112163) 数据表 而NoSQL存储方式比较灵活,比如使用类JSON文件存储上表中熊大的借阅数据:...

### 什么是闭包 > 维基百科中的概念 - 在计算机科学中,闭包(也称词法闭包或函数闭包)是指一个函数或函数的引用,与一个引用环境绑定在一起,这个引用环境是一个存储该函数每个非局部变量(也叫自由变量)的表。 - 闭包,不同于一般的函数,它允许一个函数在立即词法作用域外调用时,仍可访问非本地变量 > 学术上 - 闭包是指在 JavaScript 中,内部函数总是可以访问**其所在的**外部函数中声明的参数和变量,即使在其外部函数被返回return掉(寿命终结)了之后。 > 个人理解 - 闭包是在函数里面定义一个函数,该函数可以是匿名函数,该子函数能够读写父函数的局部变量。 ### 闭包的常见案例分析 **案例分析是从浅入深希望大家都看完!** - 案例1---基本介绍: ```javascript function A(){ var localVal=10; return localVal;...

## 提出问题: 对于一个做后台不久的我,起初做项目只是实现了功能,所谓的增删改查,和基本查询索引的建立。直到有一个面试官问我一个问题,一条sql查询语句在mysql数据库中具体是怎么执行的?我被虐了,很开心,感谢他。于是开始了深入学习mysql。本篇文章通过 > 一条sql查询语句在mysql数据库中具体是怎么执行的? 来具体讲解mysql的基础架构。 ## 讲解 ``` mysql> select * from Student where ID=1; ``` 上面一条简单的查询语句很简单,但我想好多开发者并不知道在MYSQL内部的执行过程。 #### Mysql基本架构示意图 ![](https://user-gold-cdn.xitu.io/2019/6/4/16b213d4f6080748?w=525&h=754&f=png&s=30746) 从图中可以看出Mysql可以大体分为Server层和存储引擎层两部分。 Server层包括连接器、查询缓存、分析器、优化器、执行器等,这些涵盖了MySQL的大多数核心服务和所有的内置函数(如日期、时间、数学和加密函数等),跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 存储引擎层负责数据的存储和提取,提供数据的读写接口。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。目前开发中最常用的存储引擎是InnoDB,它从MySQL5.5.5版本开始成为默认存储引擎,不过开发者也可以通过指定存储引擎的类型来选择别的引擎。 即使存储引擎不同,但是也会共用一个Server层,接下来对Server层中的执行流程,依次对其作用进行讲解。 #### 连接器 运行查询语句开始查询的前提是第一步先连接数据库,这时候等待你的就是连接器。连接器负责和客户端建立连接、获取权限、维持和管理连接。 常规的开发模式,客户端与服务器需要建立连接。二者在完成经典的TCP握手后,Server层连接器就要开始认证你的身份,这个时候是服务器端代码使用的用户名和密码。 连接器一些内容说明:...

## 前言: 上一篇讲Mysql基本架构时,以“sql查询语句在MySql架构中具体是怎么执行的?”进行了全面的讲解。知道了sql查询语句在MySql架构中的具体执行流程,但是为了能够更好更快的写出sql语句,我觉得非常有必要知道sql语句中各子句的执行顺序。看过上一篇文章的小伙伴应该都知道,sql语句最后各子句的执行应该是在执行器中完成的,存储引擎对执行器提供的数据读写接口。现在开始我们的学习 ## 语句中各子句完整执行顺序概括(按照顺序号执行) 1. from (注:这里也包括from中的子语句) 2. join 3. on 4. where 5. group by(开始使用select中的别名,后面的语句中都可以使用) 6. avg,sum.... 等聚合函数 7. having 8. select 9. distinct 10. order by 11....

# async和await的讲解 ### 声明async函数的几个方法 //普通的函数声明 ``` async function A(){} ``` //声明一个函数表达式 ``` let A=async function(){} ``` //async形式的箭头函数 ``` let A=async ()=>{} ``` ### 初识async和await async与await实例应用,基础代码 控制器调用与server中查询数据 ``` exports.getBlogList =async (ctx,next)=>{...

## 为什么出现Promise 在javascript开发过程中,代码是单线程执行的,同步操作,彼此之间不会等待,这可以说是它的优势,但是也有它的弊端,如一些网络操作,浏览器事件,文件等操作等,都必须异步执行,针对这些情况,起初的操作都是使用回调函数实现。 实现方式如下(伪代码): ``` function One(callback) { if (success) { callback(err, result); } else { callback(err, null); } } One(function (err, result) { //执行完One函数内的内容,成功的结果回调回来向下执行 }) ``` 上述代码只是一层级回调,如果代码复杂后,会出现多层级的回调,代码可读性也会很差,那有没有一种方式,不用考虑里面的内容,直接根据结果成功还是失败执行下面的代码呢?有的,Promise(承诺),在ES6中对Promise进行了同意的规范。 ## Promise的含义...