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<T.length) return -1;
for(let i=0;i<S.length;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<len;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<len-j;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<len;i++){
// map[arr[i]]=i;
map.set(arr[i],i)
}
console.log(map)
console.log(map.get(1))
for(let j=0;j<len;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<str.length;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<end;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<total;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<current.data)
if(data<current.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<nums.length;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。尽量采用纯函数
*/