js
文章平均质量分 65
从零开始学js
fakerlove
这个作者很懒,什么都没留下…
展开
-
JavaScipt中如何实现函数缓存?函数缓存有哪些场景?
下面描述如何实现函数缓存,实现原理比较简单,把参数和对应的结果数据存在一个对象中,调用时判断参数对应的数据是否存在,存在就返回对应的结果数据,否则就返回计算结果。然后判断输入参数是不是在cache中,如果已经存在,直接返回cache中的内容,如果没存在,使用函数func对输入参数求值,然后把结果存储在cache中。函数foo如何返回另一个函数bar,baz现在持有对foo中定义的bar函数的引用,由于闭包的特性,a的值可以被得到。运用柯里化返回一个函数,返回的函数由于闭包特性,可以访问到cache。原创 2023-09-07 09:42:31 · 515 阅读 · 0 评论 -
JS-17--深拷贝跟浅拷贝的区别?如何实现一个深拷贝?
深拷贝开辟了一个新的栈,两个对象属性完全相同,但是对应两个不同的地址,修改一个对象的属性,不会改另一个对象的属性。浅拷贝只复制属性指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存,修改对象属性会影响原对象。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址,深拷贝是递归拷贝深层次,属性为对象时,深拷贝是新开栈,两个对象指向不同地址。浅拷贝是拷贝一层,属性为对象时,浅拷贝是复制,两个对象指向同一地址。即浅拷贝是拷贝一层,深层次的引用类型则是共享内存地址。原创 2023-09-06 16:50:10 · 211 阅读 · 0 评论 -
js---16-----JavaScript中的类型转换机制
JS中有六种简单数据类型:undefined、null、bollean、string、number、symbol,以及引用类型object。从上面可以看到,Number转换的时候是很严格的,只要有一个字符无法转换成数值,整个字符串就会被转换成NaN。具体规则是:先将复合类型的值转化为原始类型的值,再将原始类型的值转为字符串。上面代码中,x的值在编译阶段是无法获取的,只有等程序运行时才能知道。=、>、<)、if、while需要布尔值地方。遇到预期为字符串的地方,就会将非字符串的值自动转为字符串。原创 2023-09-06 14:55:29 · 206 阅读 · 0 评论 -
js--15----闭包是什么?说说闭包的使用场景
一般函数的词法环境在函数返回后就被销毁,但是闭包会保存对创建时所在词法环境的引用,即便创建时所在的执行上下文被销毁,但创建时所在的词法环境依然存在,以达到延长变量的生命周期的目的。一个函数和对其周围状态(词法环境)的引用绑定在一起(或者说函数被引用包围),这样的组合就是是闭包(closure),也就是说,闭包让你在一个内层函数中访问到其外层函数的作用域。例如,在创建新的对象或者类时,方法通常应该关联与对象的原型,而不是定义到对象的构造器中,原因在于每个对象被创建时,方法都会重新赋值。原创 2023-09-06 11:34:17 · 135 阅读 · 0 评论 -
js-14---什么是事件代理?应用场景是什么?
如果用了事件委托就没有这种麻烦,因为事件是绑定在父层的,和目标元素的增减是没有关系的,执行到目标元素是在真正响应执行事件函数的过程中去匹配。所以真正绑定事件的是这个元素,按照收件人分发快递的过程就是在事件执行中,需要判断当前响应的事件应该匹配到被代理元素中的哪一个或者哪几个。在这个例子中,取快递就是一个事件,每个同学指的是需要响应事件的DOM元素,而出去统一领取快递的宿舍长就是代理的元素。事件委托是会把一个或者一组元素的事件委托到它的父层或者更外层的元素上,真正绑定事件的是外层元素,而不是目标元素。原创 2023-09-06 11:09:19 · 134 阅读 · 0 评论 -
js-13-Js中的事件模型
js中的事件,可以理解为是在HTML中文档或者浏览器中发生的一种交互操作,使得网页具备互动性,常见的有加载事件、鼠标事件、自定义事件等。如上,当希望同一个元素绑定多个同类型事件的时候(上面的这个btn元素绑定2个点击事件),是不被允许的,后绑定的事件会覆盖之前的事件。可以看到,p和div都是在冒泡阶段,响应了事件,由于冒泡的特性,裹在里层的p率先做出响应,如果把第三个参数都改为true。事件捕获与事件冒泡相反,事件最开始由不太具体的节点最早接受的事件,而最具体的节点(触发节点)最后接受事件。原创 2023-09-06 10:42:30 · 101 阅读 · 0 评论 -
js-12:javascript中执行上下文和执行栈是什么?
每当引擎遇到一个函数的时候,它就会创建一个函数执行上下文,然后将这个执行上下文压到执行栈中,引擎会执行位于执行栈栈顶的执行上下文(一般是函数执行上下文),当该函数执行结束后,对应的执行上下文就会被弹出,然后控制流程到达执行栈的下一个执行上下文。函数环境:用户在函数中定义的变量被存储在环境记录中,包含了arguments对象,外部环境的引用可以是全局环境,也可以是包含内部函数的外部函数环境。second函数执行完毕,对应的函数执行上下文被推出执行栈,执行下一个执行上下文first函数。原创 2023-08-06 18:52:47 · 76 阅读 · 0 评论 -
js-11:bind、apply、call区别?如何实现一个bind
但是把say方法放在setTimeout方法中,在定时器中是作为回调函数来执行的,因此回到主栈执行时是在全局执行上下文的环境中执行的,这时候this指向window,所以输出lucy。bind:bind方法和call很相似,第一个参数也是this的指向,后面传入的是一个参数列表(但这个列表可以分多次传入)apply:apply接受两个参数,第一个参数是this的指向,第二个参数是函数接受的参数,以数组的形式传入。call:call方法的第一个参数也是this的指向,后面传入的是一个参数列表。原创 2023-08-06 18:18:33 · 47 阅读 · 0 评论 -
js-10:new操作符到底做了什么?
new通过构造函数Person创建出来的实例可以访问到构造函数原型链中的属性(即实例与构造函数通过原型链连接了起来)根据构建函数返回类型做判断,如果是原始值则被忽略,如果返回是对象,需要正常处理。在javascript中,new操作符用于创建一个给定构造函数的实例对象。上述代码可以看出,构造函数如果返回值为对象,那么这个返回值会被正常使用。new通过构造函数Person创建出来的实例可以访问到构造函数中的属性。可以发现,构造函数中返回一个原始值,然而这个返回值并没有作用。下面在构造函数中返回一个对象。原创 2023-08-06 18:00:18 · 154 阅读 · 0 评论 -
js-8:作用域链
当在javascript中使用一个变量的时候,首先javascript引擎会尝试在当前作用域下寻找该变量,如果没有找到,再到它的上层作用域寻找,依次类推直到找到变量或者是已经到了全局作用域。函数作用域:又称局部作用域,如果一个变量是在函数内部声明的,它就在一个函数作用域下面,这些变量只能在函数内部访问,不能在函数外访问。全局作用域:任何不在函数中或者大括号中声明的变量,都是在全局作用域下,全局作用域下声明的变量可以在程序的任意位置访问。这说明,我们在全局是无法获取(闭包除外)的函数内部的变量。原创 2023-08-06 17:16:10 · 44 阅读 · 0 评论 -
js-1:JavaScript中的数据类型?存储上有啥差别
obj1是一个引用类型,在赋值操作过程中,实际是将堆内存对象在栈内存的引用地址复制了一份给obj2,实际上它们共同指向了同一个堆内存对象,所以更改obj2会对obj1产生影响。Array:JavaScript数组是一组有序的数据,但跟其它语言不同,数组中的每个槽位可以存储任意类型的数据,并且,数组也是动态大小的,会随着数组添加而自动增长。Symbol(符号)是原始值,且符号实例是唯一,不可变的。a的值为一个基本类型,是存储在栈中,将a的值赋值给b,虽然两个变量相等,但是两个变量保存了两个不同的内存地址。原创 2023-08-06 11:41:18 · 121 阅读 · 0 评论 -
js2-js中的数据结构
字典是一种以键-值对存储的数据结构,js中的Object类就是以字典的形式设计的。JavaScript可以通过实现字典类,让这种字典对象使用起来更加简单,字典可以实现对象拥有的常见功能,并相应拓展自己想要的功能,而对象在javascript编写中随处可见,所以字典的作用也就异常明显。数组的长度是预先设定的,所有元素根据和该元素对应的键,保存在数组的特定位置,这里的键和对象的键是类型的概念。数组是使用一块连续的内存空间保存数据,保存的数据的个数在分配内存的时候就确定了。原创 2023-08-06 12:24:19 · 749 阅读 · 0 评论 -
js-3:DOM常见的操作有哪些?
日常开发中,离不开Dom操作。上述代码中,获取DOM元素后再进行添加操作,这个js节点是已经存在于当前文档树中,因此这个节点会先从原先的位置删除,再插入到新的位置。它提供了对文档的结构化的表述,并定义了一种方式,可以使从程序中对该结构进行访问,从而改变文档的结构,样式跟内容。删除节点:删除一个节点,首先要获取该节点本身以及它的父节点,然后调用父节点的removeChild把自己的删掉。需要注意的是,该方法返回的是一个NodeList的静态实例,它是一个静态的“快照”,而非“实时”的查询。原创 2023-08-06 13:47:03 · 170 阅读 · 0 评论 -
js-4:BOM是什么?
BOM(Browser Object Model),浏览器对象模型,提供了独立于内容与浏览器窗口进行交互的对象,其作用是跟浏览器做一些交互效果,例如如何进行页面的后退,前进,刷新,浏览器窗口发生变化,滚动条的滚动,以及获取客户的一些信息如:浏览器品牌版本,屏幕分辨率。保存的纯粹是客户端能力信息,也就是浏览器窗口外面的客户端显示器的信息。比如像素宽度和高度。在浏览器中,window对象有双重角色,既是浏览器窗口的一个接口,又是全局对象。Bom的核心对象是window,它表示浏览器的一个实例。原创 2023-08-06 13:58:09 · 102 阅读 · 0 评论 -
js-5:==和===的区别,分别在什么情况下使用
所以,除了在比较对象属性为null或者undefined的情况下,可以使用相等操作符,其他情况一律使用全等操作符。如果一个操作数是对象,另一个操作数不是,则调用对象valueOf()方法取得其原始值,再根据前面的规则进行比较。如果两个操作数都是对象,则比较它们是不是同一个对象,如果两个操作数都指向同一个对象,则相等操作符返回true。如果操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否相等。等于操作符用两个等号(==)表示,如果操作数相等,则返回true。原创 2023-08-06 14:14:45 · 173 阅读 · 0 评论 -
js-6:typeof和instanceof的区别
从上面的例子可以看出,前6个都是基础数据类型,虽然typeof null为object,但这只是javascript存在的一个很悠久的bug,不代表null就是引用数据类型,并且null本身不是对象。所以,null在typeof之后返回的是有问题的结果,不能作为判断null的方法,如果需要在if语句中判断是否为null,直接通过===null来判断就好。typeof也存在弊端,他虽然可以判断基础数据类型(null除外),但是引用数据类型中,除了function类型以外,其他的无法判断。原创 2023-08-06 15:17:09 · 182 阅读 · 0 评论 -
js-7:javascript原型、原型链及其特点
Preson.prototype._proto_指向内置对象,因为Person.prototype是个对象,默认是由Object函数作为类创建的,而Object.prototype为内置对象。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。_proto_作为不同对象之间的桥梁,用来指向创建它的 构造函数的原型对象的。每个对象的_proto_都是指向它的构造函数的原型对象prototype的。原创 2023-08-06 15:37:24 · 1049 阅读 · 0 评论