JS优化
##避免重复创建函数对象,分配过多的内存
Bad:
Good:
|
|
尽可能最小化对象大小
Bad:
对象用又创建了新的数组
Good:
参数直接放入当前的属性
##避免重复创建函数对象,分配过多的内存
Bad:
Good:
|
|
Bad:
对象用又创建了新的数组
Good:
参数直接放入当前的属性
近两年全栈开发的概念越发的火了,很多公司也都开始招聘这方面的人才,一人能做多种活,省成本啊。全栈是非常考研个人学习能力的,要会的东西多,范围广;我也做了这么多年技术,也简单总结下技术学习的看法。
现在的技术圈发展太快,可以说每月都会有新的黑科技出现,对程序员的考验也是非常大;我们在面对这些新的技术时所要做的应该是先学会用,能开发,再考虑是否要深入学习底层知识;有时架构和底层的东西是有共通性的,例如web架构普遍都会采用MVC,httpserver都是基于tcp等,无论用哪种语言开发都离不开这些概念,但是使用的方式又是各不相同,需要我们能快速掌握,举一反三;而全栈技术需要各方面都会。
|
|
同样的代码在node下和chrome下执行的结果是不同的:
chrome下输出6,而node却是将整个function打出
|
|
firefox下和node类似输出
|
|
可以在console下展开查看内容
而我起初一直以为重写function的toString方法是必须在他的prototype上重写的,但是发现在prototype重写后尽然不是我想要的
chrome下输出
node下输出
firefox下和之前类似输出,只是这次toString方法在prototype属性中
Google了下,发现prototype定义的方法是给他的实例或者他子类的实例用的,所以f1不会去调用,修改成这样后才会调用
|
|
当然此代码在node和firefox下仍然不能正常输出结果,也不知道是为什么!
正常情况下删除cookie就是调用setcookie方法,并且将过期时间设置为之前的时间;但是如果添加cookie的时候设置了path或者domain参数的话可能就会产生问题。
比方:
setcookie('test','a',time()+3600,'/');
设置test一个小时后过期,路径在’/‘,域名默认是当前的域名,比如是’www.explame.com’,然后当去删除的时候
setcookie('test','a',time()-24*3600,'/','www.explame.com');
如果这样写是无法删除的,因为setcookie时默认会在域名前加“.”号,就变成’.www.explame.com’,所以这样写会去删除’.www.explame.com’域名下的test的cookie,而之前添加的并没有删除,解决方法其实就是添加的时候怎么写,删除的时候也怎么写,就是过期时间修改下。
表面上的差异是“先与后”,使用函数表达式的方式,调用必须在表达式之后,而函数声明则无关前后问题。
|
|
可以看到 foo 的声明是写在 alert 之后,仍然可以被正确调用,因为 JavaScript 解释器会将其提升到 alert 前面,而以函数表达式创建的函数 bar 则不享受此待遇。
那么bar 究竟有没有被提升呢,其实用 var 声明的变量都会被提升,只不过是被先赋值为 undefined 罢了,所以第二个 alert 弹出了 undefined。这具体要涉及到js的变量对象和执行环境概念
|
|
以上代码hereOrThere函数声明两次,声明首先提升了优先级,并且第二次声明覆盖了第一次声明。
|
|
以上代码hereOrThere表达式写法两次。
执行顺序是解释器先声明hereOrThere变量,此时值是undefined,然后将返回here的函数赋值,接着alert调用。这里因为是声明的变量,而js中不会对变量提升优先级,所以是顺序执行。
社区内比较受推崇,因为用起来相对比较简单
特性:
redux的原则:
state不能被修改。
单一的庞大的reducer的拆分
官方建议设计模式:顶层容器组件才对redux有依赖,组件间通过props来传递数据。按照这样设计还是没有解决组件间交互和数据传递的问题。官方react设计建议:react的设计建议:http://camsong.github.io/redux-in-chinese/docs/basics/UsageWithReact.html
使用connect将state绑定到component。此处有些黑盒了。
异步action用来请求服务端数据,利用middleware增强createStore的dispatch后即支持。

看到一篇讲解Redis数据清理导致连接超时的问题的文章,之前开发系统时也出现过类似问题,但是一直没有确定具体的原因,当时的情况是crontab下有个每分钟都在执行的php脚本,脚本中是通过redis来做锁的控制,起初一切正常,突然有天脚本“卡住”了,redis中的锁没有删除,导致后续启动的脚本立即被退出;查了日志发现当时出现了连接超时的情况,但是不明白其原因,无奈之下我在程序执行一段后就调用一次ping命令希望能够保持连接,今天的这篇文章也是类似的问题,详细了解到了redis的数据清理机制。
Redis提供了一套“美好”的过期数据清理机制:
主动过期: Redis对数据是惰性过期,当一个key到了过期时间,Redis也不会马上清理,但如果这个key过期后被再次访问,Redis就会主动将它清理掉。
被动过期: 如果过期的Key一直没被访问,Redis也不会一直把它放那不管,它会每秒10次的执行以下的清理工作:
随机从所有带有过期时间的Key里取出20个
如果发现有过期的,就清理
如果这里有25%的Key都是过期的,就继续回到第一步再来一次这套过期机制设计的很赞,可以这样理解:如果当前有超过1/4的Key是过期的话,就不停地清理,直到只剩下1/4不到的Key是要过期的为止,然后就慢慢地随机抽查着清理。
作者后来的解决方法是在业务逻辑中对需要过期处理的key做了分批删除的操作,自己来处理清理数据的工作,避免长时间处理。
#非对称加密
非对称加密具有以下的典型用法:
非对称加密算法如此强大可靠,却有一个弊端,就是加解密比较耗时。
#数字签名
数字签名是非对称加密和摘要算法两者结合。假设,我们有一段授权文本,需要发布,为了防止中途篡改文本内容,保证文本的完整性,以及文本是由指定的权限狗发的。首先,先将文本内容通过摘要算法,得到摘要,再用权限狗的私钥对摘要进行加密得到密文,将源文本、密文、和私钥对应的公钥一并发布即可。那么如何验证呢?
验证方首先查看公钥是否是权限狗的,然后用公钥对密文进行解密得到摘要,将文本用同样的摘要算法得到摘要,两个摘要进行比对,如果相等那么一切正常。这个过程只要有一步出问题就视为无效。
#Base64
Base64编码的思想是是采用==64个基本的ASCII码字符对数据进行重新编码==。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24 位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个 “=”。
例:将对ABC进行BASE64编码:
首先取ABC对应的ASCII码值。A(65)B(66)C(67);
再取二进制值A(01000001)B(01000010)C(01000011);
然后把这三个字节的二进制码接起来(010000010100001001000011);
再以6位为单位分成4个数据块,并在最高位填充两个0后形成4个字节的编码后的值,(00010000)(00010100)(00001001)(00000011),其中加色部分为真实数据;
再把这四个字节数据转化成10进制数得(16)(20)(9)(3);
最后根据BASE64给出的64个基本字符表,查出对应的ASCII码字符(Q)(U)(J)(D),这里的值实际就是数据在字符表中的索引。
解码过程就是把4个字节再还原成3个字节再根据不同的数据形式把字节数组重新整理成数据。
本人根据这几年的工作经验及生活经验总结了几点: