算法
快排
快排是最常见的排序方法之一,这次用 JS 手动实现一下。
快排是典型的“分而治之”,分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
利用分治法可将快速排序的分为三步:
- 在数据集之中,选择一个元素作为”基准”(pivot)。
- 所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。这个操作称为分区 (partition) 操作,分区操作结束后,基准元素所处的位置就是最终排序后它的位置。
- 对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
```javascript
function jsQuickSort(array) {
if (array.length <= 1) {
} const pivotIndex = Math.floor(array.length / 2); const pivot = array.splice(pivotIndex, 1)[0]; //从数组中取出我们的”基准”元素 const left = [], right = []; array.forEach(item => {return array;
}); //至此,我们将数组分成了left和right两个部分 return jsQuickSort(left).concat(pivot, jsQuickSort(right)); //分而治之 }if (item < pivot) { //left 存放比 pivot 小的元素
left.push(item);
} else { //right 存放大于或等于 pivot 的元素
right.push(item);
}
const arr = [98, 42, 25, 54, 15, 3, 25, 72, 41, 10, 121]; console.log(jsQuickSort(arr)); //输出:[ 3, 10, 15, 25, 25, 41, 42, 54, 72, 98, 121 ]
<a name="F3Q9O"></a>
### 二叉树
<a name="9932551c"></a>
## 内存
<a name="ufIiu"></a>
## react
<a name="1sHC2"></a>
### state和props相同与区别
props:<br /> <br /> props是一个从外部传进组件的参数,由于React具有单向数据流的特性,所以他的主要作用是从父组件向子组件中传递数据,它是不可改变的,如果想要改变它,只能通过外部组件传入新的props来重新渲染子组件,否则子组件的props和展示形式不会改变,props除了可以传字符串,数字,还可以传递对象,数组甚至是回调函数<br /> <br />state:<br /> <br /> state主要作用是用于组件保存,控制及修改自己的状态,它只能在constructor中初始化,state是可以被改变的,state放改动的一些属性,比如点击选中,再点击取消,类似这种属性就放入带state中,注意:没有state的叫做无状态组件,多用props少用state,多写无状态组件,注意:修改state的值时,必须通过调用[setState](http://zzsffx.1358tv.com/)方法,当我们调用this.setState方法时,React会更新组件的数据状态,并且重新调用render方法<br /> <br />下面来列举一下两者的异同:<br /> <br /> 不同点:1.props不可以在组件内部修改,但state可以在组件内部修改<br /> <br /> 2.可以从父组件修改自组件的props,而不能从父组件修改自组件的state<br /> <br /> 相同点:1.props和state都是导出[HTML](http://www.nmgutop.com/)的原始数据。<br /> <br /> 2.props和state都是确定性的,如果我们写的组件为同一props和state的组合生成了不同的输出,那木我们肯定在哪里做错了<br /> <br /> 3.props和state都会触发渲染更新<br /> <br /> 4.props和[state](http://yaoqikj.com/)都是纯JS对象(用typeof来判断,结果都是object)<br /> <br /> 5.可以从父组件得到初始值props和[state](http://www.xianggjtop.com/)的初始值
<a name="kjGAX"></a>
### link和a的区别
从最终渲染的DOM来看,这两者都是链接,都是a标签,区别是: Link标签是react-router里实现路由跳转的链接,一般配合Route使用,react-router接下了其默认的链接跳转行为,区别于传统的页面跳转,Link标签的"跳转"行为只会触发相匹配的Route对应的页面内容更新,而不会刷新整个页面
> Link标签做的三件事情:
> - 1.有onclick那就执行onclick
> - 2.click的时候阻止a标签默认事件
> - 3.根据跳转href(即使是to),用history(web前端路由两种方式之一,history&hash)跳转,此时只是链接变了,并没有刷新页面
而[标签就是普通的超链接了,用于从当前页面跳转到href指向的里一个页面(非锚点情况)]()<br />
<a name="bff685f6"></a>
### [a标签默认事件禁掉之后做了什么才实现了跳转?]()
let domArr=document.getElementByTagName(‘a’); […domArr].forEach(item=>{ item.addEventListener(‘click’,function(){ location.href=this.href }) }) ```