面试中的编码

a = 'leetcodeisacommunityforcoders';

function deal(str) {

  const arr = str.split('');

  const delArr=['a','e','i','o','u'];

  // console.log(arr, 1);

  for (let i = 0; i < arr.length; i++) {

    // console.log(arr[i], 12, arr[i] === 'a');

    // if (arr[i] === 'a' || arr[i] === 'e' || arr[i] === 'i' || arr[i] === 'o' || arr[i] === 'u') {

    //  arr.splice(i, 1);

    //  // console.log(arr, 11);

    // }

    if( delArr.includes(arr[i]) && arr.indexOf(arr[i])!==-1){

      arr.splice(i,1);

    }

  }

  return arr;

}

deal(a);

a.replaceAll(/[aeiou]/g,'');

const arr = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];

function flatten(arr) {

  let tem = [];

  for (let i = 0; i < arr.length; i++) {

    const item = arr[i];

    if (Array.isArray(item)) {

      tem = tem.concat(flatten(item));

    } else {

      // if (tem.indexOf(item) > -1) continue;

      tem.push(item);

    }

  }

  return tem;

}

flatten(arr);

function flatten(arr) {

  for (let i = 0; i < arr.length; i++) {

    if (Array.isArray(arr[i])) {

      arr = arr.concat(arr[i]);

      arr.splice(i, 1);

    }

  }

  return arr;

}

flatten(arr);

const nums1 = [1, 2, 3];

const nums2 = [2, 3, 4];

let tem = [];

nums2.forEach((item) => {

  // if (nums1.includes(item)) {

  //  tem.push(item);

  // }

  if(nums1.indexOf(item)!==-1){

    tem.push(item)

  }

});

console.log(tem);

for foreach 性能比较,无额外的函数调用栈和上下文

foreach Array.foreach(currentValue,index,arr)

function find(S,T){

  if(S.length

  for(let i=0;i

    if(S.slice(i,i+T.length)===T){

      return i;

    }

  }

  return -1;

}

find('sahdhsddsdsdqqwqw','hdh')

function rotate(arr,k){

  const len=arr.length;

  const step=k%len;

  return arr.slice(-step).concat(arr.slice(0,len-step))

}

rotate([1,2,3,4,5,6],5)

function debounce(){

  let timer:any;

  return function(val:any){

    clearTimeout(timer);

    timer=setTimeout(()=>{

      console.log(val)

    },500)

  }

}

[...Array(100).keys()].filter((item)=>{

    const aa=new Array(item.toString().split('').reverse().join(''));

// console.log(typeof(aa),new Array(aa))

console.log(item,aa.join(''),Number(aa.join('')))

return item.toString().length>1 && item===Number(aa.join(''))

})

arr = [1, 2, [3, [4, 5]], 6, 8, 3];

Array.form(new Set(arr.flat(Infinity))).sort((a, b) => { return a - b; });

arr=[1,3,4,2,7,5]

function maopao(arr) {

  if (arr.length < 1) return;

  console.time('time1');

  const arr1 = [...arr];

  let isOk = true;

  for (let i = 0; i < arr1.length - 1; i++) {

    for (let j = i + 1; j < arr1.length; j++) {

      if (arr1[i] > arr1[j]) {

        const temp = arr1[i];

        arr1[i] = arr1[j];

        arr1[j] = temp;

        isOk = false;

      }else{

        isOk=true;

      }

    }

    if (isOk) {

      continue;

    }

  }

  console.timeEnd('time1');

  return arr1;

}

maopao(arr);

const obj = { 1: 222, 2: 333, 3: 444 };

const res = Array.from({ length: 12 }).map((item, index) => obj[index + 1] || null);

function byte(str) {

  const arr = str.split('');

  const newArr = arr.map((item,index) => {

    console.log(item,item.toString(),typeof(item))

    return item.toString() === item.toUpperCase() ? item.toLowerCase() : item.toUpperCase();

  });

  console.log(newArr)

  return newArr.join('');

}

console.log(byte('aBc'));

function zero(arr) {

  const len = arr.length;

  let j = 0;

  for (let i = 0; i < len - j; i++) {

    if (arr[i] === 0) {

      arr.push(0);

      console.log('arr1', arr);

      arr.splice(i, 1);

      console.log('arr2', arr);

      i--;

      j++;

    }

  }

  return arr;

}

arr = [0, 2, 1, 0, 3];

zero(arr);

function *DFS(tree){

    yield tree;

    let children=tree.children;

    for(let i in tree){

        yield *DFS(children[i])

    }

}

console.log([...DFS(tree)])

webpack 依赖的收集

配置入口进来做递归解析最后生成一个依赖图,dev-server运行的时候每次都去重新收集所有依赖,terser 只在打包压缩时候才会运行,在dev的时候是没有办法进行缓存的

。bable-loader可以进行缓存设置,但是一般项目为了加快构建速度,都会默认不去处理node_modules里面的依赖,所以第三方的依赖包无法被编译缓存

html:

link ref 等属性 link同时加载 @import页面加载完毕后被加载;link方式的样式的权重高于@import的权重;

link是html标签,@import是IE5以上使用

重绘和回流

function fillNum(num){

  const nums=num.toString();

  const len=Number(nums).toString(2).length;

  console.log("==>",len,nums.toString(2));

  let i=len;

  let arr=[];

if(i<8){

  while(8-i){

    arr.push(0)

    i++;

  }

  let val=nums.toString(2).split("");

  console.log("val===>",arr,val)

  arr=arr.concat(val)

  console.log("arr===>",arr)

}else{

  return Number(nums).toString(2);

}

return arr.join('');

}

var b="192.168.1.1";

var arr=b.split(".");

var len=arr.length;

var str="";

for(let i=0;i

  console.log(arr[i],Number(arr[i]).toString(2))

  str=str+"-"+fillNum(arr[i]);

}

console.log(str)

const sleep=(time)=>{

return new Promise(resolve=>{

  setTimeout(resolve,time)

})

}

sleep(1000).then(()=>{

  console.log(112)

})

arr=[1,32,4,2,45,33,23]

arr.sort((a,b)=>{

return a-b;

})

function zeroMove(arr){

const len=arr.length;

let j=0;

for(let i=0;i

  if(arr[i]===0){

    arr.push(0);

    arr.splice(i,1)

    i--;

    j++

  }

}

return arr;

}

zeroMove([0,2,2,0,22,0,1])

function add(...arg){

  console.log("===>",...arg)

  let sum=0;

  const addInner=(...arg)=>{

    console.log("pp=>",...arg)

    arg.forEach(i=>(sum+=i));

    return addInner;

  }

  addInner.toString=()=>sum;

  return addInner(...arg);

}

function ans(arr,target){

const len=arr.length;

//  let map={};

let map=new Map();

for(let i=0;i

  //  map[arr[i]]=i;

  map.set(arr[i],i)

}

console.log(map)

console.log(map.get(1))

for(let j=0;j

  var d=target-arr[j];

  console.log("d===>",d)

  const value=map.get(d);

  console.log("111===>",j,value)

  if(value && value !==j){

    return [j,value]

  }

  // var jj=arr.indexOf(d);

  // if(jj!==-1){

  //  return [j,jj]

  // }

}

return "404";

}

ans([1,2,3,4,7],9)

1234

function reverseNum(num){

  const num1=Math.floor(num/10);

  const num2=num%10;

  if(num1<1){

    return num;

  }else{

    return `${num2}${reverseNum(num1)}`

  }

}

reverseNum(1234)

function reverseStr(str){

  const newStr=str.split('').reverse();

  console.log("newStr===>",newStr);

  const bb=Array.from(new Set(newStr));

  console.log("newStr2===>",new Set(newStr));

  const fv=bb.join('')

  console.log(bb,fv)

  return fv;

}

reverseStr('abddddbs')

const  rsort=()=>{

return ()

}

rsort(()=>Math.random-0.5)

function numToStep(num){

  let count=0;

  while(num!==0){

    if(num%2===0){

      num=num/2;

    }else{

      num--;

    }

    count++;

  }

  return count;

}

numToStep(8);

/**

* @param {number} num

* @return {number}

*/

var numberOfSteps = function (num) {

  const binStr = num.toString(2);

  const arr = binStr.match(/1/g);

  if (arr) {

    console.log(num,binStr,arr);

    return binStr.length + arr.length - 1

  } else {

    return 0;

  }

};

a=1234;

let str=a.toString();

let sum=0;

let pro=1;

for(let i=0;i

  sum+=parseInt(str[i]);

  pro*=parseInt(str[i])

}

console.log(pro,sum,pro-sum)

address = "255.100.50.0"

address.replaceAll('.',"[.]")

let i=0;

let map=new Map();

function encode(url){

map.set(i,url);

return "http://tinyurl.com/" + i++;

}

function decode(url){

return map.get(parseInt(url.replace("http://tinyurl.com/", "")))

}

function Permutation(str){

  let res=[];

  if(str.length===0){

    return str

  }

  Permution(str,0,str.length,res);

  return res;

}

function Permution(str,start,end,res){

  if(start=end-1){

    res.push(str);

    return;

  }else{

    for(let i=start;i

      if(i !==start && str[i]!==str[start]){

        continue;

      }else{

        let tem=str[i];

          str[i]=str[start];

          str[start]=tem;

        Permution(str,start+1,str.length,res);

      }

    }

  }

}

var permutation = function(S) {

  const ret = []

  const remove = (chars, i) => chars.filter((c, idx) => i !== idx)

  const proc = (chars, v) => {

    console.log("===>",chars,v)

    if (v.length === S.length) {

      console.log("结果===》",v,S)

      ret.push(v)

      return

    }

    for (let i = 0; i < chars.length; i++) {

      console.log("111===>",chars,remove(chars, i),`${v}${chars[i]}`)

      proc(remove(chars, i), `${v}${chars[i]}`)

    }

  }

  proc([...S], '');

  return ret;

};

function printNum(nums){

  let total=1;

  while(nums--){

    total*=10;

  }

  for(let i=1;i

    console.log(i)

  }

}

printNum(2)

function fibler(nums){

  let f0=0;

  let f1=1;

  let res=0;

  if(nums<1){

    return nums;

  }

  while(--nums){

    res=f0+f1;

    f0=f1;

    f1=res;

  }

return res;

}

fibler(4);

var name="jack";

function person(name){

  this.name=name;

  console.log("===>",this.name);

  console.log("window===>",this);

  return name;

}

var a=person('lily');

console.log("name===>",name)

console.log("a===>",a)

var b=new person("fred");

console.log("b===>",b);

class A{}

class B extends A{}

const a=new A();

const b=new B();

console.log(a.__proto__===A.prototype)

console.log(b.__proto__===B.prototype)

console.log(B.__proto__)

console.log(B.prototype.__proto__)

console.log(b.__proto__.__proto__)

function Node(data,left,right){

  this.data=data;

  this.left=left;

  this.right=right;

}

Node.prototype.show=function(){

  return this.data

}

function BST(){

  this.root=null;

}

BST.prototype.insert=function(data){

  console.log("data==>",data)

  var node=new Node(data,null,null);

  console.log("node==>",node)

  if(this.root===null){

    console.log("thisroot==>",this.root)

    this.root=node;

  }else{

    var current=this.root;

    var parent;

    while(true){

      parent=current;

      console.log("parent0==>",parent,data,current.data,data

      if(data

        current=current.left;

        if(current===null){

          parent.left=node;

          break;

        }

      }else{

        current=current.right;

        if(current===null){

          parent.right=node;

          break;

        }

      }

    }

    console.log("parent==>",parent)

  }

}

BST.prototype.perOrder=function(node){

  if(node){

    console.log(node.show()+"===>"+node);

    this.perOrder(node.left);

    this.perOrder(node.right)

    console.log(node.left+"===>"+node.left);

  }

}

var bst=new BST();

var nums=[10,3,18,2,4,13,21,9,8,9];

for(let i=0;i

  bst.insert(nums[i])

}

bst.perOrder(bst.root)

/*

高阶组件

很好的模式,作用、局限性、如何实现

定义:一个react组件包裹着另外一个组件,这种模式通常用函数来实现,基本上是一个类工厂

*/

/*

fiber作用

1,概念:

react 执行渲染的一种新的调度策略,js是单线程的,一旦组件开始更新,主线程会一只控制着,这时候如果在执行交互操作,就会卡顿

一个组件可以对应多个fiber

render函数中创建的react element树在第一次渲染时候创建一颗结构一摸一样的fiber节点树。不同的react element类型对应不同的fiber节点类型。一个

react element的工作就由他对应的fiber节点来负责

react fiber重构了这种方式,渲染过程采用切片的方式,每执行一会,就歇一会。如果有优先级更高的任务到来以后就会先去执行,降低页面发生卡顿的可能性。使得react对动画等实时性要求较高的场景体验更好

2,什么是fiber

当JS处理大型计算的时候会导致页面出现卡顿,更严重的就是假死。

===》动画丢帧、不连贯。用户体验差。

解决:

大型计算===》拆小型计算===》执行顺序异步调用,这样就不会长时间霸占线程

UI也能在两次计算执行间隙进行更新,从而与用户及时反馈。

3.从how ===》when

how如何用哪个最少的DOM操作成本来update视图

when 何时update视图那一部分

优先级 type priortylevel=0|1|2|3|4|5;

动画和页面交互都是优先级比较高的,这也是fiber能够使得动画、布局、页面交互变得流畅的原因之一

可以把priority分为同步和异步两个类别,同步优先级的任务会在当前帧完成。

4,基本原则

调和:找出要做的更新工作,计算阶段、计算结果可以被缓存,也可以被打断

交付:需要提交所有更新并渲染,为了防止页面抖动被设置为不能打断

5,数据结构:

链表,指向第一个子节点和相邻的兄弟节点

更新队列:updateQueue,一个链表

每个fiber都有一个属性updateQueue指向其对应的更新队列

6执行流程:

用户操作setState==>enqueSetState方法

7,有什么影响:

1)需要关注react为任务片设置的优先级,特别是页面用动画的情况

2)如果一直有更高级别的任务,那么fiber算法会执行级别更高的任务,执行完毕后再通过callback回到之前渲染一般的组件从头开始渲染

(看起来放弃已经渲染完的生命周期,会有点不合理,反而增加渲染时长)

3,compoenntWillMount componentWillReceiveProps componentWillUpdate几个生命周期不再安全,由于任务执行过程可以被打断,这几个生命周期可能会执行多次

如果包含ajax会有意想不到的BUG。尽量采用纯函数

*/

你可能感兴趣的:(面试中的编码)