目录
1. 生成随机字符串
/**
* 说明:生成一个指定长度(默认6位)的随机字符,随机字符包含小写字母和数字。
* 输入:输入随机字符长度,无输入默认6位
* 输出:随机字符,如"6bij0v"
*/
方式一:
function idGenerator() {
/* 功能实现 */
var str = "abcdefghijklmnopqrstuvwxyz0123456789";
var res = "";
var len = arguments[0] ? arguments[0]:6;
var strlen = str.length;
for(let i=0;i<len;i++){
res += str.charAt(Math.floor(Math.random()*strlen));
}
return res;
}
console.log(idGenerator()); // 0gtc7j
console.log(idGenerator(8)); // nfm9p1zb
方式二:
function idGenerator() {
var len = arguments[0] ? arguments[0]:6;
return Math.random().toString(36).slice(-len); // 生成随机数->转换为36进制->截取后len位
}
console.log(Math.random())
console.log(idGenerator()); // ybdhfk
console.log(idGenerator(8)); // t03acf5g
由于随机数的不确定性,可能生成的比较短,就会产生问题;
方式三:
function idGenerator() {
var len = arguments[0] ? arguments[0]:6;
var res = "";
for(let i=0;i<len;i++){
res += Math.random().toString(36).slice(-1);
}
return res;
}
console.log(idGenerator()); // 7qp3wg
console.log(idGenerator(8)); // r4ajk5hw
2. 判断回文
/**
* 回文,给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
输入: "A man, a plan, a canal: Panama"
输出: true
输入: "race a car"
输出: false
**/
方式一:
function isPalindrome(s) {
/* 功能实现 */
var arr = s.split("");
var reg = /^[0-9a-zA-Z]+$/
var res = arr.filter(item =>{
return reg.test(item) // 正则过滤出字母和数字
})
var res = res.map(item => {
return item.toUpperCase(); // 转为大写字母
})
var l = 0;
var r=res.length-1;
while(l!=r && l<r){
if(res[l]!=res[r]){
return false
}
l++;
r--;
}
return true;
}
console.log(isPalindrome("A man, a plan, a canal: Panama")) // true
console.log(isPalindrome("race a car")) // false
3. 实现简单queryString
/**
* 简单实现一个queryString,具有parse和stringify的能力,
* parse,用于把一个URL查询字符串解析成一个键值对的集合。
* 输入:查询字符串 'foo=bar&abc=xyz&abc=123'
* 输出:一个键值对的对象
* {
* foo: 'bar',
* abc: ['xyz', '123'],
* }
* stringify,相反的,用于序列化给定对象的自身属性,生成URL查询字符串。
* 输入:一个键值对的对象
* {
* foo: 'bar',
* abc: ['xyz', '123'],
* }
* 输出:查询字符串 'foo=bar&abc=xyz&abc=123'
*/
方式一:
const queryString = {
parse() {
/* 功能实现 */
let arg = arguments[0];
let obj = {}
let arr = arg.split("&")
arr = arr.map(item => {
return item.split("=");
})
for(let i=0,len=arr.length;i<len;i++){
let item = arr[i][0];
if(obj[item]){
obj[item] = [obj[item]].concat([arr[i][1]])
}else{
obj[arr[i][0]]=arr[i][1]
}
}
return obj;
},
stringify() {
/* 功能实现 */
let obj = arguments[0]
let str = ""
var arr = []
for(let item in obj){
if(Array.isArray(obj[item])){
let m= obj[item].map(i=>{
return item+"="+i
})
arr = arr.concat(m)
}else{
arr.push(item+"="+obj[item])
}
}
str += arr.join("&")
return str
},
};
console.log(queryString.parse('foo=bar&abc=xyz&abc=123')); // { foo: 'bar', abc: [ 'xyz', '123' ] }
var res = {
foo: 'bar',
abc: ['xyz', '123'],
}
console.log(queryString.stringify(res)) // foo=bar&abc=xyz&abc=123
4. 数组扁平化去重并升序
方式一:
var arr = [13,2,[3,61,[3,[1,2]]],6];
var arr1 =Array.from(new Set(arr.flat(Infinity))).sort((a,b)=>{
return a-b;
})
console.log(arr1) // [1, 2, 3, 6, 13, 61]
方式二:
var arr = [13,2,[3,61,[3,[1,2]]],6];
function flat(arr){ // 自己编写flat函数,全部扁平化
while(arr.some(item => Array.isArray(item))){
arr = [].concat(...arr)
}
return arr;
}
var arr1 = Array.from(new Set(flat(arr))).sort((a,b)=>a-b);
console.log(arr1) // [ 1, 2, 3, 6, 13, 61 ]
5. JS全排列
输入:3
输出:[123, 132, 213, 231, 312, 321]
function f(num){
var str = "";
for(let i=1;i<=num;i++){
str+=i;
}
return f1(str).map(item => parseInt(item)) // 数组里的字符元素转换为数值元素
}
function f1(str){
var res = [];
if(str.length>1){
for(let j=0,len=str.length;j<len;j++){
var left = str[j];
var rest = str.slice(0,j)+str.slice(j+1,str.length);
var preF = f1(rest);
for(let m=0,preL=preF.length;m<preL;m++){
var tmp = left+preF[m];
res.push(tmp)
}
}
}else if (str.length==1){
res.push(str);
}
return res;
}
console.log(f(3)) // [123, 132, 213, 231, 312, 321]
6. 节流和防抖
// 防抖
function debounce (func,time){
let timer = null;
return () => {
clearTimeout(timer);
timer = setTimeout(()=>{
func.apply(this,arguments);
},time)
}
}
// 节流
function throtte(func,time){
let activeTime;
return ()=>{
let current = Date.now();
if(activeTime === undefined || current-activeTime > time){
func.apply(this,arguments);
activeTime = Date.now();
}
}
}
7. 隐式类型转换
// 下面代码在什么情况下会打印1?
var a = ?;
if(a==1 && a==2 && a==3){
console.log(1);
}
引用类型在比较运算符的时候,隐式转换会调用toString
或valueOf
方法:
var a = {
i:1,
toString(){
return a.i++
}
}
if(a==1 && a==2 && a==3){
console.log(1);
}
var a = {
i:1,
valueOf(){
return a.i++;
}
}
if(a==1 && a==2 && a==3){
console.log(1);
}
var a = [1,2,3];
a.join=a.shift;
if(a==1 && a==2 && a==3){
console.log(1);
}
对象的Symbol.toPrimitive
属性。指向一个方法。该对象被转化为原始类型的值时,会调用这个办法,返回该对象对应的原始类型值。
var a = {[Symbol.toPrimitive]:((i)=>()=>++i)(0)};
if(a==1 && a==2 && a==3){
console.log(1);
}
8. 合并数组并排序
题目:请把两个数组['A1','A2','B1','B2','C1','C2','D1','D2']
和['A','B','C','D']
合并为["A1", "A2", "A", "B1", "B2", "B", "C1", "C2", "C", "D1", "D2", "D"]
let a = ['A1','A2','B1','B2','C1','C2','D1','D2'];
let b = ['A','B','C','D'];
b = b.map((item)=>{
return item+3;
})
let c = [...a,...b].sort().map((item)=>{
if(item.includes('3')){
return item.split('')[0]
}
return item;
})
console.log(c)