Minimal and Clean blog theme for Hugo

组件化


减少重复代码
即便没有复杂的逻辑,只是重复的UI元素,也可以封装成组件,以便重复使用,减少重复代码。
封装逻辑
相关的函数、变量和DOM元素封装成一个组件,降低复杂度。需要的话,暴露出参数用于复用。
复用
功能逻辑可以是通用的,比如背景图、颜色、文字等可能变化,也可以重复使用一个组件在不同的地方传不同的参数。
Read more ⟶

深浅拷贝


什么是拷贝,什么是深浅拷贝

在 JavaScript 中,变量中保存的是对象的引用。比如像下面这样的操作

var a = 对象1;
var b = a;

a和b都在引用对象1,如果对对象1进行修改,则a和b两个变量都会受到影响,有时我们不希望出现这种情况,就要对对象进行拷贝操作来切换引用。比如

var a = 对象1;
var b = 拷贝(a);

那么如何实现拷贝呢?

我们知道对象是由多个key和value组成的,所以拷贝就是创建一个新的对象,将旧对象的key和value拷贝到新对象中,让新旧对象的key和value完全一样。比如像下面这样

Object.keys(对象1).forEach(key => {
  新对象[key] = 对象1[key];
})

这样的操作需要注意value的类型,分为基本类型和引用类型1,如果所有的value都是基本类型,但是如果value是引用类型就会出现新旧对象中都引用了一个对象的情况,也就是上文提到的a和b变量的问题。..如果想完全切断引用,就要对引用类型的value在进行一次拷贝..。对于是否需要完全切断引用就有了两种拷贝方式,需要完全切断引用的就是「深拷贝」,不需要的就是「浅拷贝」。

简单概括一下。

「浅拷贝」是只对对象的key和value进行一次遍历拷贝,不管内部的引用。

「深拷贝」要将对象内部的引用完全切断,对对象进行递归地拷贝。

如何实现深拷贝

先看一种实现方式

 1function clone(旧对象) {
 2  var 新对象 = {};
 3  Object.keys(旧对象).forEach(key => {
 4    var value = 旧对象[key];
 5    if(is基本类型(value)) {
 6      新对象[key] = 旧对象[key];
 7    } else {
 8      新对象[key] = clone(value); // 递归
 9    }
10  })
11  return 新对象;
12}

这种方法用的是递归,即当value不是基本类型时就对它进行拷贝。该方法有一个明显的问题,当出现循环引用时,就进入了一个死循环。

Read more ⟶

JavaScript变量类型


变量类型的值分为基本类型和引用类型。

基本类型有五种:String、Number、Boolean、Undefined和Null。

引用类型是对象。对象中又有宿主对象和原生对象的区别。

宿主对象是环境提供的对象。比如DOM对象:window、document;BOM对象:history、location、navigator等。

原生对象是JavaScript语言提供的,比如Math、Array、Date、RegExp等,还有ES6的Set、Map等。

Read more ⟶

MySQL增删改查


create

INSERT INTO tasks(subject,start_date,end_date,description)
VALUES('Learn MySQL INSERT','2017-07-21','2017-07-22','Start learning..');

read 左右链接

SELECT
    plugin_of_user.id, plugin_of_user.user_plugin_name,
    plugin_info.name, plugin_info.avatar, plugin_info.link, plugin_info.type
FROM plugin_of_user
RIGHT JOIN plugin_info
ON plugin_of_user.plugin_id=plugin_info.id
WHERE plugin_of_user.user_id = ?

update

UPDATE [LOW_PRIORITY] [IGNORE] table_name 
SET 
    column_name1 = expr1,
    column_name2 = expr2,
    ...
WHERE
    condition;

无则添加,有则修改

insert into student
  (number, name) 
values
  (45,‘张三’)
ON DUPLICATE KEY UPDATE 
number = 46, name = ‘李四’;

delete

DELETE FROM table_name
WHERE condition;
Read more ⟶

MySQL表结构


修改表结构

  1. 查看列:desc 表名;
  2. 修改表名:alter table t_book rename to bbb;
  3. 添加列:alter table 表名 add column 列名 varchar(30);
  4. 删除列:alter table 表名 drop column 列名;
  5. 修改列名MySQL: alter table bbb change nnnnn hh int;
  6. 修改列名SQLServer:exec sp_rename't_student.name','nn','column';
  7. 修改列名Oracle:lter table bbb rename column nnnnn to hh int;
  8. 修改列属性:alter table t_book modify name varchar(22);

唯一性约束

建表时加上唯一性约束:

CREATE TABLE `t_user` (
    `Id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(18) NOT NULL unique    `password` varchar(18) NOT NULL    PRIMARY KEY (`Id`) ENGINE=InnoDB AUTO_INCREMENT=1018 DEFAULT CHARSET=gbk; 

给已经建好的表加上唯一性约束:

ALTER TABLE `t_user` ADD unique(`username`);

或者:

create unique index UserNameIndex on 't_user' ('username');

索引

mysql索引类型

  • primary:唯一索引,不允许为null。
  • key:普通非唯一索引。
  • unique:表示唯一的,不允许重复的索引,可以为null。
  • fulltext: 表示全文搜索的索引。 FULLTEXT用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的INDEX 也可以。
  • spatial:空间索引。
Read more ⟶

MySQL数据类型


varchar

varchar(666),其中参数666为字节数。

varchar是可变长度的字符串,大小为0-65535字节。对应的字符串长度会受到字符集影响,若使用utf-8存储汉字,一个汉字字符对应3个字节。

varchar还需要存储数据长度,当小于等于255个字节时,使用1个字节存储长度。大于255长度时,使用2个字节存储长度。

比如varchar(666),使用2个字节存储长度,剩下的664个字节存储实际内容,

text

TEXT数据不存储在数据库服务器的内存中,因此,每当查询TEXT数据时,MySQL都必须从磁盘读取它,这与CHAR和VARCHAR相比要慢得多。 ![mysql文档][image1]

mysql的性能只有在上千万条纪律的时候才需要考虑。 ——潘老师

DATETIME

将js的Date对象传进去,会直接保存,查出来返回到前端页面时,可以这样使用new Date(props.time)转换成Date对象。

没有布尔值,使用tinyint

CREATE TABLE IF NOT EXISTS `ed_class_price_user`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `user_name` VARCHAR(200) NOT NULL unique,
   `password` VARCHAR(200) NOT NULL,
   `disable` TINYINT DEFAULT 0,
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
Read more ⟶

Git记住密码


如果操作远程仓库时每次都要输入账号密码,可以通过设置让git记住密码…
Read more ⟶

Git设置代理


全局设置

git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'

全局取消

git config --global --unset http.proxy
git config --global --unset https.proxy

只对github.com

git config --global http.https://github.com.proxy socks5://127.0.0.1:1080

取消代理

git config --global --unset http.https://github.com.proxy

配置文件

windows: 在 ~/.gitconfig文件中

[http "https://github.com"]
  proxy = socks5://127.0.0.1:10808
Read more ⟶

Git分支操作


常用的Git分支操作…
Read more ⟶

如何准备面试


我现在想换个工作,所以要准备面试,但是如何准备还没有完全想好。这里记录一下我想到的面试可能包含的内容。

面试应该分几个部分。首先是「基础知识点」的考察,这一步是必须的,来验验这个人是能否完成基本的编码工作,这步表现的可以的话应该能拿最低薪水。然后会「聊项目」,这步需要了解在项目中承担了哪些工作,在团队协作中扮演什么角色12,如果发现你的能力比较工资会多一些。最后是些人事相关的「非技术问题」,比如期望薪资、福利待遇、为什么离职等等。这几部分又该如何准备呢?

基础知识

基础知识可以分为几个部分:语言、框架/库、算法。这些网上都有很多资料,需要筛选出高质量的内容。

我打算现在 Github 上找到那个最著名的前端面试题库,写一个博客记录我的回答。基础搞定以后要复习 React/Vue 原理,主要是「虚拟DOM」「Diff算法」「异步渲染」「Hook原理」,还有一些常用的 API 。另外有些浏览器相关的,比如重绘、缓存、CORS等。准备算法我要继续看《算法》这本书,掌握几个常用常考的算法。

这个过程中遇到的所有知识,把不会的记录到博客中,会的也要重新整理博客。这些博客像「错题本」一样用来巩固知识。

聊项目

这里需要仔细回想你在团队协作中扮演的角色。只是现实功能的话,就要对相关的技术熟一些。如果做了些代码设计工作,可能需要聊一下思路,遇到的问题等等。如果除了完成功能开发外还有其他贡献。比如发现A问题,你开发了B工具解决它,提高了工作效率/代码质量。发现了C问题,重新设计了D代码,将C问题重构/优化。或者为团队/公司解决了什么难题、帮助同事解决了什么问题。

这些工作都能体现你能力的高低,要「仔细」地想出来,并组织语言准备讲给面试官听。

拿我来说。我开发过工具提高工作效率,规范 Git 的使用方式。为项目补充文档,优化旧代码降低复杂度,设计组件优化代码,设计新的架构替换旧架构降低复杂度。帮助同事设计组件。为团队解决若干技术难题。制定并代码规范提高代码可读性,降低复杂度。

非技术问题

最重要的是薪资,如果前面聊的顺利,这里可以多说一点,因为公司一般都会还价。其他福利也很重要,有没有年终奖/项目奖金,会写在合同里吗,公积金交多少。


  1. 角色大概可以分为「初中高级」。承担的工作如果都是「实现xx功能」之类的,大概是初级的水平;如果功能、模块、组件这些能自己设计,大概能算中级水平;再高级点的工作,指导别人工作,搞一些工具、组件、方法提高工作效率,解决难题,这就算是高级了。
    https://twitter.com/haoel/status/1253910100668022784?s=20 ↩︎

  2. 初级:在给出指导和具体实施细节后,能独立按时按量(数量和质量)完成工作。
    中级:不用指导和具体实施细节,能独立的按时按量(数量和质量)完成工作。
    高级:解难题(能解决业务或技术难题),传帮带(能指导培养初中级人员),标准化(能沉淀出可复制或可复用的方法论或工作方式,提高生产效率) ↩︎

Read more ⟶