![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
js
zhengzhengwang
这个作者很懒,什么都没留下…
展开
-
nodejs多行输入输出规范示例
nodejs 多行输入输出规范示例原创 2023-02-27 16:29:21 · 704 阅读 · 0 评论 -
浏览器内核、渲染引擎和js引擎的关系
浏览器内核又可以分成两部分:渲染引擎(layout engineer或者RenderingEngine)和JS引擎。渲染引擎功能作用渲染引擎,负责对网页语法的解释(如HTML、JavaScript)并渲染网页。所以,通常所谓的浏览器内核也就是浏览器所采用的渲染引擎,渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息。不同的浏览器内核对网页编写语法的解释也有不同,因此同一网页在不同的内核的浏览器里的渲染(显示)效果也可能不同,这也是网页编写者需要在不同内核的浏览器中测试网页显示效果...转载 2021-09-03 14:52:12 · 620 阅读 · 0 评论 -
js 自己实现字符串的数学运算
const nums = []let input = '3+20*1/4*2-2'const operate1 = ['*', '/']const operate2 = ['+', '-']const calc1 = (str) => { let result = 0 let n = 0 for (let i = 0; i < str.length; i++) { const element = str[i]; if (oper..原创 2021-09-02 14:57:28 · 1562 阅读 · 1 评论 -
VO、AO、执行环境和作用域链
1、变量对象(variable object)原文:Every execution context has associated with it a variable object. Variables and functions declared in the source text are added as properties of the variable object. For function code, parameters are added as properties of the转载 2021-09-01 21:24:08 · 799 阅读 · 0 评论 -
js 判断对象是否通过new创建
//方式1function Person(n,a){ this.name = n; this.age = a; if(this instanceof Person){ alert('new调用'); }else{ alert('函数调用'); }}var p = new Person('jack',30); // --> new调用Person(); // --> 函数调用//方式2function P.原创 2021-08-30 21:13:48 · 831 阅读 · 0 评论 -
JS 实现函数链式调用
let index = 0 let stack = [] function next(){ let fn = stack[index] index++ if(typeof fn === 'function') { fn() } } function T(name) { stack.push(function() { console.log('Hi! This is' + name) next() }) .转载 2021-08-30 18:17:20 · 935 阅读 · 0 评论 -
js 实现sleep函数
async function test() { for (var i = 0; i < 10; i++) { await sleep(1000); console.log(i); }} function sleep(delay) { return new Promise((resolve, reject) => { setTimeout(() => { try { .转载 2021-08-30 18:12:02 · 346 阅读 · 0 评论 -
js 深拷贝函数
// 定义一个深拷贝函数 接收目标target参数function deepClone(target) { // 定义一个变量 let result; // 如果当前需要深拷贝的是一个对象的话 if (typeof target === 'object') { // 如果是一个数组的话 if (Array.isArray(target)) { result = []; // 将result赋值为一个数组,并且执行遍历 .转载 2021-08-25 15:33:07 · 736 阅读 · 0 评论 -
js 箭头函数和普通函数的区别
箭头函数和普通函数的区别一.外形不同:箭头函数使用箭头定义,普通函数中没有代码实例如下:// 普通函数function func(){ // code}// 箭头函数let func=()=>{ // code}二.箭头函数都是匿名函数普通函数可以有匿名函数,也可以有具体名函数,但是箭头函数都是匿名函数。代码实例如下:// 具名函数function func(){ // code}// 匿名函数let func=function(){ // co...转载 2021-08-25 15:20:16 · 444 阅读 · 0 评论 -
js实现二叉树的先序、中序、后序遍历,递归和非递归方法
//递归实现function TreeNode(x){ this.val=val; this.left=null; this.right=null;}// 递归方法function threeOrders(root){ let preArray=[],middleArray=[],lastArray=[]; //先序遍历:根、左、右 function preOrder(root){ if(root){ preA.转载 2021-08-24 23:14:01 · 336 阅读 · 0 评论 -
js 求二叉树的深度
const root = { val: 4, left: { val: 2, left: { val: 1 }, right: { val: 3 } }, right: { val: 5, right: { val: 6, right: {.转载 2021-08-24 21:59:28 · 304 阅读 · 0 评论 -
js 四种继承方式
继承说到继承,最容易想到的是ES6的extends,当然如果只回答这个肯定不合格,我们要从函数和原型链的角度上实现继承,下面我们一步步地、递进地实现一个合格的继承实现一个方法可以从而实现对父类的属性和方法的继承,解决代码冗余重复的问题一. 原型链继承原型链继承的原理很简单,直接让子类的原型对象指向父类实例,Child.prototype=new Parent()1当子类实例找不到对应的属性和方法时,就会往它的原型对象,也就是父类实例上找,从而实现对父类的属性和方法的继承原型继转载 2021-08-23 15:56:13 · 135 阅读 · 0 评论 -
js正则匹配方法:match和exec
match是字符串方法,写法为:str.match(reg) exec是正则表达式方法,写法为:reg.exec(str) match和exec在匹配成功时返回的都是数组,在没有匹配上时返回的都是null,故在没有深入了解两者的使用规则前,会误以为两者的使用效果是一样的,下面在几种情况中对match和exec进行区分。1、全局匹配: 当不使用全局匹配时,两者的匹配效果是一样的,仅返回第一次匹配成功的结果:var s = "aaa bbb ccc";var reg = /\b转载 2021-08-22 15:35:04 · 1780 阅读 · 0 评论 -
JavaScript 实现多叉树的遍历
/** * 用于演示的 JSON 树形数据结构 */var root = { name:'D盘', children:[ { name:'学习', children:[ { name:'电子书', children:[ { name:'文学', children:[ { .转载 2021-08-22 15:20:43 · 587 阅读 · 0 评论 -
react中super()的理解
es6 class(类) 方法创建组件1 // 构造函数 会 默认生成 一个原型对象2 function Person(name,) {3 this.name = name;4 }5 console.log(Person); // 构造函数本身6 console.log(Person.prototype) // 指向原型对象7 console.log(Pers转载 2021-08-20 17:41:04 · 1146 阅读 · 0 评论 -
js 暂时性死区的理解
当程序的控制流程在新的作用域(module function 或 block作用域)进行实例化时,在此作用域中用let/const声明的变量会先在作用域中被创建出来,但因此时还未进行词法绑定,所以是不能被访问的,如果访问就会抛出错误。因此,在这运行流程进入作用域创建变量,到变量可以被访问之间的这一段时间,就称之为暂时死区。TDZ(暂时性死区)是一个很重要的概念,在很多的面试环节都有可能问到该概念,其影响let、const、import、class、typeof等关键字的可用性,不容忽视;因此大家.原创 2021-08-20 17:20:02 · 292 阅读 · 0 评论 -
JS 语法有效性的判断
给定一个只包括 '(',')','{','}','[',']'的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。/** * @param {string} s * @return {boolean} */var isValid = function(s) { if(s==" "||s==""){ return true; } let stac.转载 2021-08-19 16:41:57 · 839 阅读 · 0 评论 -
一维数组变成树结构
let dataArr = [ { id:1, name:'爷爷', pid:0 }, { id:2, name:'爸爸', pid:1 }, { id:3, name:'伯伯', pid:1 }, { id:4, name:'辉', pid:2 }, { id:5, name:'军', pid:3 }, ]var toTree = function(tarArray){.转载 2021-08-18 18:16:25 · 291 阅读 · 0 评论 -
js 自己实现Promise
function Promise(exector) { var _this = this this.status = 'pending' this.value = undefined this.resolveList = [] this.rejectList = [] try { exector(resolve, reject) }catch(e) { reject(e) } function resolve(value) { if(_thi.转载 2021-05-21 18:29:16 · 127 阅读 · 0 评论 -
js 实现二叉树翻转
思路:如果根节点不为空,那么将左右子结点交换,然后将左右子结点进行递归调用。function invertTree(root) { debugger if (root !== null) { var temp = root.left; root.left = root.right; root.right = temp; invertTree(root.left); invertTree(root.right); } return root...转载 2021-05-21 17:35:04 · 504 阅读 · 0 评论 -
ES6 模块与 CommonJS 模块的差异
它们有三个重大差异。CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。 CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。 CommonJS 模块的require()是同步加载模块,ES6 模块的import命令是异步加载,有一个独立的模块依赖的解析阶段。第二个差异是因为 CommonJS 加载的是一个对象(即module.exports属性),该对象只有在脚本运行完才会生成。而 ES6 模块不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成转载 2021-04-14 19:40:29 · 88 阅读 · 0 评论 -
js 累计积分技术分享算法
前端团队的技术分享2周一次,一次2人为了确定下一次是谁来分享,团队中引入了分享积分制,具体规则为:每个人都有一个积分,初始值是0。每次分享后所有人摇一轮骰子,点数作为积分累加到各自的积分中,骰子范围是1-12。积分最高的2个人将作为下一次的分享人。为了避免连续分享,某个人分享后他的积分会被清零且跳过本次的摇骰子环节。如果积分最高的人数超过2人,则相同分数的人继续摇骰子,直到决出2个积分最高的人。需要注意的是,这期间摇骰子的积分也同样累积。请你编写代码模拟这个过程,数据结构和函数组织自由发挥..原创 2021-04-14 15:27:55 · 748 阅读 · 0 评论 -
js中事件循环和Nodejs中事件循环对比
1.JavaScript中事件循环可以参考《JavaScript忍者秘籍第二版》第十三章,讲解的很好。JavaScript中事件循环,主要就在理解宏任务和微任务这两种异步任务。宏任务(macrotask): setTimeOut 、 setInterval 、 setImmediate 、 I/O 、 各种callback、 UI渲染 、messageChannel等优先级:主代码块 > setImmediate > postMessage > setTimeOut/set...转载 2021-04-13 15:13:41 · 654 阅读 · 0 评论 -
js 自由变量的取值
函数在定义的时候(不是调用的时候),就已经确定了函数体内部自由变量的作用域在函数中this到底取何值,是在函数真正被调用执行的时候确定的,函数定义的时候确定不了。因为this的取值是执行上下文环境的一部分,每次调用函数,都会产生一个新的执行上下文环境。自由变量的取值是要到创建这个函数的那个作用域中取值,而不是到父作用域中取值 var a=10; function fn(){ console.log(a); } function fn2(fn){.原创 2021-04-13 11:09:21 · 595 阅读 · 0 评论 -
js 原型循环引用
Object instanceof Function //trueFunction instanceof Function //trueFunction instanceof Object //true// 原型循环引用Object.__proto__ == Function.prototype //trueFunction.prototype==Function.__proto__ //trueFunction.__proto__==Object.__proto__ //trueObje.原创 2021-04-13 11:03:20 · 205 阅读 · 0 评论 -
js 实现JSON.stringify 转化加格式化
//输入:var data = { a: 1, b: [2, 3, { c: 4 }], d: { e: 5, f: { g: '6' }, }}//输出:"{ "a": 1, "b": [ 2, 3, { "c": 4 } ], "d": { "e": 5, "f": { "g": "6" }.原创 2021-04-12 15:03:23 · 1515 阅读 · 0 评论 -
js 继承到多个对象
functionMyClass(){SuperClass.call(this);OtherSuperClass.call(this);}//继承一个类MyClass.prototype=Object.create(SuperClass.prototype);//混合其它Object.assign(MyClass.prototype,OtherSuperClass.prototype);//重新指定constructorMyClass.prot...原创 2021-04-12 11:03:38 · 200 阅读 · 0 评论 -
JS数组去重的各种方法(包括去重NaN和复杂数组类型,对象,正则表达式)
测试数据:let arr1 = [3, 1, [1], 1, [1], true, true, {}, '1', NaN, undefined, NaN, undefined, {}, null, null,new String('1'),new String('1')];1. 两种for循环 + splice(耗时最长)不能正确去重NaN和Object的方法Array.prototype.unique = function () { for (let i = 0; i < thi..原创 2021-03-14 23:15:19 · 555 阅读 · 0 评论 -
Objects 和 maps 的比较
Map Object 意外的键 Map默认情况不包含任何键。只包含显式插入的键。 一个Object有一个原型, 原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。 注意:虽然 ES5 开始可以用Object.create(null)来创建一个没有原型的对象,但是这种用法不太常见。 键的类型 一个Map的键可以是任意值,包括函数、对象或任意基本类型。 一个Object的键必须是一个String或是Symbol。...原创 2021-03-14 10:49:43 · 241 阅读 · 0 评论 -
JS对象的遍历方法及对比
对象遍历的方法包括:Object.keys()、for-in、Object.getOwnPropertyNames(obj)、Reflect.ownKeys(obj)等方式。Object.keys()该方法会返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性)。或者Object.values()Object.values()方法返回一个给定对象自身的所有可枚举属性值的数组或者Object.entries()方法返回一个给定对象自身可枚举属性的键值对数组 &l..原创 2021-03-14 10:31:52 · 428 阅读 · 0 评论 -
js判断一个对象是不是Array
1:function isArray(obj) { return Object.prototype.toString.call(obj) === '[object Array]'; }2:function isArray(obj){ if(typeof obj=="object"&&obj.constructor==Array){ return true; }return false;}3:console.log(obj instanceof A...原创 2021-03-14 09:28:14 · 85 阅读 · 0 评论 -
js 数组操作
数组的遍历for:普通版:for(let i=0; i<arr.length; i++) { }优化版:for(let i=0,len=arr.length; i<len; i++) { }弱化版:for(let i=0; arr[i] != null; i++) { }forEach: arr.forEach((e, index) => { })性能比for要弱变种:Array.prototype.forEach.call(arr, (el, index) =..转载 2021-03-14 09:20:47 · 169 阅读 · 0 评论 -
promise.all的实现 es6
|Promise.all(iterable)方法返回一个 [Promise],此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise 的结果。特点: 返回值将会按照参数内的 promise 顺序排列,而不是由调用 promise 的完成顺序决定。 有一个出错,就被认定为失.转载 2021-03-13 18:24:19 · 440 阅读 · 0 评论 -
js 判断两个数组是不是子集关系
constobj1=[{a:1},{a:1,b:2},{a:2}];constobj2=[{a:1},{a:2},{a:1,b:2,c:3}];varresult=this.checkArrayInArray(obj1,obj2);console.log(result);checkArrayInArray(a,b){if(a.lengt...原创 2020-10-14 17:21:22 · 1484 阅读 · 0 评论