先拿出中间项,然后把此项从数组中删除掉,让数组中的剩余项一一跟这个中间项做比较,新建两个左右数组,如果大的项就放到右数组,如果小的项就放到数组。从左到右返回递归存放大数的右数组的返回值
用concat()
把中间项
及递归存放小数的左数组的返回值
。
```jsconst ary = [5, 4, 3, 2, 1];function quicksort(array = []) {//停止递归的条件 - 入参数组里面只有1项或者0项,就停止if (array.length <= 1) {return array;}//1 拿出中间项,并且删除那一项const centerIndex = Math.floor(array.length / 2);//中间项下标const centerItem = array.splice(centerIndex, 1)[0];//中间项数值//2 创建两个空数组,遍历剩余数组中每一项如果比中间项数值大,那就放右边,比中间项数值小放左边const minArray = [];const maxArray = [];for (let i = 0; i < array.length; i++) {const nowItem = array[i];if (nowItem < centerItem) {minArray.push(nowItem);} else {maxArray.push(nowItem);}}return quicksort(minArray).concat(centerItem, quicksort(maxArray));}console.log(quicksort(ary));
```
方向:从右向左
最终实现的效果,从小到大,在插入的时候,拿出的项从右向左依次比较(新数组),如果拿出的项大(或者相等),就直接插入首次比它小的后面,
如果一直比到第一项了,条件还没满足,后面就是最小项,直接放到数组的最前面
```js// @1 创建一个空数组// @2 将原数组的第一项放进新数组里// @3 依次拿出原数组的每一项和新数组比较(从后往前比)// @4 如果拿出这一项比原数组的某一项(第一次出现)的大,那就放他后面// @5 全部比完,还没有大的,那就放在数组开头var ary = [11, 7, 12, 46, 35];function insertSort(ary) {var newAry = [];newAry.push(ary[0]);for (var i = 1; i < ary.length; i++) {var getItem = ary[i];for (var j = newAry.length - 1; j >= 0; j--) {var newAryItem = newAry[j];if (getItem >= newAryItem) {newAry.splice(j + 1, 0, getItem);break;//如果一旦找到,就停止}if (j === 0) {newAry.unshift(getItem);}}}return newAry;}console.log(insertSort(ary));```
用’'、“”、``包着的就是字符串。
```jsvar str1 = 'fang'var str2 = "fang"var str3 = `fang`
```
年月日示例
ES6模板字符串
```jsvar year = 2023var month = 3var day = 7console.log(year+'年'+month+'月'+day+'日')console.log(`${year}年${month}月${day}日`)
```
字符串取字符
用中括号语法去取
```jsvar str = "zhufeng";console.log(str[0]);//z```
但不支持用中括号语法去修改值
```jsvar str = "zhufeng";console.log(str[0]);//zstr[0] = "c"; //不报错,但str里的值依旧是原来的。不能像数组一样去修改console.log(str);```
字符串长度
字符串包装对象上有个length属性,里面表示的字符串的字符长度。
```js
console.log('fangchaoduan'.length);//12
```
字符长度
不一定等于字符数
```js
const emoji = "😄";
console.log(emoji.length); //2
```
charAt(index)
通过下标去取字符 'fang😄fang fang'.charAt(0)//'f'
charCodeAt(index)
通过下标取值对应的字符编码 'fang😄fang fang'.charCodeAt(0)//102
indexOf(string,index)
通过字符片断初次开始的位置 'fang方fang fang'.indexOf('fa',4)//5
lastIndexOf(string,index)
通过字符片断最后一次开始的位置 'fang方fang fang'.lastIndexOf('fa',13)//10
slice(start,endLength)
查找字符串中特定位置的字符 'fang方fang fang'.slice(4,-2)//'方fang fa'
subString()
'fang方fang fang'.subString(4,11)//'方fang f'
subString()
和slice()
基本都一样,唯一不同在于,subString()
不支持负数索引,而slice()
支持负数索引substr(n,m)
从索引n
开始截取m个字符
'fang方fang fang'.substr(4,4)//'方fan'
toUpperCase()
把字符串转换为大写 'fang方fang Fang'.toUpperCase()//'FANG方FANG FANG'
'fang方fang Fang'.toLowerCase()//'fang方fang fang'
'fang方fang Fang'.replace('fang','方朝端')//'方朝端方fang Fang'
'fang方fang Fang'.replace('fang','方朝端').replace('fang','方朝端')//'方朝端方方朝端 Fang'
'fang方fang Fang'.split('fa')//['', 'ng方', 'ng Fang']
```jsvar str = "2008-8-8 8:8:8";const transformTime = (time = "2019-8-18 12:32:18") => {function addZero(num) {return num < 10 ? "0" + num : num;}const before = time.split(" ")[0].split("-");const after = time.split(" ")[1].split(":");const res = `${before[0]}年${addZero(before[1])}月${addZero(before[2])}日 ${addZero(after[0])}时${addZero(after[1])}分${addZero(after[2])}秒`; //2019年08月18日 12时32分18秒return res;};console.log(transformTime(str));
```
```jsvar str = "https://www.baidu.com?name=zhufeng&age=10&id=14";var transformUrl = (url) => {var queryString = url.split("?")[1];var queryList = queryString.split("&");const res = {};for (let i = 0; i < queryList.length; i++) {const query = queryList[i].split("=")const key = query[0];const value = query[1];res[key] = value;}return res;};console.log(transformUrl(str));
```
Math.abs(num)
num求绝对值 不管正数还是负数,结果都是对应的正数
Math.floor(num)
num向下取整,不管正数还是负数,都是取小的
Math.ceil(num)
num向上取整,无论是正数还是负数,都取最大的值
Math.round(num)
num四舍五入
0.5
才会变成被舍入
Math.round(-1.3)//-1
Math.round(-1.5)//-1
Math.round(-1.51)//-2
Math.round(-1.6)//-2
Math.sqrt(num)
num开平方,即返回值为根号num
Math.sqrt(81)//9
Math.pow(num,power)
num取power幂,即返回值为num的power次方
Math.pow(4)//NaN
Math.pow(4,2)//16
Math.pow(4,3)//64
**
; 4**2//16
Math.PI
取π值,不是一个方法,是一个属性。
Math.max()
获取最大值
Math.max(12,3,6,15,5,8,9)//15
扩展运算符...
取数组中的最大值Math.min()
获取最小值
Math.min(12,3,6,15,5,8,9)//3
扩展运算符...
取数组中的最小值Math.random()
范围在[0,1)
的随机小数
,包括0
但不包含1
。
min-max之间
的随机小数
Math.random()*(max-min)+min
Math.random()*(10-5)+5//范围在[5,10)的随机小数
min-max之间
的随机整数
Math.floor(Math.random()*(max-min+1)+min)
Math.floor(Math.random()*(10-5+1)+5)//范围在[5,10]的随机整数
```html
复习 切换背景
```
每执行一次,就能得到一个四位的随机数,随机数里的字符不能重复
```js
var str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
function randomCode(numLength = 4, string = "0123456789", isRepeat = false) {const chars = string.split("");const newList = [];for (; newList.length < numLength; ) {const num = Math.floor(Math.random() * (chars.length - 1 - 0 + 1) + 0);if (isRepeat || !newList.includes(chars[num])) {newList.push(chars[num]);}}let res = newList.join("");return res;
}
console.log(randomCode(4, str));
```