kmp算法

一如既往,推荐看客先看阮一峰博客:字符串匹配的KMP算法

定义:

一大串字符串里找某字段算法

原理:

利用某字段自身特有的规律(前后缀,这个词有看上面那文章或了解过算法的人才知道我说啥),实现非暴力查找字符串的方法。

重点:

得到部分匹配表

心得:

我用js根据思路写了个模拟的代码,能用!
源码地址:戳我

效率

嗯。。。没js自带的indexOf快。
测试时我的代码x ms,indexOf 是 0.x ms,快一倍(废话,原生的肯定用了更好的算法,比如从两头开始算,我这只从一头开始算)。

题外话

为什么会接触这个算法呢,本来我在看别人的源码,然后不小心点到他的知乎,又不小心点到他点过赞的文章,然后看到个文章大概是有个人面试时手写了kmp算法,面试官还问他是不是hr漏题了呵呵之类。。。,然后我正事没做(买了个慕课网的vue视频),就去看这算法了,发现别人的代码理解不了,然后去看阮一峰的博客,哦思想懂了!然后尝试写代码,index索引不太清楚该+1还是-1什么的就拿笔画一画,整个过程用3,4小时(我就是这渣渣水平)。

心态变化:我擦好难-我还看吗-不知浪不浪费时间-别人源码写的啥-理解这思路-自己写写看-成功-开心

想着对学习的朋友说下,有时看不懂别人的代码不要心急,可能。。。你理解后自己能写出来,再去看别人的代码(或不看)也可以哦,我是这样过来的,一起加油!

DOM 中 Property 和 Attribute 的区别

刚刚偶然看到篇文章:
DOM 中 Property 和 Attribute 的区别
(强烈推荐先看完上文)
收获颇多,写写读后感跟注意到的点吧。

值得一提的是一般在表单中我们会用obj.value = xx或者用jq$(obj).value(xx)来改变input标签的值(这里的obj指input对象),改完后发现查看源代码中的input标签的value值还是原来的值,这个其实并不大会影响到我们提交的操作(这里适用于jq的表单serialize化)。
比如我们写了个input标签,id为'ha'
一顿操作后value值在浏览器界面是看到改变了,标签里的值还是没有变,这时我用jq的ajax+serialize提交表单
然后在浏览器f12后,network里看到
提交的值为2,也就是修改后的值。

其实看完那篇文章较大的收获还是通过jq源码了解了一些规范的函数写法
比如定义函数时

// 这是一个xx功能的函数,能够balalal

// @param a, a的定义
// @param b, b的定义
function test(a,b){
    //这里虽然参数有了b,但有时候不是为了传参用的,而是为了跟清楚的知道每个参数的定义
    //而不是如下这样写
    var b = xx;//bad
    //不用声明,直接
    b = xx;//good
}

后来我想了下,这只是让我知道了有这种写法而已,函数里变量一多都写到函数参数上面也不好看。嗯。。。就这样吧。

Jquery.extend与Object.assign

插曲

说到Jquery.extend就想到$.fn.extend,两者区别大了

前者可以把对象参数里的值加到jquery这个变量上,后者是把值加到jquery实例化后的对象上($.fn===$.prototype哦)。所以后者用于给jq扩展插件用的。

正言

$.extend一般情况下用起来跟Object.assign没什么不同
作用就是简单的便利每个对象参数里的key,相同则以后面对象参数(b)的key对应的value值覆盖前面(a)的key对应的value值。
这种方法经常被来用实例化组件时填写自定义的option来替换默认的option。(没听过的话,这里有个jq插件的源码,https://github.com/alvarotrigo/pagePiling.js/blob/master/jquery.pagepiling.js ,看到里面$.extend的应用就会明白了)。
如何你有看上面插件的源码,你会发现有点不一样的地方:$.extend(true,xxx,xxx)

没错,这次第一个参数为true后,对象参数不是简单的合并了,它会判断具体是哪里不一样,最后返回一个完整的对象(一般这才是我们想要的)。想写这篇文章也是从这插件的源码有感而来
那么利用Object.assign怎么实现该效果呢
刚写了个:
https://github.com/Newbit13/pika/blob/master/trueAssign.js
没事赞一下呗。

再附上一篇文章,lodash没怎么用过,所以给大家看看就好Lodash 中 assign,extend 和 merge 的区别