算法之路——腐烂的橘子

题目

在给定的网格中,每个单元格可以有以下三个值之一:

  • 0 代表空单元格;
  • 1 代表新鲜橘子;
  • 2 代表腐烂的橘子。

每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。

返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1

阅读全文

算法之路——设计一个有getMin功能的栈

题目

实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

要求

  1. pop、push、getMin操作的时间复杂度都是O(1)。
  2. 设计的栈类型可以使用现成的栈结构。

阅读全文

Ajv:高效的JSON模式校验器

一直想写一个优秀开源npm包的分享与学习系列,长久写,持续写。但深知坚持不容易,且万事开头难。

今天刚好有些闲暇,在看一些webpack loader源码的时候,发现一个不错的包——Ajv,有了一种想学习和分享之的冲动。于是这个系列就有了开头。

官网

https://ajv.js.org/,官网上有如下描述:

The fastest JSON-Schema validator for Node.js and browser. Supports draft-04/06/07.

阅读全文

检测“资源”是否初始化完成的简单方法

标题实在不知道怎么写了,感觉怎么写都有点不太准确。简单描述下场景。

比如在hybrid开发时,使用JsBridge提供操作给js,如果提供的操作需要在web页面加载完立即调用(如埋点日志之类的),可能调用失败,即使是在window.onload里调用也未必能获取到,而系统又没有提供准确的监听事件来判断,所以通常的做法可能会是这样的:

1
2
3
setTimeout(() => {
// TODO 调用jsBridge提供的方法
}, 600)

延迟一小段时间再去执行,这种方法虽然可行,但总觉得很蛋疼。因为虽然JsBridge不会立即加载完成,但不同的系统下或由于缓存的情况下,加载时间各不相同。

阅读全文

babel-polyfill和transform-runtime揭秘

当前前端的开发,已经基本离不开babel的使用了。

babel下两员大将babel-polyfilltransform-runtime也经常出现在各位前端同胞的业务及库的开发中,让我们得以欢快地使用js的各种高级语法以及牛X的api。可虽说是如此常用,很多前端同胞甚至是前端老司机也常常搞不清二者的关系,以至陷入莫名的疑惑当中。

正在这个时候,一名不愿露面的网友,本着刨根问底的钻(qiu)研(nue)精神,一窥二者的本质,向大家聊一聊两者的关系。

阅读全文

flex布局学习之实战篇

上一篇文章学习了Flex布局的语法,今天来个经典的布局实例练练手。

圣杯布局

圣杯布局由页头 (header),中间部分 (center),页脚 (footer),和三栏组成。中间的一栏是主要内容,左边和右边提供如广告、导航的链接。

大部分的 CSS 解决方案都是以下列为目标:

  • 边栏应流动居中,定宽。
  • 中间一栏 (主要内容) 在 HTML 源码中应该首先元素出现。
  • 所有栏同高,忽略实际高度。
  • 使用的 HTML 标记尽量少。
  • 当页面内容不够充满页面时,页脚应“粘”在底部。

阅读全文

flex布局学习之语法篇

Flex布局也已经用了挺久了,但总感觉用得不够透,于是抽空再系统学习下。

使用

如下即定义了一个flex容器,内联或块取决于给定的值。它的所有直接子元素将自动成为容器成员。

1
2
3
.box {
display: flex; /* or inline-flex */
}

注意:设为 Flex 布局以后,子元素的float、clear和vertical-align属性将失效。

阅读全文

Vue中nextTick方法的实现

先来看一道题:

1
2
3
4
5
6
7
8
9
10
11
12
setTimeout(function() {
console.log(1)
}, 0)
new Promise(function(resolve) {
console.log(2)
resolve()
}).then(function() {
console.log(3)
})
console.log(4)

// 输出结果是 2 4 3 1

阅读全文

js缓存技术的实现

在编写javascript代码时,适当地使用缓存技术可以提高数据的重复使用率,以达到优化性能的目的。

最直接最暴力的做法是,直接创建一个没有原型的空对象,然后一股脑的往里塞数据:

1
2
3
4
var _data = Object.create(null) // 这是我们实现的缓存对象(捂脸)
_data['foo'] = 123
_data['bar'] = 'hello kitty'
_data['author'] = {name: '歪闹', blog: 'http://iwhynot.me'}

阅读全文

使用属性表达式获取对象属性值

在Vue1.x版本里有个vm.$get(expression)方法,可以根据表达式获取vm上绑定的数据的值,并能进行一些简单的算术运算。在Vue2的版本里,这个方法被废弃了。但是在一些特殊场景下,我们可能还是需要这样一种方便获取对象属性值的方法。

阅读全文