ES6之正则的扩展
RegExp构造函数在ES5中我们可以这样声明一个正则表达式:
1234567var regex = new RegExp('xyz', 'i');// 等价于var regex = /xyz/i;var regex = new RegExp(/xyz/i);// 等价于var regex = /xyz/i;
但是这样会报错,因为第一个参数不是字符串,而是一个正则表达式:
1var regex = new RegExp(/xyz/, 'i');
但是在ES6中支持这种行为,并且如果存在第二个参数,会忽略原有的修饰符:
12var reg = new RegExp(/abc/ig, 'i');console.log(reg); // /abc/i
字符串的正则方法matchmatch 方法会返回一个数组,它包括整个匹配结果,和通过捕获组匹配到的结果,如果没有匹配到则返回null
这个方法在 String.prototype.match() 的内部调用。例如,下面的两个方法返回相同结果。
12' ...
重学数据结构算法
在拉钩1块钱抢了一个算法课程,讲的还不错,记下笔记。
一共有21节课,抽时间看,持续更新。
课程二维码在最后
第一讲时间复杂度和代码结构的关系一些经验性的结论
一个顺序结构的代码,时间复杂度是O(1)
二分查找,或者更通用的说是采用分而治之的二分策略,时间复杂度都是O(logn)
一个for循环,时间复杂度是O(n)
两个顺序执行的for循环,时间复杂度O(n)+O(n)=O(2n),最终也是O(n)
两个嵌套的for循环,时间复杂度是O(n^2)
总结复杂度通常包括时间复杂度和空间复杂度在具体计算复杂度时需要注意:
它与具体的常系数无关,**O(2n)和O(n)**表示的是同样的复杂度
复杂度相加的时候,选择高者作为结果,也就是**O(n^2)+O(n)和O(n^2)**表示同样的复杂度
O(1)是一个特殊的复杂度,即任务与算例个数n无关
时间复杂度与代码结构设计高度相关空间复杂度与代码中数据结构的选择高度相关
第二讲
程序优化降低复杂度,直观的思路:梳理流程,看其流程中是否有无效的计算或者无效的存储常用的降低时间复杂度的方法:
递归、二分法、排序算法、动态规划
降低空间 ...
ES6之字符串的扩展
本文整理一下ES6中字符串的扩展和新增的方法。
可以先去看一下这篇文章彻底弄懂Unicode编码,最好用笔和纸撸两遍,下文转换过程将省略。
字符的 Unicode 表示法在JavaScript中,可以使用\uxxxx表示unicode编码,xxxx表示unicode编码的码点,但是当码点超过\u0000 ~ \uFFFF这个区间,会被截断。比如中文𠮷的码点是0x20BB7,但是在JavaScript中输出的是:
12let a = '\u20BB7';console.log(a); // ₻7
事实上JavaScript只能处理UCS-2 编码。至于什么是UCS-2,两者的关系简单说,就是 UTF-16 取代了 UCS-2,或者说 UCS-2 整合进了 UTF-16。所以,现在只有 UTF-16,没有 UCS-2。所以我们把这个码点转化为utf-16双字节表示:
12let a = '\uD842\uDFB7';console.log(a); // 𠮷
所以ES6 对这一点做出了改进,只要将码点放入大括号,就能正确解读该字符。
12let ...
ES6之解构赋值
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
数组的解构赋值基本用法左右两边模式相同,即可赋值:
12345let [a,b] = [0,1];console.log(a,b) // 0 1let [a,b,[c]] = [0,1,[3]]console.log(a,b,c) // 0 1 3
左右两边模式不完全相同,可以成功赋值部分:
12345678let [a,b,c] = [0,1];console.log(a,b,c) // 0 1 undefinedlet [a,b] = [0,1,2];console.log(a,b) // 0 1let [a,...b,c] = [0,1,2,3];console.log(a,b,c) // 0 [ 1, 2, 3 ]
事实上,只要某种数据结构具有 Iterator 接口(后面会说到),都可以采用数组形式的解构赋值:
12345678910function* fibs() { let a = 0; let b = 1; while (true) { ...
ES6之let和const
我前面写过一篇整理es6的文章关于ES6。但是好像太监了。。。因为太长了。
然后不幸的是前两天面试被问到了es6的数组扩展方法,刚好我没看到。。这是一个悲伤的故事,所以我决定看阮一峰老师的ECMAScript 6 入门。这次一章一章的整理。尽量做到完全弄懂。
let命令没错,又是let,我已经写了不知道多少次了。。。没事多看几次加深理解嘛。。
基本用法123456{ let a = 1; var b = 2;}console.log(a); // ReferenceError: a is not definedconsole.log(b); // 2
经典问题正常的for循环:
1234for(var i = 0; i < 6 ; i ++){ console.log(i); // 循环打出 0-5}console.log(i); // 6
正常循环中使用异步调用:
123456for(var i = 0; i < 6 ; i ++){ setTimeout(()=>{ console.log(i) ...
JavaScript中的this
默认绑定规则this的指向在函数定义的时候是无法确定的,只有在函数执行的时候才能确定。
因为浏览器和node.js的全局对象有一些区别。
在浏览器中:
12345function A(){ console.log(this.a); // 1}var a = 1;A()
但是在node.js中:
1234567function A(){ console.log(this.a); // undefined console.log(this.global.b); // 2}var a = 1;b = 2;A()
从上面的代码中可以看出:
浏览器的this是window对象,node.js的this包含的东西更加多,其中有this.global就是node.js中的全局对象。
node.js的全局变量必须使用无修饰符b=2或者global.b=2的方式来声明。
补充:
严格模式下use strict,浏览器的函数内部this指向为undefined,而node.js的this为空对象{}。
严格模式下浏览器全局变量只可以使用 ...
跨域和同源策略
虽然经常遇到和处理跨域的问题,但都是停留于用node的中间件,使用CORS的方式来允许跨域。
这篇文章主要理解跨域和同源策略,就不详细的描述解决方案了,因为跨窗口通信和iframe这些东西作为后端没怎么接触过。
跨域跨域是指一个域下的文档或脚本试图去请求另一个域下的资源。
受浏览器的同源策略限制,无法跨域请求资源,这也是我们。
同源策略所谓同源:
协议相同。
域名相同
端口相同
1234http://www.example.com/dir2/other.html:同源http://example.com/dir/other.html:不同源(域名不同)http://v2.www.example.com/dir/other.html:不同源(域名不同)http://www.example.com:81/dir/other.html:不同源(端口不同)
Internet Explorer 的同源策略有两个主要的差异点:
授信范围(Trust Zones):两个相互之间高度互信的域名,如公司域名(corporate domains),则不受同源策略限制。
端口:IE 未将端口号纳入到同 ...
缓存方案
emm…我觉得我学东西就和js的原型链一样,怎么学着学着奇怪的知识就增加了…本来要学的东西一直被挂起….
强制缓存实现方式强制缓存是通过http请求头里的Cache-Control和Expire字段来控制。
Expires是HTTP1.0标准下的字段,所以暂时忽略吧。
以node.js为例:
一般我们这样设置res.setHeader('Cache-Control', 'public, max-age=xxx');,代表xxx秒内访问该资源,均使用本地缓存,不在向服务器发起请求。
缺点如果在xxx秒内,服务器更新了资源,客户端在没有强制刷新的情况下获取到的还是旧的资源。
如果后端发布了新版本,弃用了部分旧的接口,但是客户端由于缓存的存在,还是会调用旧的接口。。
协商缓存实现方式Etag和Last-Modifie
每次都要向服务器验证一下缓存的有效性。
缺点很麻烦,缓存失去了意义。
混合使用HTML:使用协商缓存。
Etag:Etag 响应头字段表示资源的版本,浏览器在发送请求时会带 If-None-Match 头字段, 来询问服务器该版本是否仍然可 ...
hexo搜索转圈问题
今天hexo的搜索功能一直转菊花,对于我这种强迫症来说,博客没有搜索也太难受了吧。
google了一下发现很多人也遇到了这个问题。
说一下我的解决步骤吧。
原因我打开控制台,点击搜索,获取search.xml文件时,并没有报错。
所以我的博客的原因是因为xml文件有特殊字符。
于是我先打开vscode设置,把editor.renderControlCharacters 设置为true,用正则的方式去搜索如下内容
1;/[\u0000]|[\u0001]|[\u0002]|[\u0003]|[\u0004]|[\u0005]|[\u0006]|[\u0007]|[\u0008]|[\u000b]|[\u000c]|[\u000d]|[\u000e]|[\u000f]|[\u0010]|[\u0011]|[\u0012]|[\u0013]|[\u0014]|[\u0015]|[\u0016]|[\u0017]|[\u0018]|[\u0019]|[\u001a]|[\u001b]|[\u001c]|[\u001d]|[\u001e]|[\u001f]|[\u001c]|[\u007f]/g ...
javascript原型链
阮一峰老师的说原型链开始是为了解决继承的,因为JavaScript没有子类父类的概念,只有原型对象。
看着别人的讲解,自己跟着画了张图加深理解,对比着图比较容易理解。
什么是prototype、__proto__和constructor?
__proto__:事实上就是原型链指针
prototype:是原型对象
constructor: 每一个原型对象都包含一个指向构造函数的指针
大多说情况下,__proto__可以理解为构造器原型,举个例子。
```function A(){}var a = new A();a.proto === A.prototype; // 这里A是a的构造函数12345678910111213141516171819202122232425262728#### JavaScript的构造函数? 在java中,构造函数可以理解为,实例化类时用来初始化类的函数,但是JavaScript中,构造函数是指**使用`new`来调用的函数,和函数无关,只和调用方式有关。**#### `prototype`和`__proto__`的区别?- `prototy ...