JavaScript对象的常见操作

工作也算是稳定了,不过理想和现实的差距还是很大。程序员的职责是把枯燥的工作自动化,而不是去进行重复劳动。最近在写 JavaScript 程序的时候,遇到了很多对象相关的操作。所以写点东西来总结下这半个月的成长。

# JavaScript 对象复制

JavaScript 对象默认全部是拷贝引用,也就是所谓的浅拷贝。所以我们在对象操作的时候,要记住是否需要进行拷贝。一般我们使用对象的时候,都是需要对其某个属性进行修改。所以正确的写法是:

const bar = { a: 1, b: 2, c: {d: 4}}
const foo = {...bar, b: 3}
foo.c.d =10
console.log(bar.c.d)
// { a: 1, b: 2, c: {d: 10}}
1
2
3
4
5

这样就同时进行拷贝和修改。注意这里使用的是 JavaScript 的 es6 语法。如果要在浏览器运行,你需要 Babel (opens new window) 来进行转换。注意,如果对象里面还有对象的话,这种方式也仅仅是浅拷贝。深拷贝必须遍历所有属性进行复制,在效率上有很大问题,所以我们尽量不要去用深度拷贝来解决问题。 这里对象的复制是使用的Object.assign (opens new window) 针对对象的简单类型可以进行复制,但是对象还是引用。如果实际的应用场景确实需要进行深度拷贝,可以使用Lodash (opens new window)。提供了很多常用的类库。

# JavaScript 数组

针对数组,现在已经不推荐用 for 循环来进行处理了,请使用数组的map (opens new window), filter (opens new window)reduce (opens new window)来处理数组的操作。相信这三个方法足以满足需求。

# JavaScript 开发规范

现在 JavaScript 已经是 es6 的时代,所以我们也需要顺应时代学习新知识。这里我建议大家读读 airbnb 的JavaScript Style Guide (opens new window)。这里不仅教会你正确的编码格式,更多的是优秀的写法。如何合理的拷贝对象,遍历数组等等。

目前就写到这里,工作之后并没有多少成长。写博客都发呆了很久该写什么。。。

CSS笔记和杂谈

这应该是最长的一次博客断更吧。。。因为年后辞职加上来日本工作的原因。导致很长时间都没有更新自己的博客了。很是惭愧,本来定的目标就是每月一篇很简单的任务。但居然空档了这么长时间,这就是正所谓的生于忧患死于安乐吧。找到了工作就松懈了,所以今天又重新捡起来继续写。公司的新人课题是做一个简单的 CMS 网站,也算重新复习了一下网页制作吧,因为一直在写 JS 的项目,基本的 HTML 和 CSS 的设计都有点生疏了。。。

# CSS 一行多列设计

这是一个最基本的设计布局。在一行上有多列的内容,最简单的例子是导航栏。HTML 的大致结构是这样的:

<ul>
  <li>HTML/CSS</li>
  <li>JavaScript</li>
  <li>CMS</li>
</ul>
1
2
3
4
5

默认的话,这三列内容是向下排列的,如何让它们横着排列呢?这时候有三种解决方案:第一,是采用float使得所有的li列表浮动表示在一行。但这时候记得使用clear去清除浮动属性。这种设计方案的好处是兼容性强,但新手容易处理不好float属性对布局的影响和忘记清除float属性。第二种解决方案是对li使用display:inline-block;使得li并排一行,这种方案的好处是容易理解和兼容性高。但如果li之间的 HTML 源代码有回车的话会导致相邻的li有很细微的间距。所以对像素级别的设计方案来说并不推荐。第三种方案是使用flex布局。这是目前来说最灵活的一种布局方案了,特别对于多屏幕自适应来说非常友好。但是对浏览器版本要求比较高,IE11 以下都不支持。所以这个简单的布局方案要根据自己的业务情况进行具体选择,并没有银弹。

# 子 DIV 溢出方案

有些时候根据需求我们设计的子 DIV 要比父 DIV 超出一定范围,这时候要怎么设计才好呢?有时候会想到利用position: relative;来改变子 DIV 的文档流进行实现。但这种方式实在是不推荐,因为会影响父 DIV 在页面的布局。我建议的解决方案是使用margin来进行溢出,margin不仅可以输入正数,也可以使用负数。当使用负数的时候就会朝反方向扩展达到溢出的目的。

# 多行文字垂直居中

实际开发中,我们经常会遇到这种常见的需求,对于一行文字来说,很简单,我们只要把heightline-height设置成一样的高度就可以了。但是对于多行文字的话,我们还是需要一些技巧的。首先,我们需要在文字外面再套一层元素进行设置。HTML 结构大致是这样:

<div>
  <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
</div>
1
2
3

然后我们在div上设置heightline-height一样高,使得span元素保持垂直居中。然后再修改span元素的 CSS 属性,设置正常的 line-height 和display: inline-block;以及vertical-align: middle;

# 参考

remove-whitespace-inline-block (opens new window)

display (opens new window)

Vertical align multiple lines of text (opens new window)

Golang语言学习分享

Golang 语言是谷歌开发的编程语言,虽然运行效率比不上 C 语言那么高效,但是也算比 C 语言更容易开发,因为内置了很多数据结构和借鉴了其它语言的优点,容易学习和开发。在实习的阶段也使用 Go 语言开发了一个简单的项目。所以想把学习的一些经验记录下来。

# Golang 的安装

我推荐使用 Linux 系统来学习和使用 Golang 语言,各种发行版的包管理器应该默认都会有 Golang 的安装包。不过还是要说下如何手动安装,去官网下载 Golang 的安装包,至少要 1.7 版本以上。 然后解压缩和配置环境变量,过程很简单。

# Golang 入门

首先,请大家阅读官方的这篇文档How to Write Go Code (opens new window)。这篇文章介绍了如何写一个基本的 Golang 程序和类,这里要说的是GOPATH,使用 Golang 语言必须要设置GOPATH环境变量,可以通过使用go env来查询 Golang 相关的环境变量。GOPATH下一般有三个文件夹 bin,src,pkg。src 下存放我们写的 Golang 项目,bin 下是编译好的二进制文件,pkg 文件夹下是生成的库文件。我们安装的第三方库也会存放在 src 文件夹下,记住 Golang 引用的包名的根文件夹是GOPATH的 src 文件夹,所以我们一般都要使用绝对路径来引用包避免出现错误。

还有要注意的一点是,需要编译的 Golang 项目必须放在GOPATH下的 src 文件夹下,否则编译的时候无法正确的找到相关的依赖包。Golang 还有一个好处就是可以直接以二进制文件的方式运行,只依赖系统的 glibc。所以部署的时候特别方便,不像其他语言一样必须安装相应的解释器。

# Golang 依赖问题

开发程序肯定会使用各种第三方依赖,目前 Golang 语言的各种库都是存放在 github 上,国内下载很不方便,所以要让每个开发者都去下载一份依赖确实很不友好。还好 Golang 在 1.7 版本以上直接 vendor。如果项目里有 vendor 文件夹,Golang 会首先读取这个文件夹作为依赖来使用。使用 Golang vendor 的方法很简单:

go get -u -v github.com/kardianos/govendor
govendor init
govendor add +external
1
2
3

这三个步骤分别是安装,初始化,和添加依赖。这样就在项目本身里面添加了依赖,协同开发的时候大家也没必要再去更新一份,非常方便。

# Golang 性能分析

在开发高性能多并发程序的时候,对系统的实时响应要求很苛刻,这就需要使用专业的分析工具来进行代码分析,确定出耗时代码进行相应的优化。好在 Golang 本身提供了这个工具pprof,这个工具可以列出具体每个函数的耗时,还能进一步跟踪函数里面的具体细节,定位耗时代码。

# Golang 序列化

在开发程序的过程中,为了操作方便,我们会定义各种各样的结构体来表示数据。很多情况下,结构体需要进行网络通讯,这时候我们就不得不序列化结构体进行网络发送。就像前端开发中把 JSON 对象转换成字符串发送出去一样。但是序列化却是一个很耗时的过程,处理不当就会成为系统的瓶颈所在。所以我列举出了几种序列化方案,推荐大家使用。我最后选择的是gencode

# 好用的 Golang 项目推荐

Github 有很多不错的 Golang 项目可以学习借鉴,例如Go Git Service (opens new window),就是一个非常好用的代码托管项目。

# 参考

pprof (opens new window)

Golang Serializer Benchmark Comparison (opens new window)

awesome-go (opens new window)