redux和react-redux

1. redux

首先redux的流程:首先会设置一些监听函数。

1
store.subscribe(listener);

阅读更多

JS类型判定和对象遍历属性方法

JS类型判定

js有六种基本类型:number, string, bool, null, undefined,symbol。还有复杂类型:Array、Function、Object等。
在js中常见类型检查手段的区别:typeof, instanceof, toString。
如果你要判断的是基本数据类型或JavaScript内置对象,使用toString; 如果要判断的时自定义类型,请使用instanceof。

阅读更多

XMLHttpRequest详解

ajax是一种技术方案,但并不是一种新技术。它依赖的是现有的CSS/HTML/Javascript,而其中最核心的依赖是浏览器提供的XMLHttpRequest对象,是这个对象使得浏览器可以发出HTTP请求与接收HTTP响应。
XMLHttpRequest一开始只是微软浏览器提供的一个接口,后来各大浏览器纷纷效仿也提供了这个接口,再后来W3C对它进行了标准化,提出了XMLHttpRequest标准。XMLHttpRequest标准又分为Level 1和Level 2。
XMLHttpRequest Level 1主要存在以下缺点:

阅读更多

js隐式类型转换

1. 隐式转换

涉及隐式转换最多的两个运算符 + 和 ==。
+运算符即可数字相加,也可以字符串相加。所以转换时很麻烦。== 不同于===,故也存在隐式转换。- * / 这些运算符只会针对number类型,故转换的结果只能是转换成number类型。
既然要隐式转换,那到底怎么转换呢,应该有一套转换规则,才能追踪最终转换成什么了。
隐式转换中主要涉及到三种转换:
1、将值转为原始值,ToPrimitive()。
2、将值转为数字,ToNumber()。
3、将值转为字符串,ToString()。

阅读更多

二分查找

1. 二分查找

二分查找是一个基础的算法,二分查找就是将查找的键和子数组的中间键做比较,如果被查找的键小于中间键,就在左子数组中继续查找,如果大于中间键就在右子数中查找,否则中间键就是要找的元素。

阅读更多

服务端推送

http协议通信只能由客户端发起。这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用”轮询”:每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。

阅读更多

节流与防抖

1. throttle和debounce 应用场景

首先,咱们来讲一讲节流和防抖的应用场景。节流和防抖出现的场景一般都伴随着客户端DOM事件的监听,并且一般是触发频率高的DOM事件,比如:scroll、mousemove事件。下面会针对节流和防抖举两个例子,让大家品味一下这两个函数的应用场景。
举个例子,实现一个原生的拖拽功能(不能用 H5 Drag&Drop API),需要一路监听 mousemove 事件,在回调中获取元素当前位置,然后重置 dom 的位置(样式改变)。如果我们不加以控制,每移动一定像素而触发的回调数量是会非常惊人的,回调中又伴随着 DOM 操作,继而引发浏览器的重排与重绘,性能差的浏览器可能就会直接假死,这样的用户体验是非常糟糕的。我们需要做的是降低触发回调的频率,比如让它 500ms 触发一次,或者 200ms,甚至 100ms,这个阈值不能太大,太大了拖拽就会失真,也不能太小,太小了低版本浏览器可能就会假死,这样的解决方案就是函数节流,英文名字叫「throttle」。
函数节流的核心是,让一个函数不要执行得太频繁,减少一些过快的调用来节流。
说完函数节流,再看它的好基友函数去抖(debounce)。思考这样一个场景,对于浏览器窗口,每做一次 resize 操作,发送一个请求,很显然,我们需要监听 resize 事件,但是和 mousemove 一样,每缩小(或者放大)一次浏览器,实际上会触发 N 多次的 resize 事件,用节流?节流只能保证定时触发,我们一次就好,这就要用去抖。简单的说,函数去抖就是对于一定时间段的连续的函数调用,只让其执行一次。
throttle 应用场景:
函数节流有哪些应用场景?哪些时候我们需要间隔一定时间触发回调来控制函数调用频率?

阅读更多

设计模式

1. 单例模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Singleton {
constructor(name) {
this.name = name
this.instance = null
}
getName() {
alert(this.name)
}
static getInstance(name) {
if (!this.instance) {
this.instance = new Singleton(name)
}
return this.instance
}
}

阅读更多

localstorage、sessionstorage、indexedDB的特点和应用场景

对于本地存储空间,在各主流浏览器(包含PC、移动端)竟然惊人的一致,都是 5M 的数量级。当本地存储空间大于5M时,各浏览器都是抛出一个错误 QUOTA_EXCEEDED_ERR 。
那么什么样的数据应该保存在本地存储中呢?有以下几个原则:

阅读更多

CSS备忘

1. 选择器的特殊性

如果一个元素有两个或多个冲突的属性声明,那么有最高特殊性的声明就会胜出。声明也分为重要声明(就是!important)和非重要声明。这两类声明解决冲突的规则入下:

阅读更多