
Javascript
梁什么鸭,
Learning,
展开
-
LeetCode 47:全排列Ⅱ(Javascript 解答)
原题目给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。示例1:输入:nums = [1,1,2]输出:[[1,1,2], [1,2,1], [2,1,1]]解题思路这个题跟第 46 题唯一的区别是 nums 中有重复的元素,那么就会导致会有相同的解集。比如说示例1 :如果还是用 46 的解题思路,那么解集:[[1,1,2], [1,2,1], [1,1,2], [1,2,1], [2,1,1], [2,1,1]]题目要求全排列,不重复,那么原创 2022-05-10 15:41:22 · 582 阅读 · 0 评论 -
leetCode 46:全排列(Javascript 解答)
原题目给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例1:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例2:输入:nums = [0,1]输出:[[0,1],[1,0]]解题思路题目说到不重复,那么只需要用一个数组来标记已选择过的元素。下一轮递归时,跳过这个元素即可。这个题很简单,实在没什么解题思路了代码var permute =原创 2022-05-10 14:55:32 · 518 阅读 · 1 评论 -
LeetCode 40:组合总和Ⅱ(Javascript 解答)
原题目给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。注意:解集不能包含重复的组合。示例 1:输入: candidates = [10,1,2,7,6,1,5], target = 8,输出:[[1,1,6],[1,2,5],[1,7],[2,6]]示例 2:输入: candidates = [2,5,2,1,2]原创 2022-05-07 16:13:01 · 435 阅读 · 0 评论 -
LeetCode 39:组合总和(Javascript 解答)
组合总和原创 2022-04-27 16:30:44 · 301 阅读 · 0 评论 -
LeetCode 22:括号生成 (JavaScript 解答)
括号生成原创 2022-04-27 11:07:32 · 1321 阅读 · 0 评论 -
LeetCode17:电话号码的字母组合(Javascript 解答)
递归原创 2022-04-26 18:07:48 · 197 阅读 · 0 评论 -
关于 Javascript 算法
Javascript 算法原创 2022-04-26 15:38:39 · 1548 阅读 · 0 评论 -
关于一个原型链的误区
今天复习原型链的时候,发现有个误区(我自己的,不知道你们有没有),先看代码function Fn() { this.test1 = function () { console.log('test1'); } } console.log(Fn.prototype); Fn.prototype.test2 = function () { console.log('test2'); } var fn = new Fn(); console.l原创 2021-07-30 02:42:09 · 163 阅读 · 0 评论 -
jsonp
说到Ajax,就涉及到跨域访问的问题解决跨域访问的方法:1、CORS2、反向代理3、jsonp : 纯前端能实现的跨域,前两者不能。jsonp是什么?利用script的src跨域访问资源,而后台对应的返回一个函数调用,然后把JSON数据放在函数的参数里面返回给前端所以它是JSON使用的一种模式如果后台没有写对应jsonp接口,那么就请求不到了。都得通过后台的允许。jsonp作用: 跨域获取数据。jsonp的实现原理script的src属性具备: 跨域请求资源的能力那么可以通过原创 2021-06-19 19:45:44 · 175 阅读 · 0 评论 -
本地存储(localStorage)
只读的localStorage 属性允许你访问一个Document 源(origin)的对象 Storage;存储的数据将保存在浏览器会话中。localStorage 类似 sessionStorage,但其区别在于:存储在 localStorage 的数据可以长期保留;而当页面会话结束——也就是说,当页面被关闭时,存储在 sessionStorage 的数据会被清除 。cookie也用来存储数据,但是cookie不适合存储太多数据因为cookie有个特性:每次请求后台的时候,cookie所有的原创 2021-06-19 15:22:40 · 4801 阅读 · 1 评论 -
cookie
什么是cookie?一个正常的项目需要前台和后端,后端给前端提供服务,前端利用后端提供的服务跟用户进行交互这就涉及到关于数据的传输,数据传输涉及到HTTP协议HTTP是无状态的,用户在每次访问的时候对于HTTP而言都是一次全新的访问,压根不会保留当前用户之前或者说上一次访问的访问状态但是我们往往需要记录历史访问状态,比如: 保存登录状态,当登录了账号后,下次访问就是已登录状态,那么就用到了cookie打开百度搜索页面,F12打开控制台,点击Network:由于cookie每次都会发送到后台,那原创 2021-06-17 01:01:14 · 2344 阅读 · 0 评论 -
自定义滚动条
See the Pen vYxvXPb by 梁敏莹 (@liang-duck) on CodePen.原创 2021-06-15 13:27:49 · 606 阅读 · 0 评论 -
滚轮_阻止默认行为_滚零事件兼容
滚轮事件onmousewheel 滚轮事件 火狐不兼容兼容火狐 : DOMMouseScroll虽然type不同,但是DOMMouseScroll 不能使用DOM 0级绑定滚轮的滚动方向 :主流览器: e.wheelDelta 向前滚动:150的倍数 向后:-150的倍数火狐: e.detail 向前滚动:-3的倍数 向后:3的倍数window.onload = function () { document.addEventListener("mousew原创 2021-06-15 13:04:41 · 494 阅读 · 0 评论 -
创建标签元素、createElement、appendChild、createDocumentFragment
栗子:<style> * { margin: 0; padding: 0; } #box div{ width: 100px; height: 100px; background: pink; } #box p { width: 100px; height: 100px; background: cornflowerblue; } </st原创 2021-06-02 15:23:32 · 561 阅读 · 1 评论 -
setAttribute、getAttribute、removeAttribute
问题:下面两者的区别box.setAttribute("liang", "456");box.liang = 789;<body> <div id="box" liang="123"></div></body><script> const box = document.getElementById('box'); /*// 标签里元素里的自定义属性 box.setAttribut原创 2021-06-01 17:30:29 · 481 阅读 · 0 评论 -
Generator、async 解决异步编程
Generator生成器,生成Iterator接口对象的生成器yield 可暂停函数,yield 后面的值可返回出去,且不终结函数进行故generator函数一次执行可返回多个值// Generator函数格式 (带*)function* fn2() { yield 1; yield 2; return 3; } fn(); // 不输出修改成以下代码:function* fn2() { yield co原创 2021-06-01 13:54:40 · 237 阅读 · 0 评论 -
Promise
Promise一个容器,保存着某个未来会结束的事件(通常是一个异步操作)的结果当有大量的计算时,整个系统会卡住,都会使用异步的方式 [回调地狱: 回调嵌套] 来进行组织代码回调嵌套不容易找出报错的地方为解决回调地狱的问题,ES6提供了Promise栗子:setTimeout(() => { console.log("shenme"); }) console.log("liang"); // liang 会比 shenme 先输出如果想原创 2021-06-01 00:46:18 · 177 阅读 · 0 评论 -
Proxy
用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种 “元编程”,即对编程语言进行编程Proxy 可理解成,在目标对象之前架设一层 “拦截” ,外界对该对象的访问,都必须先通过这层拦截,因此提供了一些机制,可对外界的访问进行过滤和改写。Proxy 原意是 “代理”,用在这表示由它来 “代理” 某些操作,可译为 “代理器”。let o = { a: 1, b: 2 } let obj = new Proxy(o, { // target -原创 2021-05-30 21:50:56 · 1098 阅读 · 0 评论 -
Set、WeakSet 和Map、WeakMap数据结构
SetES6提供的新的数据结构类似数组,但成员是唯一的,没有重复的值const s = new Set();[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));// 要往Set结构里创建/添加值,只能调用 s这个实例下面的add方法for( let i of s) { console.log(i);}// 结果输出 2 3 5 4可利用这个特性对数组进行去重[...new Set(array)]向Set加入值的时候,不会发生类型转换原创 2021-05-30 14:37:52 · 153 阅读 · 0 评论 -
Symbol
Symbol是什么?有点类似字符串,栗子:// 在字符串中”1“ === ”1“;// 是字面量,只比较值是否长得一样通常对象设置属性名的时候,都是采用字符串形式,但这可能出现相等的属性名,那么就会出现覆盖。但用Symbol–>用符号作为属性名的时候,就绝对不会出现相等,用Symbol产生的值是独一无二的。// 在Symbol中”1“ !== ”1“;怎么生成一个Symbol类型的值可通过Symbol函数生成 let s = Symbol();Symbol函数前不能用原创 2021-05-30 03:42:54 · 341 阅读 · 0 评论 -
call、apply、bind以及bind的兼容问题
修改函数this指向的方法1、call2、apply// 前两个会主动执行调用函数3、bind (不兼容低版本IE)// 这个不会主动执行调用函数以上三个方法的第一个参数,都是修改调用函数的this指向的对象名调用函数的实参一次写在后面栗子: var a = 1; var obj = { a: 2 } function fn() { console.log(this); } fn(); // 指向顶层对象 window原创 2021-05-28 17:36:41 · 234 阅读 · 0 评论 -
关于包装对象
栗子:let str = 'liang'; // 值类型str.num = 'shenme'; // 临时对象console.log(str.num); // 又重新创建一个临时对象// 输出 undefined let str2 = new String(123); // 引用型 str2.num = 'liang'; console.log(str2.num); // 输出liangstr.num = ‘shenme’; 创建了一个临时对象,且赋值为shenme,但这条代码执行完后立原创 2021-05-28 01:26:56 · 115 阅读 · 0 评论 -
静态属性,super()
静态属性: 只能被类调用的属性在ES5中 静态属性写法function MyClass() { } // ES5 静态属性写法 /*MyClass.say = function () { console.log('这是一个静态方法'); } const obj = new MyClass();*/在ES6中 静态属性写法 // ES6 /*class MyClass { constructor() {原创 2021-05-28 01:03:02 · 309 阅读 · 0 评论 -
对象深浅拷贝,extends
浅拷贝、深拷贝栗子:const obj = { a: 1, // 普通值/副本 b: ['a', 'b'] // 引用型 } // 浅拷贝,只做最外层的一层拷贝。 // 问题:在拷贝过程中可能对象的某个属性也是引用型。 // 那么问题来了,如果是普通值类型/副本,那么没问题。 // 如果是引用型,那么这里就是交出地址,也就是说obj的属性和obj2的属性指向的同一个内存地址 const obj2 = { a: obj原创 2021-05-25 23:49:01 · 230 阅读 · 3 评论 -
原型继承
让P2继承P1,下面直接将P1的属性赋给P2,这种方法不建议使用<script> function P1() { this.name = arguments[0]; this.age = arguments[1]; } P1.prototype.sayName = function () { alert(this.name); }; // 通过复制,来继承P1 function P2() {原创 2021-05-25 19:00:11 · 122 阅读 · 0 评论 -
class
在ES6 之前是保留字,ES6里升级了关键字(有特殊意义)用于定义类<script> //ES5 function Person(name, age) { this.name = name; this.age = age; } // 由于原型本质是一个对象,所以不止可以设置普通方法,还可以设置属性 // 但是ES6中在constructor外只可以定义方法,不可以定义属性原创 2021-05-25 16:33:29 · 125 阅读 · 0 评论 -
面向对象编程
之前的代码更多的是关注过程:面向过程栗子:<script> window.onload = function () { // 弹窗插件 function Alert(alert) { // 可绑定事件 button.onclick = function () { // 让这个弹窗弹出来 }; span.onclick = function () {原创 2021-05-24 20:31:27 · 94 阅读 · 0 评论 -
正则
1、替换字符let str = "18liang18"; let reg = /\d{2}/g; // \d 匹配数字[0-9], g全局搜索let s1 = str.replace(reg, "ya");console.log(s1); // 输出 yaliangya2、颠倒字符顺序let str1 = "梁什么鸭";let reg1 = /(梁什么)(鸭)/g; // 注意这里的字符必须是连着的,否则颠倒// 比如 let reg1 = /(梁)(鸭)/g; 那么结果原创 2021-05-24 16:22:31 · 118 阅读 · 0 评论 -
选择排序
快速排序原理思路:用第一个数跟后面的数进行比较,如果第一个数比后面的数大,就交换位置步骤原数组:第一次排序,第一次比较,用第一个数arr[0] 跟 arr[1] 比较,如果arr[0] < arr[1],则交换位置,否则不做改变第二次比较,用arr[0] 跟 arr[2] 比较第三次比较,用 arr[0] 和 arr[3] 比较第四次比较,用 arr[0] 和 arr[4] 比较这里第一次排序结束,现在进行第二次排序第一次比较,比较 arr[1] 和 arr[2]第二原创 2021-05-20 00:03:04 · 117 阅读 · 0 评论 -
冒泡排序
冒泡排序这里演示的是从最后一项开始排序先比较arr[4] 和 arr[3] ,如果arr[4] 小于 arr[3], 那么交换它们两的位置,否则不做改变 (所以程序进行到这里时,数组没做改变),进行下一次比较,即比较 arr[3] 和 arr[2],此时 arr[3] < arr[2] , 所以交换两者位置。此时数组如下所示:然后再进行下一次比较 ,即比较 arr[2] 和 arr[1] ,原理如上,所以这里交换两者位置:最后比较 arr[1] 和 arr[0] ,最后结果:以原创 2021-05-19 21:20:14 · 100 阅读 · 0 评论 -
倒计时栗子
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <style> #box { margin: auto; width: 500px; font-size: 24px; } #time { color: #b8425原创 2021-05-19 09:33:43 · 107 阅读 · 0 评论 -
优化for循环
let arr = [1, 2, 3, 4];for (let i = 0; i < arr.length; i++) { ...}JS 中访问一个变量比访问一个对象属性要方便,比如像以上例子,每循环一次都要找到 arr 这个对象,然后再在这个对象众多属性中寻找 length 这个属性,显然很麻烦。let arr = [1, 2, 3, 4];let len = arr.length;for (let i = 0; i < len; i++) { ...}当进行上述优化原创 2021-05-17 18:15:01 · 143 阅读 · 0 评论 -
引用型、值类型
值类型(number 、 Boolean、 undefined、 null 、string)比较: 只比较是否长得一样let a= 0;let b= 0;或者let a= null;let b= null;或者let a= undefined;let b= undefined;console.log(a === b); //true引用型(object、Array):比较内存地址let a = [];let b = [];console.log(a === b);原创 2021-05-16 15:44:26 · 172 阅读 · 0 评论 -
IIFE (立即执行函数表达式)
函数自执行的写法(function () {}())(function () {})()+function () {}()-function () {}()~function() {}()!function() {}()let a = function () {}() //不建议使用,容易让人以为可以调用没什么区别,用法不一样而已立即执行函数的意义开辟一个作用域,不会污染全局环境...原创 2021-05-16 13:24:49 · 201 阅读 · 0 评论 -
if() - else if()的误区
if() { ...}else if () { ...}有很多初学者可能会认为,上面的语句是从上到下都执行一遍的,也就是先判断if语句,然后再判断else if,其实不是这样的。只有当if中的判断条件不符合的时候才会执行else if当if语句中的判断条件符合的时候,就会跳出整个判断语句,也就是跳过else if()语句栗子:var index = -1; for (var i = 0; i < aInput.length; i++) { aInpu原创 2021-05-14 16:06:24 · 555 阅读 · 0 评论 -
系统对象
系统对象1、本地对象(非静态对象)什么是本地对象常用对象2、内置对象(静态对象)什么是本地对象3、宿主对象(由浏览器提供的对象)1、本地对象(非静态对象)什么是本地对象必须new ,实例化比如: Array.push() 是不对的 , 必须var arr = new Array(); arr.push();常用对象Object 、Function、 Array、 String、 Boolean、 Number、 Data、 RegExp、 Error2、内置对象(静态对象)什么是本地原创 2021-05-12 14:16:28 · 332 阅读 · 0 评论 -
继承(B继承A后,改变B,A也发生了同样的改变)
先说一个引用的栗子:<script> var arr1 = [1, 2, 3]; var arr2 = arr1; alert(arr1); alert(arr2); </script>当 arr2.push(4);,本意是想着给arr2单独添加一个4,但是运行发现arr1也添加了4原因: var arr2 = arr1; 并不是把arr1里的内容复制给了arr2 ,而是使arr1和arr2都指向了同一个内存空间所以改变arr2指向原创 2021-05-12 01:39:11 · 199 阅读 · 0 评论 -
类跟对象的区别
打个比方:类 -->模具对象 -->产品var arr = new Array(1, 2, 3);这里的 Array 就是一个类,可以当模具再生成一个对象而arr是一个对象,具有实际功能的,但不能作为模具再去生成一个对象 :var arr2 = new arr();就像蛋糕模具(类),你可以用模具造一个蛋糕,但你不可以用一个蛋糕(对象)去造一个蛋糕举个栗子:可以 arr.push() 但不可以Array.push()就像你可以吃蛋糕,但你总不能吃模具吧。也就是原创 2021-05-11 16:43:16 · 91 阅读 · 0 评论 -
原型(prototype)、原型链、继承
什么是原型?(prototype)在CSS中:class 一次给一组元素加样式行间样式 一次给一个元素加样式在JS中:(这里是说原型类似于CSS中的class ,而不是说原型就是class)原型 就是class而行间样式 称为 给对象加事件栗子:<script> var arr1 = new Array(12, 25, 23, 5); var arr2 = new Array(1, 23, 456, 55); arr1...原创 2021-05-11 16:27:09 · 320 阅读 · 0 评论 -
编写Ajax
创建Ajax对象有两种方法:1、var oAjax = new XMLHttpRequest(); //只兼容非IE6的浏览器2、var oAjax = new ActiveXObject("Microsoft.XMLHTTP"); //只兼容IE浏览器一般照顾兼容,我们会直接用 if 语句if (XMLHttpRequest) { var oAjax = new XMLHttpRequest();}else { var oAjax = new A..原创 2021-05-11 00:52:39 · 318 阅读 · 0 评论