
Javascript
文章平均质量分 50
郑敬儒~
梅卡德尔
展开
-
call、apply和bind的模拟实现
call()和apply()的区别在于,call()方法接受的是若干个参数的列表,而apply()方法接受的是一个包含多个参数的数组。举例:var func = function(arg1, arg2) { ...};func.call(this, arg1, arg2); // 使用 call,参数列表func.apply(this, [arg1, arg2]) // 使用 apply,参数数组一、call的模拟实现我们先来看一个简单的例子。var value = 1var原创 2021-09-17 20:33:05 · 1101 阅读 · 0 评论 -
构造函数、原型和原型链
构造函数constructor 返回创建实例对象时构造函数的引用。 此属性的值时对函数本身的引用,而不是一个包含函数名称的字符串。function Parent(){ this.age = age}var p = new Parent(50)p.constructor === Parent // truep.constructor === Object // false构造函数本身就是一个函数,与普通函数没有任何区别,不过为了规范一般将其首字母大写。构造函数和普通函数的区别在于原创 2021-09-16 13:29:31 · 1100 阅读 · 0 评论 -
关于setTimeout和Promise执行顺序问题
我们先来看一个代码片段:setTimeout(_ => console.log(4))new Promise(resolve => { resolve() console.log(1)}).then(_ => { console.log(3)})console.log(2)//输出结果为 1、2、3、4可以看出Promise比setTimeout()先执行。因为Promise定义之后便会立即执行,其后的**.then()是异步里面的微任务**,而setTim原创 2021-09-02 13:23:55 · 6351 阅读 · 3 评论 -
JS 浅拷贝与深拷贝
一、数据类型数据分为基本数据类型和对象数据类型。1、基本数据类型的特点:直接存储在栈中的数据。2、引用数据类型的特点:存储的是该对象在栈中的引用,真实的数据存放在堆内存中。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得后从堆中获得实体。如下图:二、浅拷贝与深拷贝浅拷贝和深拷贝是只针对Object和Array这样的引用数据类型的。浅拷贝和深拷贝的示意图大致如下:浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还原创 2021-09-02 12:45:26 · 152 阅读 · 0 评论 -
JS 事件委托详解
基本概念事件委托,就是把一个元素响应事件的函数委托到另一个元素。一般来讲,会把一个或者一组元素的事件委托到它的父层或者更外层元素上,真正绑定事件的是外层元素,当事件响应到需要绑定的元素上时,会通过事件冒泡机制从而触发它的外层元素的绑定事件上,然后在外层元素上去执行函数。事件冒泡DOM中事件委托的实现是利用事件冒泡机制。在document.addEventListener 的时候我们可以设置事件模型:事件冒泡、事件捕获。一般来说都是事件冒泡的模型。如上图所示,事件模型是指分为三个阶段:1、捕原创 2021-09-02 11:05:59 · 259 阅读 · 0 评论 -
JS数组去重的方法
一、利用es6 set去重1、function unique(arr) { return Array.from(new Set(arr)) }2、Array.from()方法就是一个将类数组对象或者可遍历对象转换成一个真正的数组。类数组对象就是 具有length属性的对象。3、要将一个类数组对象转换为一个真正的数组,必须具备一下条件:(1)该类数组对象必须具有 length 属性,用于指定数组的长度;如果没有length属性,那么转换后的数组是一个空数组。(2)该类数组对象的属性名必须为原创 2021-04-21 14:45:24 · 762 阅读 · 0 评论 -
深入理解JS的变量声明提升和函数声明提升
变量声明提升首先是变量的定义,所有没有用var定义就直接赋值的变量都会成为全局变量; 但是如果用var定义了变量,但是没有对其进行赋值,那么变量的初始值就是undefined我们先来看下面的代码:var a = 1;var b = 2;对于这两行代码它的处理过程是:先进行变量的声明:var a;var b;再进行变量的赋值:a = 1;b = 2;变量作用域变量的作用域指的是变量起作用的一个范围。变量分为全局变量和局部变量。全局变量指的是在全局都拥有定义;而局部变量只能在函数原创 2021-03-19 20:21:06 · 208 阅读 · 0 评论 -
聊一聊JS的执行上下文
JS的代码会按照自上到下的顺序解析执行,例如:var foo = function () { console.log('foo1');}foo(); // foo1var foo = function () { console.log('foo2');}foo(); // foo2如果我们把代码改成这样:function foo(){ console.log('foo1');}foo() //foo2function foo(){原创 2021-03-19 19:08:00 · 306 阅读 · 0 评论 -
事件绑定和事件监听的区别
<!DOCTYPE html><html> <head> <meta charset="UTF-8" /> <title>事件绑定与监听的区别</title> </head> <body> <button id="btnA">按钮A</button> <button id="btnB">按钮B</button>原创 2021-03-11 21:53:24 · 682 阅读 · 0 评论 -
this指向
this指向一直对我来说是比较头疼的问题,时不时会在这个上面踩坑,每次都要查各种资料然后才找到问题,每次找又比较麻烦,所以今天我打算自己整理一下 关于this指向 的问题。首先,普通函数,this的概念是:this是JavaScript的一个关键字,他是指函数执行过程中,自动生成的一个内部对象,是指当前的对象,只在当前函数内部使用。(this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this指向的是window;当函数被作为某个对象的方法调用时,this就等于那个对象)this的指向在函原创 2021-03-11 21:45:27 · 112 阅读 · 0 评论 -
关于let const var总结
1. var我们最常见的就是用var这个指令来声明一个变量;而且,在JS中,只存在全局作用域和函数作用域。1.var定义的变量没有块级作用域2.对于var声明的一个变量,它具有提升机制3.var声明的变量可以跨块访问, 不能跨函数访问例子:关于 let 、const,我们知道这是es6新增的语法。2. letlet与var类似,它也是用来声明变量的;1.let定义的变量,有块级作用域,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。例:2. let不存在变量提升3.原创 2021-03-07 19:07:23 · 236 阅读 · 0 评论 -
微任务与宏任务
先说说JS的执行机制。JS是一门单线程语言,在执行时是从上到下执行的。Event Loop(事件循环)是JavaScript的执行机制。1.同步任务和异步任务JS的任务可以分为两种。一种是同步任务,一种是异步任务;同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。(1)、同步和异步任务分别进入不同的执行"场所",同步的进入主线原创 2020-12-23 16:57:47 · 266 阅读 · 0 评论 -
JS 中window和global的区别
global是javascript运行时所在宿主环境提供的全局对象window对象是浏览器的一个web api,可以说是global在浏览器中的具体表现global对象是单体内置对象,即不依赖宿主环境的对象,而window对象依赖浏览器...原创 2020-10-10 18:27:57 · 2207 阅读 · 0 评论 -
JS 实现顶部阅读指示条
顶部阅读指示条要实现的主要功能是:页面的滚动条滑动时,顶部的指示条出现并随之变化;当页面下滑时,指示条变长;页面上滑时,指示条随之缩短;页面滑至最底部时,指示条的长度和页面可见宽度一样长,并提示文字"已经滚动到底!"首先我们先要搞清楚 scrollTop、clientHeight、scrollHeight这三个区别;scrollTop:滚动条在Y轴上的滚动距离;clientHeight:内容可视区域的高度;scrollHeight:内容可视区域的高度加上溢出(滚动)的距离 ;scro原创 2020-09-20 15:13:15 · 221 阅读 · 0 评论 -
JS实现自动打字效果
我的想法是 提前先定义好要打字的字符串的内容,然后用一个函数typing来实现自动打字的效果。对于typing这个函数,内部我们用一个超时器来实现每隔一段时间打字的效果,我们主要是利用substring这个方法来把事先定义好的字符串进行截取操作,事实上,每次超时调用这个函数的时候,它打出的内容永远是比之前的内容多一个字的新内容,用这个新内容覆盖了原来的内容,导致我们视觉上觉得每过几秒打出一个字,从而实现自动打字效果。当已定义好的字符串中的内容全部打出来之后,我们就关闭这个定时器, 自动打字效果就完成了。原创 2020-09-20 14:53:37 · 1037 阅读 · 1 评论 -
children和childNodes的区别
在我写东西的过程中用到了childNodes,当我用这个childNodes来获取我想要的ul下的li集合时,总是会报错;于是我试着把它打印出来看看它里面装的是什么,原本是应该得到的是ul下的四个li,但是当我打印的时候,发现它得到了一个长度为9的数组; 于是我发现用childrenNodes来获取时它会把父节点下的空格也当做一个文本键获取到。如图:于是我尝试使用children来获取到我想要的li集合;它成功获取到ul下的li集合。我们此时可以发现children它返回的只是HTML元素节原创 2020-09-12 15:49:54 · 1399 阅读 · 0 评论