当前位置: 首页 > 后端技术 > Node.js

JS中经常用到的技巧,可以帮助你更简单的实现一些功能

时间:2023-04-03 16:54:59 Node.js

原文:https://github.com/HCThink/h-...github主页(star+watch,单手动态直达):https://github.com/HCThink/h-blog掘金链接,掘金专栏segmentfault主页原创禁止擅自转载广告部长期招聘大量研发岗位【前端、后端、算法】,欢迎各位高手发帖,积极尝试。坐标:今日头条,大量招人,难度降低,大部分都能拿到很好的增幅,不上市,offer给力!欢迎骚扰邮箱!戳我:hooper.echo@gmail.com如何快速获取毫秒constnow=+newDate();平铺多维数组//仅适用于二维数组。但是,通过递归,我们可以展平任何维度的嵌套数组。constarr=[11,[22,33],[44,55],66];constflatArr=[].concat(...arr);//=>[11,22,33,44,55,66]//平面方法[1,2,[1,[2,[3]]].flat()//(4)[1,2,1,Array(2)]//提供另一种基于场景的思考。//其实还有更简单的。任意维度的数组都可以处理,arr.join().split(',')//但是有一个风险:类型会变。我们可以提供转换回调。//瓦片编号数组+转换回调[1,2,[1,[2,1+2+1,Number(true)]]].join().split(',').map((index)=>Number(index))//(6)[1,2,1,2,4,1]//对于通式Arr.join().split(',').map(fn)这个方法是可能会有很多限制,比如数组元素类型不一致,比如非基本类型等等。第一个问题:大家想一想,一个数组既有数字又有字符串,这合理吗?事实上,这种数组在逻辑、潜在风险和处理上都有很多问题。主要是糟糕的设计。但是如果在Typescript中往往有更好的场景。第二个问题:非基本类型不好处理。其实,像这样比较黑客的方法,往往不是用来应对常见的情况,往往在特殊的场景下才会有奇效。没有最好的解决方案,只有最合适的。只是另一种思维方式。快速舍入//apiMath.floor(10.8222)//双位移console.log(~~47.11)//->47console.log(~~-12.88)//->-12console.log(~~1.9999)//->1console.log(~~3)//->3//失败console.log(~~[])//->0console.log(~~NaN)//->0console.log(~~null)//->0//如果整数大于32位,会失败console.log(~~(2147483647+1)===(2147483647+1))//->0格式化输出constobj={foo:{bar:[11,22,33,44],baz:{bing:true,boom:'Hello'}}};//第三个参数是用来美化JSON输出的空格数.JSON.stringify(obj,null,4);//"{//"foo":{//"bar":[//11,//22,//33,//44//],//"baz":{//"bing":true,//"boom":"Hello"//}//}//}"粗略测试一个JavaScript代码块的性能console.time("Arrayinitialize");constarr=newArray(100);constlen=arr.length;for(leti=0;i{}console.log(pureObject.constructor);//=>undefinedconsole.log(pureObject.toString);//=>undefinedconsole.log(pureObject.hasOwnProperty);//=>undefined公共必需参数验证constrequire=function(message){thrownewError(message);}constgetSum=(a=_err('aisnotdefined'),b=_err('bisnotdefined'))=>a+bgetSum(10)//throwsError,bisnotdefinedgetSum(undefined,10)//throwsError,aisnotdefined装饰器用作强制参数校验下面是主要代码,完整代码需要Typescript环境装饰器验证需要的参数decoratorTypescript@validategreet(p1,p2,p3,@requiredname:string,p5){//p1-5只是作为占位符来测试required的第四个参数。return"Hello"+name+","+this.greeting;}//output//throw(constructors.name+"."+String(method_1)+"[\u5B9E\u9645\u4E0A\u662F\uFF1A"+constructors.name+".prototype."+String(method_1)+"]\u7B2C"+(index+1)+"\u4E2A\u53C2\u6570\u662F\u5FC5\u4F20\u53C2\u6570\uFF0C\u8BF7\u63D0\u4F9B\u3002");^//Greeter.greet[Greeter.prototype.greet]第四个参数必填,请提供。将参数解构为数组+函数fn(){console.log([...arguments]);//(4)[1,2,3,4]console.log(Array.prototype.slice.call(arguments));}(1,2,3,4)库的非new调用通常会遇到用户没有按照你想要的方式调用的问题,尤其是new的问题,很多代码中都会有thankyou逻辑来验证用户是否是new调用。如:传统的var_=function(obj){if(objinstanceof_)returnobj;if(!(thisinstanceof_))returnnew_(obj);this._wrapped=obj;};classclassFn{}//类型错误:类构造函数Fn不能在没有'new'Fn()的情况下被调用;运送新的api:new.targetfunctionFoo(){if(!new.target)throw"Foo()必须用new调用";console.log("Foo用new实例化");}newFoo();//记录“用新实例化的Foo”Foo();//throws"Foo()mustbecalledwithnew"//new.targetatconstructionMediumclassA{constructor(){console.log(new.target.name);}}新A();//小数舍入&&强制转换为布尔值~~2.8//2!!0//false铺垫知识[建议仔细看]首先要明确的是,在计算机内部进行数学运算时(即计算机的0和1的计算),是根据关于补码。说白了,计算机中只有一种编码,就是补码,而现实世界中的编码规则,比如原码、反码,都是我们定制的,目的是为了与补码形成一种转换关系。计算机中的补码。所以,我们在人工计算这种计算机计算的01计算时,一定要站在计算机的角度。所以,首先要把我们的原码反码转换成补码,然后计算^_^。只有这样,才能统一正负数的表示。详见【补码的历史】,此处不再展开。接下来看问题,从问题入手,解决实际问题,概念自然就清晰了。^_^5的补码就是它自己(ps:正数的原码、逆码、补码都是它自己;负数的原码到1开头,反码就是最高符号位保持不变,其余位在原码的基础上取反,在反码的基础上+1可以得到补码)5的补码:00000101~5(即5位取反操作,下面是补码操作):00000101按位取反,这里需要把原来的01串完全取反,没有最高符号位的概念,取反结果为:11111010注意这里的结果是用补码表示,毕竟这还是机器表示,转换成自然语言编码,将结果(补码)转换成原码就是:补码-1转换成反码:11111010-1=11111001反码然后反码成原码:11111001=10000110原码转成十进制,答案是-6看[~-6=5]的计算过程,假设有符号六位~(100110>111001>111010)(-6的原码可以转为补码参与运算)000101(运算结果为补码)000101>000101->5(转为原码【正数本身])按位取反的快捷公式-(x+1)。【~~x->-(-(x+1)+1)->-(-x-1+1)->--x->x]ps:以下内容为广告,先选一个——和二线厂商,又可以内部提拔,急招(50%涨幅容易,面试难),最好研发,有意者:hooper.echo@gmail.com邮箱私聊。