JS组成ECMAScript语言核心的部分:由ECMA-262定义,提供核心语言功能,ECMAScript是ECMA(欧洲计算机制造商协会)国际语言标准化的程序,以ECMAScript作为各自JavaScript实现的基础。DOM文档对象模型:(DocumentObjectModel,简称DOM),提供访问和操作网页内容的方法和接口,是W3C组织推荐的处理可扩展标记语言的标准编程接口。DOM扩展:选择器API、元素遍历API和HTML5扩展。DOM2和DOM3BOM浏览器对象模型中新增的DOM属性、方法和对象:(BrowserObjectModel,简称BOM),提供与浏览器交互的方法和接口,通过BOM可以操作浏览器窗口,如弹出boxes,控制浏览器跳转,获取分辨率等BOM对象:window,document,location,navigator,screen。JS数据类型基本数据类型:布尔(Boolean):true/false数值类型(Number):整数和浮点值字符串(String):字符串,Null类型:空值,空值代表一个空对象,typeof返回一个空object,objectUndefined类型:未定义的值,当用var声明一个变量但是给变量赋值时,它的值是undefined,typeof返回undefined。symbol:ES6新数据类型bigint:ES11新数据类型,解决精度问题引用数据类型:对象类型函数类型基本类型和引用类型的区别:基本类型存放在栈内存中引用类型存放在堆内存中,栈内存中null和undefined指针的区别:null表示没有开辟空间(js会自动回收空间),值为空。undefined表示已经开辟了空间但是还没有赋值,是undefined。null到number的默认转换是0,undefined是NaN(非数字值是一个特殊值)。检测数据类型方法typeof:检测基本数据类型(null除外),返回字符串。缺点:不能再细分对象,无法区分数组和数组对象原理:存储的值在内存中以二进制方式存储instanceof:检测实例,判断对象是否是类的实例,判断复杂的引用数据类型缺点:不能正确判断基本数据类型构造函数:检测构造函数Object.prototype。toString.call:通过原型链判断,返回[objectXxx]Array.isArray:检测数组数据结构项目中实际应用:数组树结构:导航栏、菜单栏输入框链调用队列栈hash链表集合栈问题,入栈出栈https://www.bilibili.com/video/BV1U5411Y7k7?p=2栈内存:浏览器??提供给代码的执行环境EC执行上下文:代码本身执行的环境ECStack:执行环境Stack,栈内存堆内存:存放属性和方法Scope(执行上下文):全局作用域,函数作用域,块级作用域GO:全局对象:浏览器将属性和方法放在单独的内存中=>堆内存(Heap),任何打开的内存都有一个十六进制的内存地址,window代表全局对象VO(G):全局变量对象,存放变量,当前上下文AO:私有活动变量对象栈:形成的全局执行上下文进入执行全局栈inthestackmemory的不会出栈,private的会出栈,第一个后栈会溢出。内存优化机制AST语法分析和词法分析变量序列:vara=123;首先创建值并将其存储在堆栈内存中。创建变量变量和值关联对象序列:所有指针赋值都是指针关联创建堆内存将键值对存放在堆内存中堆内存地址放在栈上基本类型:值类型引用类型:引用地址函数域scope:ES5全局作用域,函数作用域,ES6块级作用域闭包概念:指一个函数可以访问另一个函数作用域内的变量,设计私有的方法和变量。优点:缓存。隐藏变量不被GC回收,避免全局变量污染,实现柯里化。使用闭包特性来完成柯里化。缺点:内存消耗。由闭包创建的变量不能被销毁。性能问题。由于闭包内部变量的优先级高于外部变量,需要多搜索一层作用域链,一定程度上影响了搜索速度。https://mp.weixin.qq.com/s?__...Functioncurryinghttps://www.jianshu.com/p/69fa332823bf概念:一种将多参数函数转化为单参数函数的方法功能:Curry函数主要起到预处理的作用;好处:参数重用,提前确认,延迟允许可枚举和不可枚举可枚举性:对象的每个属性都有一个描述对象(Descriptor),它控制着这个属性的行为。Object.getOwnPropertyDescriptor方法可以获得该属性的描述对象。描述对象的可枚举属性,称为“可枚举性”。如果该属性为false,则表示某些操作将忽略当前属性。避免for...in操作。在JavaScript中,对象的属性分为可枚举和不可枚举之分,由属性的可枚举值决定。可枚举性决定了这个属性是否可以被for...in搜索遍历。基本包装类型的原型属性是不可枚举的。Object、Array、Number等Object对象的propertyIsEnumerable()方法可以判断对象是否包含某个属性,以及该属性是否可枚举。实例对象,构造函数,原型,原型链,链调用原型链:构造函数,原型原型,构造函数组成一个实例构造函数=不同实例的构造函数不相等普通对象函数对象普通函数用于创建类对象函数对象有原型普通对象和函数对象有__proto__隐藏属性constructorconstPerson=newFunction()如何实现原型链继承,ES5/ES6继承https://www.jianshu.com/p/c6f36b3a5408https://kaiwu.lagou.com/course/courseInfo.htm?courseId=601#/detail/pc?id=6176原型链继承的缺点:子改变了父亲也改变了构造函数继承(借助call)缺点:方法在父类的原型中不能使用ES5:User.call(this,)ES6:classextendseventbubbling,eventcapture,eventdelegation/eventproxy,DOMeventfloweventcapture(parentfindschild):从文档到节点thattriggerstheevent,也就是从上到下触发事件。事件冒泡(孩子找到父母,比较常用):事件的向上传导,当后代元素上的事件被触发时,其祖先元素上的相同事件也会被触发,从下到上。事件委托(定义公共父元素):当有多个相似元素需要绑定事件时,一个一个绑定很浪费时间,也不利于性能。这时候可以使用事件委托,给他们一个共同的父元素添加一个事件函数来处理他们所有的事件,然后根据evt.target找到最终的事件源,防止事件委托和冒泡:executeevent。事件函数中的stopPropagation()执行顺序:捕获>冒泡addEventListener():false是冒泡,true是捕获事件流:事件委托:捕获和冒泡允许我们实现一个强大的事件处理模式,称为事件委托。先捕获再冒泡深拷贝和浅拷贝相同:深拷贝和浅拷贝只针对引用数据类型区别:浅拷贝:拷贝指针、共享内存、基本数据类型的值和引用数据类型的指针deepcopy:开辟一个新的栈,不共享,当修改一个新的对象时,原对象不会被修改,浅拷贝实现:Object.assign(target,...sources):目标对象,多个源对象一级attributes深拷贝二级属性浅拷贝缺点:扩展操作符letcloneObj={...obj}concatcopyarrayslicecopyarrayarr.slice(begin,end)深拷贝实现:JSON.parse(JSON.stringify(a)):缺点:不正确函数遍历手写改进版Reflect.ownKeys递归浅拷贝长轮询和短轮询长轮询,即client发起请求后,server端要判断是否有新的数据返回,如果没有新的数据,保持请求,然后返回给客户端,直到有新的数据,客户端收到返回的信息后再进行下一次请求。短轮询,即客户端发起请求后,服务端不管是否有新数据都会响应请求,并返回给客户端Tailcall和tailrecursivetailcall:指的是一个函数的最后一步是调用另一个函数。尾调用优化:只保留内部函数的调用帧,safari支持,chrome和firefox不支持。尾递归:函数调用自身,称为递归。如果尾部调用自己,则称为尾部递归。时间复杂度尾递归优化:斐波那契不会溢出栈,节省内存eventloopeventloop事件流:JavaScript是单线程语言,它的执行分为同步任务和异步任务。异步任务分为宏任务和微任务。脚本本身是一个宏任务,这个队列中的所有同步任务都会被优先执行。当遇到宏和微时,会分别加入到宏和微任务队列中,微任务队列执行完之后再执行微任务队列。所有microtasks执行完毕后,继续下一个macrotaskMacrotask:整体代码脚本,setTimeout,setIntervaltriggers当超过指定的时间间隔时,任务将被执行。节流:任务只会在指定的时间间隔内执行一次。避免频繁操作。清除后再设置1秒执行。在obj.f()的调用中,由于运行环境在obj对象内部,所以函数中的this指向对象obj;而在全局作用域中调用fun()时,函数中的this会指向全局作用域对象window;es5this指向执行上下文,apply、call、bind可以改变this点。ES6箭头函数:this总是指向函数声明范围内的this的值。有什么方法可以改变thisapply,call,bind可以改变这一点。使用ES6箭头函数。承诺https://mp.weixin.qq.com/s?__...
