Minimal and Clean blog theme for Hugo
组件化
- 减少重复代码
- 即便没有复杂的逻辑,只是重复的UI元素,也可以封装成组件,以便重复使用,减少重复代码。
- 封装逻辑
- 相关的函数、变量和DOM元素封装成一个组件,降低复杂度。需要的话,暴露出参数用于复用。
- 复用
- 功能逻辑可以是通用的,比如背景图、颜色、文字等可能变化,也可以重复使用一个组件在不同的地方传不同的参数。
深浅拷贝
什么是拷贝,什么是深浅拷贝
在 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不是基本类型时就对它进行拷贝。该方法有一个明显的问题,当出现循环引用时,就进入了一个死循环。
…JavaScript变量类型
变量类型的值分为基本类型和引用类型。
基本类型有五种:String、Number、Boolean、Undefined和Null。
引用类型是对象。对象中又有宿主对象和原生对象的区别。
宿主对象是环境提供的对象。比如DOM对象:window、document;BOM对象:history、location、navigator等。
原生对象是JavaScript语言提供的,比如Math、Array、Date、RegExp等,还有ES6的Set、Map等。
…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;
MySQL表结构
修改表结构
- 查看列:
desc 表名;
- 修改表名:
alter table t_book rename to bbb;
- 添加列:
alter table 表名 add column 列名 varchar(30);
- 删除列:
alter table 表名 drop column 列名;
- 修改列名MySQL:
alter table bbb change nnnnn hh int;
- 修改列名SQLServer:
exec sp_rename't_student.name','nn','column';
- 修改列名Oracle:
lter table bbb rename column nnnnn to hh int;
- 修改列属性:
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:空间索引。
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;
Git记住密码
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
Git分支操作
如何准备面试
我现在想换个工作,所以要准备面试,但是如何准备还没有完全想好。这里记录一下我想到的面试可能包含的内容。
面试应该分几个部分。首先是「基础知识点」的考察,这一步是必须的,来验验这个人是能否完成基本的编码工作,这步表现的可以的话应该能拿最低薪水。然后会「聊项目」,这步需要了解在项目中承担了哪些工作,在团队协作中扮演什么角色12,如果发现你的能力比较工资会多一些。最后是些人事相关的「非技术问题」,比如期望薪资、福利待遇、为什么离职等等。这几部分又该如何准备呢?
基础知识
基础知识可以分为几个部分:语言、框架/库、算法。这些网上都有很多资料,需要筛选出高质量的内容。
我打算现在 Github 上找到那个最著名的前端面试题库,写一个博客记录我的回答。基础搞定以后要复习 React/Vue 原理,主要是「虚拟DOM」「Diff算法」「异步渲染」「Hook原理」,还有一些常用的 API 。另外有些浏览器相关的,比如重绘、缓存、CORS等。准备算法我要继续看《算法》这本书,掌握几个常用常考的算法。
这个过程中遇到的所有知识,把不会的记录到博客中,会的也要重新整理博客。这些博客像「错题本」一样用来巩固知识。
聊项目
这里需要仔细回想你在团队协作中扮演的角色。只是现实功能的话,就要对相关的技术熟一些。如果做了些代码设计工作,可能需要聊一下思路,遇到的问题等等。如果除了完成功能开发外还有其他贡献。比如发现A问题,你开发了B工具解决它,提高了工作效率/代码质量。发现了C问题,重新设计了D代码,将C问题重构/优化。或者为团队/公司解决了什么难题、帮助同事解决了什么问题。
这些工作都能体现你能力的高低,要「仔细」地想出来,并组织语言准备讲给面试官听。
拿我来说。我开发过工具提高工作效率,规范 Git 的使用方式。为项目补充文档,优化旧代码降低复杂度,设计组件优化代码,设计新的架构替换旧架构降低复杂度。帮助同事设计组件。为团队解决若干技术难题。制定并代码规范提高代码可读性,降低复杂度。
非技术问题
最重要的是薪资,如果前面聊的顺利,这里可以多说一点,因为公司一般都会还价。其他福利也很重要,有没有年终奖/项目奖金,会写在合同里吗,公积金交多少。
-
角色大概可以分为「初中高级」。承担的工作如果都是「实现xx功能」之类的,大概是初级的水平;如果功能、模块、组件这些能自己设计,大概能算中级水平;再高级点的工作,指导别人工作,搞一些工具、组件、方法提高工作效率,解决难题,这就算是高级了。
https://twitter.com/haoel/status/1253910100668022784?s=20 ↩︎ -
初级:在给出指导和具体实施细节后,能独立按时按量(数量和质量)完成工作。
中级:不用指导和具体实施细节,能独立的按时按量(数量和质量)完成工作。
高级:解难题(能解决业务或技术难题),传帮带(能指导培养初中级人员),标准化(能沉淀出可复制或可复用的方法论或工作方式,提高生产效率) ↩︎