![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JavaScript
楚楚梦厦
迷失的人迷失了,相遇的人会再相遇!
展开
-
Promise乞丐版实现
1. 基本概念:Promise 是异步编程的一种解决方案:promise是一个对象,从它可以获取异步操作的消息;它是承诺,承诺它过一段时间会给你一个结果。promise有三种状态:pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。promise是用来解决两个问题的:回调地狱,代码难以维护, 常常第一个的函数的输出是第二个函数的输入这种现象。promise可以支持多个并发的请求,获取并发请求中的数据原创 2021-11-09 11:51:55 · 65 阅读 · 0 评论 -
JavaScript实现大数相加
function bigNumAdd (a, b) { let res = '', c = 0 a = a.split('') b = b.split('') while (a.length || b.length || c) { // let nums1 = ~~a.pop(); let nums1 = Number(a.pop()) || 0; // let nums.原创 2021-11-10 14:58:10 · 821 阅读 · 0 评论 -
JavaScript防抖和节流
1. 防抖一段时间内,回调函数只会调用一次。如果在规定时间内又触发了该事件,则会重新开始算规定时间。举个栗子,如:窗口滚动scroll事件会在滚动的时候一直触发,比如你滚动了3s,可能触发了几十次printSomething函数。window.onscroll = function(){printSomething();}但如果只想在这3s内只触发一次,那么就可以用防抖函数来实现。//在停止滚动后的200ms后,执行函数window.onscroll = debounce(printSomet原创 2021-11-03 16:06:09 · 138 阅读 · 0 评论 -
JavaScript实现bind方法
Function.prototype.pBind = function () { var self = this; // 保存原函数 var context = [].shift.call(arguments); // 保存需要绑定的this的上下文 var args = Array.prototype.slice.call(arguments); // 剩余的参数转为真数组 console.log('args-------------',ar原创 2021-11-10 15:00:48 · 1414 阅读 · 0 评论 -
JS千分位加逗号
function formatEveryThreeReg (num) { num = num + '' var reg = /[1-9]\d{0,2}(?=(\d{3})+$)/g // var reg = /[1-9]\d{0,2}(?=(\d{3})+$)/g return num.replace(reg, '$&,') } function formatEveryThreeNoReg(num) {原创 2021-11-15 17:33:12 · 715 阅读 · 0 评论 -
深拷贝和浅拷贝及简单实现
1. 深拷贝和浅拷贝简单理解 浅拷贝的对象若包含子对象,当新的对象对子对象发生改变时则会使原对象子对象一同改变,若新的对象只改变第一层的数据,则源对象不会改变。 换句话说:浅拷贝过来的数据只有第一层数据不是共享的,第二层乃至第三层的数据和源对象是共享的。而深拷贝是和源对象没有任何共享的。浅拷贝:将原对象或原数组的引用直接赋给新对象或新数组,新对象或数组只是原对象的一个引用深拷贝:创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来, 是“值”而不是“引用”。深拷贝原创 2021-11-04 15:49:17 · 179 阅读 · 0 评论 -
JavaScript实现indexOf方法
/** * @param fatherStr {String} 源字符串 * @param sonStr {String} 查找的目标字符串 * @param startIndex {number} 查找的起始位置 */ function nIndexOf(fatherStr, sonStr, startIndex) { let i; // 循环开始位置 if (!startIndex || startIndex < 0)原创 2021-11-10 15:02:48 · 1293 阅读 · 0 评论 -
JavaScript函数柯里化
1.什么是柯里化柯里化是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回接受余下参数的新函数的技术。函数柯里化的主要作用和特点就是参数复用、提前返回和延迟执行。2. 温习简单实现2.1. 基础实现// 普通的sum函数function sum(x, y) { return x + y;}//Currying之后function curryingSum(x) { return function (y) { return x + y; }}原创 2021-11-03 20:37:10 · 232 阅读 · 0 评论 -
无重复字符的最长子串JavaScript实现
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。输入: s = “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。var lengthOfLongestSubstring = function(s) { // 哈希集合,记录每个字符是原创 2021-11-16 18:25:46 · 862 阅读 · 0 评论 -
JavaScript求最大的岛屿面积
function maxAreaOfIsland(grid) { let row = grid.length; // 行数 let col = grid[0].length; // 列数 let res = 0; const dfs=(i, j)=>{ if (i < 0 || i >= row || j < 0 || j >= col || grid[i][j] === 0) return 0; grid[i][原创 2021-12-07 16:23:36 · 633 阅读 · 0 评论 -
JavaScript求岛屿的数量
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [[“1”,“1”,“1”,“1”,“0”],[“1”,“1”,“0”,“1”,“0”],[“1”,“1”,“0”,“0”,“0”],[“0”,“0”,“0”,“0”,“0”]]输出:1示例 2:输入:grid = [[“1”,“1”,“0”,“0原创 2021-12-07 16:21:47 · 185 阅读 · 0 评论 -
JavaScript深度优先查找(DFS)和广度优先查找(BFS)
JavaScript实现深度优先搜索和广度优先搜索原创 2021-12-07 16:14:57 · 916 阅读 · 0 评论 -
JavaScript实现全排列
1.给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例 1:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]function permute(nums) { const res = [], path = []; const used = new Array(nums.length).fill(false); const dfs =()=原创 2021-12-07 16:07:22 · 2503 阅读 · 0 评论 -
JavaScript两数之和target
给定一个整数数组nums和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1: 输入:nums = [2,7,11,15], target = 9输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], target = 6原创 2021-12-07 16:04:30 · 475 阅读 · 0 评论 -
JavaScript实现比较两个app版本号
给你两个版本号 version1 和 version2 ,请你比较它们。版本号由一个或多个修订号组成,各修订号由一个 ‘.’ 连接。每个修订号由多位数字组成,可能包含前导零 。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0 ,下一个修订号下标为 1 ,以此类推。例如,2.5.33 和 0.1 都是有效的版本号。比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较忽略任何前导零后的整数值 。也就是说修订号1和修订号001相等原创 2021-12-07 15:59:40 · 1594 阅读 · 0 评论 -
JavaScript合并两个有序数组
给你两个按非递减顺序排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。ps: 最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n示例 1:输入:nums1 = [1,2,3,0,0,0],原创 2021-12-07 15:55:18 · 742 阅读 · 0 评论 -
JavaScript实现pid树结构互相转换
给定一个如下结构的list数组,找出对应的pid的id,即pid对应的id就是它的父亲节点。如下结构简称扁平结构const list = [ { id:1,pid:0,value:"宋唐" }, { id:2,pid:1,value:"宋唐1" }, { id:3,pid:1,value:"宋唐2" }, { id:4,pid:1,value:"宋唐3" }, { id:5,pid:0,value:"刘梦婕" },原创 2021-12-07 15:47:22 · 882 阅读 · 2 评论 -
面试官问JavaScript的forEach、map、filter的区别了解吗
最近面了字节,这个问题直接把我问的怀疑人生。所以简单总结下,以备日后。面试官问:js的数组有几个方法,forEach、map、filter,它们有什区别?我:刚开始回答说map和filter必须要有返回值,forEach可以没有。面试官问:那如果我一定要在forEach中return什么呢,会怎么样?我:(直接虚了)磕磕巴巴的说,应该不会怎么样吧[~泪崩]。面试官笑了问:行,那我换个问法,你能说一下下面arr和newArr执行后的值吗?let arr = [1, 4, 6, 2];let ne原创 2021-11-22 11:40:23 · 488 阅读 · 0 评论 -
JavaScript数组去重
1. indexOf有的话给数组下标,没有给-1 let arr1 = [2,4,6,2,4,6,1,2,3]; let newArr1 = []; for (let i = 0; i < arr1.length; i++) { //if (!newArr1.includes(arr1[i])) newArr1.push(arr1[i]); if(newArr1.indexOf(arr1[i]) === -1) { // 证明newArr中没有原创 2021-11-05 11:42:50 · 333 阅读 · 0 评论 -
JavaScript数组扁平化flatten
JS扁平化分类:对象扁平化:深度很深的对象,经过扁平化编程深度为 1 的对象.数组扁平化:降维过程,多维数组经过扁平化变成一维数组)。数组扁平化flatten实现1.利用递归函数// 1.利用递归函数function flatten(arr) { let finalArr = []; for (let i = 0; i < arr.length; i++) { if (Array.isArray(arr[i])) { finalA原创 2021-11-04 18:14:15 · 283 阅读 · 0 评论