学习javascript知识点

一、javascript基础
1、编写位置
我们目前学习的JS全都是客户端的JS,也就是说全都是需要在浏览器中运行的,所以我们我们的JS代码全都需要在网页中编写。我们的JS代码需要编写到

25、构造函数
构造函数是用于生成对象的函数,像之前调用的Object()就是一个构
造函数。创建一个构造函数:
function MyClass(x,y) {
this.x = x;
this.y = y;
}
调用构造函数:构造函数本身和普通的函数声明形式相同。构造函数通过 new 关键字来调用,new 关键字会新创建一个对象并返回。通过 new关键字调用的构造函数内的 this 引用引用了(被新生成的)对象。
26、new关键字
使用new关键字执行一个构造函数时:首先,会先创建一个空的对象。然后,会执行相应的构造函数。构造函数中的this将会引用这个新对象。最后,将对象作为执行结果返回。构造函数总是由new关键字调用。构造函数和普通函数的区别就在于调用方式的不同。任何函数都可以通过new来调用,所以函数都可以是构造函数。在开发中,通常会区分用于执行的函数和构造函数。构造函数的首字母要大写。属性的访问:在对象中保存的数据或者说是变量,我们称为是一个对象的属性。读取对象的属性有两种方式:对象.属性名,对象[‘属性名’]。修改属性值也很简单:对象.属性名 = 属性值,删除属性:delete 对象.属性名
。constructor:每个对象中都有一个constructor属性,它引用了当前对象的构造函数
27、垃圾回收
不再使用的对象的内存将会自动回收,这种功能称作垃圾回收。所谓不再使用的对象,指的是没有被任何一个属性(变量)引用的对象。垃圾回收的目的是,使开发者不必为对象的生命周期管理花费太多精力。
28、原型继承
JS是一门面向对象的语言,而且它还是一个基于原型的面向对象的语言。所谓的原型实际上指的是,在构造函数中存在着一个名为原型的(prototype)对象,这个对象中保存着一些属性,凡是通过该构造函数创建的对象都可以访问存在于原型中的属性。最典型的原型中的属性就是toString()函数,实际上我们的对象中并没有定义这个函数,但是却可以调用,那是因为这个函数存在于Object对应的原型中。设置原型:原型就是一个对象,和其他对象没有任何区别,可以通过构造函数来获取原型对象。构造函数. prototype和其他对象一样我们可以添加修改删除原型中的属性,也可以修改原型对象的引用。需要注意的是prototype属性只存在于函数对象中,其他对象是没有prototype属性的。每一个对象都有原型,包括原型对象也有原型。特殊的是Object的原型对象没有原型。
29、获取原型对象的方法
除了可以通过构造函数获取原型对象以外,还可以通过具体的对象来获取原型对象。 Object.getPrototypeOf(对象)对象.proto,对象. constructor.prototype,需要注意的是,我们可以获取到Object的原型对象,也可以对它的属性进行操作,但是我们不能修改Object原型对象的引用。原型链:基于我们上边所说的,每个对象都有原型对象,原型对象也有原型对象。由此,我们的对象,和对象的原型,以及原型的原型,就构成了一个原型链。比如这么一个对象:var mc = new MyClass(123,456);这个对象本身,原型MyClass.proprototype原型对象的原型对象是Object,Object对象还有其原型。这组对象就构成了一个原型链。这个链的次序是:mc对象、mc对象原型、原型的原型(Object)、Object的原型当从一个对象中获取属性时,会首先从当前对象中查找,如果没有则顺着向上查找原型对象,直到找到Object对象的原型位置,找到则返回,找不到则返回undefined。
30、instanceof
之前学习基本数据类型时我们学习了typeof用来检查一个变量的类型。但是typeof对于对象来说却不是那么好用,因为任何对象使用typeof都会返回Object。而我们想要获取的是对象的具体类型。这时就需要使用instanceof运算符了,它主要用来检查一个对象的具体类型。语法: var result = 变量 instanceof 类型。引用类型:上边我们说到JS中除了5种基本数据类型以外其余的全都是对象,也就是引用数据类型。但是虽然全都是对象,但是对象的种类却是非常繁多的。比如我们说过的Array(数组),Function(函数)这些都是不同的类型对象。实际上在JavaScript中还提供了多种不同类型的对象。
31、Object
目前为止,我们看到的最多的类型就是Object,它也是我们在JS中使用的最多的对象。虽然Object对象中并没有为我们提供太多的功能,但是我们会经常会用途来存储和传输数据。
创建Object对象有两种方式:
– var obj = new Object();
– var obj = {}
上边的两种方式都可以返回一个Object对象。但是第一种我们使用了一个new关键字和一个Object()函数。这个函数就是专门用来创建一个Object对象并返回的,像这种函数我们称为构造函数。
32、Array
Array用于表示一个有序的数组。JS的数组中可以保存任意类型的数据。创建一个数组的方式有两种:使用构造器:var arr = new Array(数组的长度); var arr = new Array(123,’hello’,true);使用[]var arr = []; var arr = [123,’hello’,false];读取数组中的值使用数组[索引]的方式,注意索引是从0开始的。Date:Date类型用来表示一个时间。Date采取的是时间戳的形式表示时间,所谓的时间戳指的是从1970年1月1日0时0秒0分开始经过的毫秒数来计算时间。直接使用new Date()就可以创建一个Date对象。创造对象时不传参数默认创建当前时间。可以传递一个毫秒数用来创建具体的时间。也可以传递一个日期的字符串,来创建一个时间。格式为:月份/日/年 时:分:秒,例如:06/13/2004 12:12:12
33、Function
Function类型代表一个函数,每一个函数都是一个Function类型的对象。而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。函数的声明有两种方式:function sum(){},var sum = function(){};由于存在函数声明提升的过程,第一种方式在函数声明之前就可以调用函数,而第二种不行。
函数也可以作为参数:函数也是一个对象,所以函数和其他对象一样也可以作为一个参数传递给另外一个函数。但是要注意的是使用函数作为参数时,变量后边千万不要加(),不加()表示将函数本身作为参数,加上以后表示将函数执行的结果作为参数。
34、函数对象的方法
每个函数都有两个方法call()和apply()。call()和apply()都可以指定一个函数的运行环境对象,换句话说就是设置函数执行时的this值。使用方式:函数对象.call(this对象,参数数组)函数对象.apply(this对象,参数1,参数2,参数N)。闭包(closure):闭包是JS一个非常重要的特性,这意味着当前作用域总是能够访问外部作用域中的变量。因为函数是JS中唯一拥有自身作用域的结构,因此闭包的创建依赖于函数。也可以将闭包的特征理解为,其相关的局部变量在函数调用结束之后将会继续存在。
35、基本包装类型
基本数据类型是不能去调用方法的,所以JS中还提供了3个特殊的引用类型:Boolean,Number ,String。这三个类型分别包装了Boolean、Number、String并扩展了许多实用的方法。他们的使用方式和普通的对象一样。要注意的是使用typeof检查这些包装类型时返回的都是object。Boolean:Boolean 类型是与布尔值对应的引用类型。可以采用这种方式创建:
var booleanObject = new Boolean(true);我们最好永远不要使用Boolean包装类。Number:Number是数值对应的引用数据类型。创建Number对象只需要在调用构造函数时传递一个数值:var num = new Numbaer(20);使用数值时我们建议使用基本数值,而不建议使用包装类。String:String 类型是字符串的对象包装类型,可以像下面这样使用 String 构造函数来创建。var str = new String(“hello world”);可以使用length属性来获取字符串的长度。Math:JS 还为保存数学公式和信息提供了一个公共位置,即 Math 对象。与我们在 JavaScript 直接编写的计算功能相比, Math 对象提供的计算功能执行起来要快得多。 Math 对象中还提供了辅助完成这些计算的属性和方法。
36、什么是DOM
DOM,全称Document Object Model文档对象模型。JS中通过DOM来对HTML文档进行操作。只要理解了DOM就可以随心所欲的操作WEB页面。文档:文档表示的就是整个的HTML网页文档。对象:对象表示将网页中的每一个部分都转换为了一个对象。模型:使用模型来表示对象之间的关系,这样方便我们获取对象。节点:节点Node,是构成我们网页的最基本的组成部分,网页中的每一个部分都可以称为是一个节点。比如:html标签、属性、文本、注释、整个文档等都是一个节点。虽然都是节点,但是实际上他们的具体类型是不同的。比如:标签我们称为元素节点、属性称为属性节点、文本称为文本节点、文档称为文档节点。节点的类型不同,属性和方法也都不尽相同。节点:Node——构成HTML文档最基本的单元。常用节点分为四类:文档节点:整个HTML文档,元素节点:HTML文档中的HTML标签,属性节点:元素的属性,文本节点:HTML标签中的文本内容。
37、文档节点(document)
文档节点document,代表的是整个HTML文档,网页中的所有节点都是它的子节点。document对象作为window对象的属性存在的,我们不用获取可以直接使用。通过该对象我们可以在整个文档访问内查找节点对象,并可以通过该对象创建各种节点对象。元素节点(Element):HTML中的各种标签都是元素节点,这也是我们最常用的一个节点。浏览器会将页面中所有的标签都转换为一个元素节点,我们可以通过document的方法来获取元素节点。比如:document.getElementById()根据id属性值获取一个元素节点对象。
38、文本节点(Text)
文本节点表示的是HTML标签以外的文本内容,任意非HTML的文本都是文本节点。它包括可以字面解释的纯文本内容。文本节点一般是作为元素节点的子节点存在的。获取文本节点时,一般先要获取元素节点。在通过元素节点获取文本节点。例如:元素节点.firstChild;获取元素节点的第一个子节点,一般为文本节点。属性节点(Attr):属性节点表示的是标签中的一个一个的属性,这里要注意的是属性节点并非是元素节点的子节点,而是元素节点的一部分。可以通过元素节点来获取指定的属性节点。例如:元素节点.getAttributeNode(“属性名”);注意:我们一般不使用属性节点。
39、事件
事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间。JavaScript 与 HTML 之间的交互是通过事件实现的。对于 Web 应用来说,有下面这些代表性的事件:点击某个元素、将鼠标移动至某个元素上方、按下键盘上某个键,等等。获取元素节点,通过document对象调用: getElementById():通过id属性获取一个元素节点对象。getElementsByTagName()
通过标签名获取一组元素节点对象。getElementsByName():通过name属性获取一组元素节点对象。
40、获取元素节点的子节点
通过具体的元素节点调用:getElementsByTagName(),方法,返回当前节点的指定标签名后代节点,childNodes属性,表示当前节点的所有子节点,firstChild属性,表示当前节点的第一个子节点,lastChild属性,表示当前节点的最后一个子节点。获取父节点和兄弟节点 通过具体的节点调用:parentNode属性,表示当前节点的父节点,previousSibling属性,表示当前节点的前一个兄弟节点, nextSibling属性,表示当前节点的后一个兄弟节点。元素节点的属性:获取,元素对象.属性名。例:element.value,element.id ,element.className
设置,元素对象.属性名=新的值,例:element.value = “hello”,element.id = “id01”
element.className = “newClass”。
41、其他属性
nodeValue:文本节点可以通过nodeValue属性获取和设置,文本节点的内容:innerHTML
元素节点通过该属性获取和设置标签内部的html代码。使用CSS选择器进行查询querySelector(),querySelectorAll():这两个方法都是用document对象来调用,两个方法使用相同,都是传递一个选择器字符串作为参数,方法会自动根据选择器字符串去网页中查找元素。不同的地方是querySelector()只会返回找到的第一个元素,而querySelectorAll()会返回所有符合条件的元素。节点的修改:这里的修改我们主要指对元素节点的操作。创建节点
document.createElement(标签名)。删除节点:父节点.removeChild(子节点),替换节点:父节点.replaceChild(新节点 , 旧节点),插入节点:父节点.appendChild(子节点),父节点.insertBefore(新节点 , 旧节点)。
42、事件处理程序
我们可以通过两种方式为一个元素绑定事件处理程序:通过HTML元素指定事件属性来绑定 通过DOM对象指定的属性来绑定这两种方式都是我们日常用的比较多的,但是更推荐使用第二种方式。还有一种方式比较特殊我们称为设置事件监听器。使用如下方式:元素对象.addEventListener()。通过HTML标签的属性设置通过HTML属性来绑定事件处理程序是最简单的方式。按钮。这种方式当我们点击按钮以后,onclick属性中对应的JS代码将会执行,也就是点击按钮以后,页面中会弹出两个提示框。这种方式我们直接将代码编写到了onclick属性中,可以编写多行js代码,当然也可以事先在外部定义好函数。这种方式的优点在于,设定步骤非常简单,并且能够确保事件处理程序会在载入时被设定。如果在函数的最后return false则会取消元素的默认行为。
43、通过DOM对象的属性绑定
但是其实上面的写法虽然简单,但却将JS和HTML的代码编写到了一起,并不推荐使用,我们更推荐如下的写法:
var btn = document.getElementById(‘btn’);
btn.onclick = function(){
alert(“hello”);
};
这种写法将HTML代码和JS写在不同的位置,维护起来更加容易。设置事件监听器前边两种方式都可以绑定事件处理程序,但是它们都有一个缺点就是都只能绑定一个程序,而不能为一个事件绑定多个程序。这是我们就可以使用addEventListener()来处理,这个方法需要两个参数:一个是事件字符串,一个是响应函数。btn.addEventListener(‘click’ ,function(){alert(“hello”);});但是要注意的是ie8以下的浏览器是不支持上边的方法的,需要使用attachEvent代替。也可以使用removeEventListener()和detachEvent()移除事件。
44、事件处理中的this
在事件处理程序内的 this 所引用的对象即是设定了该事件处理程序的元素。也就是事件是给那个对象绑定的this就是哪个对象。事件对象:在DOM对象上的某个事件被触发时,会产生一个事件对象Event,这个对象中包含着所有事件有关的信息。包括导致事件的元素、事件的类型以及其他与特定事件相关的信息。例如,鼠标操作导致的事件对象中,会包含鼠标位置的信息,而键盘操作导致的事件对象中,会包含与按下的键有关的信息。所有浏览器都支持 event对象,但支持方式不同。DOM标准的浏览器会将一个event对象传入到事件的处理程序当中。无论事件处理程序是什么都会传入一个event对象。可以通过这种方式获取:
btn.onclick = function(event){
alert(event.type);
};
Event对象包含与创建它的特定事件有关的属性和方法。触发的事件类型不一样,可用的属性和方法也不一样。
45、IE中的事件对象
与访问 DOM 中的 event 对象不同,要访问 IE 中的 event 对象有几种不同的方式,取决于指定事件处理程序的方法。在IE中event对象作为window对象的属性存在的,可以使用window.event来获取event对象。在使用attachEvent()的情况下,也会在处理程序中传递一个event对象,也可以按照前边的方式使用。事件的触发:事件的发生主要是由用户操作引起的。比如mousemove这个事件就是由于用户移动鼠标引起的,在鼠标指针移动的过程中该事件会持续发生。当指定事件被触发时,浏览器就会调用对应的函数去响应事件,一般情况下事件没触发一次,函数就会执行一次。因此设置鼠标移动的事件可能会影响到鼠标的移动速度。所以设置该类事件时一定要谨慎。
46、事件的传播
在网页中标签与标签之间是有嵌套关系的,比如这样一个页面:

sample
如果这时用户点击了sample按钮,则会以该按钮作为事件目标触发一次点击事件。这时,事件的处理将会分为捕获阶段、目标阶段、事件冒泡这三个阶段。 47、事件的传播 捕获阶段:这一阶段会从window对象开始向下一直遍历到目标对象,如果发现有对象绑定了响应事件则做相应的处理。目标阶段:这一阶段已经遍历结束,则会执行目标对象上绑定的响应函数。事件冒泡阶段这一阶段,事件的传播方式和捕获阶段正好相反,会从事件目标一直向上遍历,直至window对象结束,这时对象上绑定的响应函数也会执行。取消事件传播:我们可以使用event对象的两个方法完成:stopPropagation() ,stopImmediatePropagation(),取消默认行为:preventDefault()。 48、什么是BOM ECMAScript无疑是JavaScript的核心,但是要想在浏览器中使用JavaScript,那么BOM(浏览器对象模型)才是真正的核心。BOM 提供了很多对象,用于访问浏览器的功能,这些功能与任何网页内容无关。BOM将浏览器中的各个部分转换成了一个一个的对象,我们通过修改这些对象的属性,调用他们的方法,从而控制浏览器的各种行为。window对象 window对象是BOM的核心,它表示一个浏览器的实例。在浏览器中我们可以通过window对象来访问操作浏览器,同时window也是作为全局对象存在的。全局作用域:window对象是浏览器中的全局对象,因此所有在全局作用域中声明的变量、对象、函数都会变成window对象的属性和方法。窗口大小:浏览器中提供了四个属性用来确定窗口的大小:网页窗口的大小:innerWidth,innerHeight,浏览器本身的尺寸:outerWidth,outerHeight。 49、打开窗口 使用 window.open() 方法既可以导航到一个特定的 URL,也可以打开一个新的浏览器窗口。这个方法需要四个参数:需要加载的url地址窗口的目标一个特性的字符串是否创建新的历史记录。超时调用:超时调用:setTimeout(),超过一定时间以后执行指定函数。需要连个参数:要执行的内容,超过的时间,取消超时调用:clearTimeout(),超时调用都是在全局作用域中执行的。间歇调用:间歇调用:setInterval(),每隔一段时间执行指定代码,需要两个参数:要执行的代码,间隔的时间,取消间隔调用:clearInterval()。 50、系统对话框 浏览器通过 alert() 、 confirm() 和 prompt()方法可以调用系统对话框向用户显示消息。它们的外观由操作系统及(或)浏览器设置决定,而不是由 CSS 决定。显示系统对话框时会导致程序终止,当关闭对话框程序会恢复执行。Alert:alert()接收一个字符串并显示给用户。调用,alert()方法会向用户显示一个包含一个确认按钮的对话框。例如:alert("Hello World");confirm:confirm和alert类似,只不过confirm弹出的对话框有一个确认和取消按钮。用户可以通过按钮来确认是否执行操作。例如:confirm('你确定吗?');这个函数的执行会返回一个布尔值,如果选择确定则返回true,如果点击取消则返回false。 51、prompt prompt会弹出一个带输入框的提示框,并可以将用户输入的内容返回。它需要两个值作为参数:显示的提示文字本框中的默认值例子:prompt('你的年龄是?','18');location对象location对象提供了与当前窗口中加载的文档有关的信息,还提供了一些导航功能。 href属性:href属性可以获取或修改当前页面的完整的URL地址,使浏览器跳转到指定页面。 assign() 方法:所用和href一样,使浏览器跳转页面,新地址错误参数传递到assign ()方法中 replace()方法:功能一样,只不过使用replace方法跳转地址不会体现到历史记录中。reload() 方法:用于强制刷新当前页面。 52、navigator对象 navigator 对象包含了浏览器的版本、浏览器所支持的插件、浏览器所使用的语言等各种与浏览器相关的信息。我们有时会使用navigator的userAgent属性来检查用户浏览器的版本。screen对象:screen 对象基本上只用来表明客户端的能力,其中包括浏览器窗口外部的显示器的信息,如像素宽度和高度等。该对象作用不大,我们一般不太使用。history对象:history 对象保存着用户上网的历史记录,从窗口被打开的那一刻算起。go()使用:go() 方法可以在用户的历史记录中任意跳转,可以向后也可以向前。back()向后跳转forward()向前跳转。 二、javascript高级 1、数据类型 分类(2大类):基本(值)类型,Number: 任意数值,String: 任意文本,Boolean: true/false,undefined: undefined,null: null,对象(引用)类型,Object: 一般对象类型,Array: 特别的对象类型(下标/内部数据有序),Function: 特别的对象类型(可执行)。判断:typeof:可以区别: 数值, 字符串, 布尔值, undefined, function。不能区别: null与对象, 一般对象与数组。instanceof 专门用来判断对象数据的类型: Object, Array与Function。===可以判断: undefined和null。 2、相关问题: undefined与null的区别? undefined代表变量没有赋值,null: 代表变量赋值了, 只是值为null。什么时候将变量赋值为null? 初始化赋值: 将要作为引用变量使用, 但对象还没有确定,结束时: 将变量指向的对象成为垃圾对象。理解变量类型与数据类型? js的变量本身是没有类型的, 变量的类型实际上是变量内存中数据的类型,变量类型:基本类型: 保存基本类型数据的变量,引用类型: 保存对象地址值的变量,数据对象,基本类型,对象类型 3、数据, 变量与内存 什么是数据? 存储于内存中代表特定信息的'东东', 本质就是0101二进制,具有可读和可传递的基本特性,万物(一切)皆数据, 函数也是数据,程序中所有操作的目标: 数据,算术运算,逻辑运算,赋值,调用函数传参。什么是内存? 内存条通电后产生的存储空间(临时的)。产生和死亡: 内存条(集成电路板)==>通电==>产生一定容量的存储空间==>存储各种数据==>断电==>内存全部消失。内存的空间是临时的, 而硬盘的空间是持久的。分配内存: 声明变量和函数或创建对象时, JS引擎会自动为此分配一定大小的内存来存放对应的数据。释放内存: 清空内存中的数据, 标识内存可以再分配使用(内存不释放就不能复用)自动释放: 栈空间的局部变量。垃圾回调器回调: 堆空间的垃圾对象,一块内存包含2个数据,内部存储的数据(一般数据/地址数据),内存地址值。数据内存分类:栈: 全局变量, 局部变量 (空间较小),堆: 对象 (空间较大)。什么是变量? 值可以变化的量, 由变量名与变量值组成,一个变量对应一块小内存, 变量名用来查找到内存, 变量值就是内存中保存的内容,内存,数据, 变量三者之间的关系,内存是一个容器, 用来存储程序运行需要操作的数据,变量是内存的标识, 我们通过变量找到对应的内存, 进而操作(读/写)内存中的数据。 4、相关问题 问题1: var a = xxx, a内存中到底保存的是什么? xxx是一个基本数据,xxx是一个对象,xxx是一个变量。关于引用变量赋值问题 :2个引用变量指向同一个对象, 通过一个引用变量修改对象内部数据, 另一个引用变量也看得见,2个引用变量指向同一个对象,让一个引用变量指向另一个对象, 另一个引用变量还是指向原来的对象。问题: 在js调用函数时传递变量参数时, 是值传递还是引用传递? 只有值传递, 没有引用传递, 传递的都是变量的值, 只是这个值可能是基本数据, 也可能是地址(引用)数据。如果后一种看成是引用传递, 那就值传递和引用传递都可以有。问题: JS引擎如何管理内存? 内存生命周期:分配需要的内存:使用分配到的内存,不需要时将其释放/归还,释放内存,为执行函数分配的栈空间内存: 函数执行完自动释放,存储对象的堆空间内存: 当内存没有引用指向时, 对象成为垃圾对象, 垃圾回收器后面就会回收释放此内存。 5、对象 什么是对象? 代表现实中的某个事物, 是该事物在编程中的抽象,多个数据的集合体(封装体),用于保存多个数据的容器,为什么要用对象? 便于对多个数据进行统一管理,对象的组成,属性:代表现实事物的状态数据,由属性名和属性值组成,属性名都是字符串类型, 属性值是任意类型,方法:代表现实事物的行为数据,是特别的属性==>属性值是函数。如何访问对象内部数据? .属性名: 编码简单, 但有时不能用 ['属性名']: 编码麻烦, 但通用。 什么时候必须使用['属性名']的方式访问对象内部数据? 属性名不是合法的标识名,属性名不确定。 6、函数 什么是函数? 具有特定功能的n条语句的封装体,只有函数是可执行的, 其它类型的数据是不可执行的,函数也是对象。为什么要用函数? 提高代码复用,便于阅读和交流。如何定义函数? 函数声明:表达式,调用(执行)函数 ,test(),new test(),obj.test()。test.call/apply(obj)。什么函数才是回调函数? 你定义的,你没有直接调用,但最终它执行了(在特定条件或时刻)。常见的回调函数? DOM事件函数,定时器函数。IIEF:理解全称: Immediately-Invoked Function Expression 立即调用函数表达式.别名: 匿名函数自调用。作用隐藏内部实现,不污染外部命名空间。 7、原型 函数的prototype属性(图) :每个函数都有一个prototype属性, 它默认指向一个Object空对象(即称为: 原型对象),原型对象中有一个属性constructor, 它指向函数对象,给原型对象添加属性(一般都是方法) ,作用: 函数的所有实例对象自动拥有原型中的属性(方法)。显示原型与隐式原型:每个函数function都有一个prototype,即显式原型,每个实例对象都有一个__proto__,可称为隐式原型,对象的隐式原型的值为其对应构造函数的显式原型的值内存结构(图)。总结:函数的prototype属性: 在定义函数时自动添加的, 默认值是一个空Object对象,对象的__proto__属性: 创建对象时自动添加的, 默认值为构造函数的prototype属性值,程序员能直接操作显式原型, 但不能直接操作隐式原型(ES6之前)。 8、原型链 原型链(图解):访问一个对象的属性时,先在自身属性中查找,找到返回如果没有, 再沿着__proto__这条链向上查找, 找到返回如果最终没找到, 返回undefined,别名: 隐式原型链,作用: 查找对象的属性(方法),构造函数/原型/实体对象的关系(图解),构造函数/原型/实体对象的关系2(图解)。原型属性问题:读取对象的属性值时: 会自动到原型链中查找,设置对象的属性值时: 不会查找原型链, 如果当前对象中没有此属性, 直接添加此属性并设置其值,方法一般定义在原型中, 属性一般通过构造函数定义在对象本身上。instanceof是如何判断的?表达式: A instanceof B:如果B函数的显式原型对象在A对象的原型链上, 返回true, 否则返回false,Function是通过new自己产生的实例。 9、执行上下文与执行上下文栈 变量提升与函数提升:变量声明提升:通过var定义(声明)的变量, 在定义语句之前就可以访问到,值: undefined。函数声明提升,通过function声明的函数, 在之前就可以直接调用,值: 函数定义(对象)问题: 变量提升和函数提升是如何产生的?执行上下文:代码分类(位置):全局代码,函数代码。全局执行上下文:在执行全局代码前将window确定为全局执行上下文,对全局数据进行预处理,var定义的全局变量==>undefined, 添加为window的属性,function声明的全局函数==>赋值(fun), 添加为window的方法,this==>赋值(window),开始执行全局代码。函数执行上下文:在调用函数, 准备执行函数体之前, 创建对应的函数执行上下文对象,对局部数据进行预处理,形参变量==>赋值(实参)==>添加为执行上下文的属性,arguments==>赋值(实参列表), 添加为执行上下文的属性,var定义的局部变量==>undefined, 添加为执行上下文的属性, function声明的函数 ==>赋值(fun), 添加为执行上下文的方法,this==>赋值(调用函数的对象),开始执行函数体代码。 10、作用域与作用域链 作用域:理解:就是一块"地盘", 一个代码段所在的区域,它是静态的(相对于上下文对象), 在编写代码时就确定了。分类:全局作用域,函数作用域,没有块作用域(ES6有了)。作用:隔离变量,不同作用域下同名变量不会有冲突。作用域与执行上下文:区别1:全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定了。而不是在函数调用时,全局执行上下文环境是在全局作用域确定之后, js代码马上执行之前创建函数执行上下文环境是在调用函数时, 函数体代码执行之前创建。区别2:作用域是静态的, 只要函数定义好了就一直存在, 且不会再变化上下文环境是动态的, 调用函数时创建, 函数调用结束时上下文环境就会被释放。联系上下文环境(对象)是从属于所在的作用域,全局上下文环境==>全局作用域,函数上下文环境==>对应的函数使用域。作用域链:理解:多个上下级关系的作用域形成的链, 它的方向是从下向上的(从内到外),查找变量时就是沿着作用域链来查找的,查找一个变量的查找规则,在当前作用域下的执行上下文中查找对应的属性, 如果有直接返回, 否则进入2,在上一级作用域的执行上下文中查找对应的属性, 如果有直接返回, 否则进入3,再次执行2的相同操作, 直到全局作用域, 如果还找不到就抛出找不到的异常。 11、闭包 如何产生闭包?当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时, 就产生了闭包。闭包到底是什么?使用chrome调试查看:理解一: 闭包是嵌套的内部函数(绝大部分人),理解二: 包含被引用变量(函数)的对象(极少数人),注意: 闭包存在于嵌套的内部函数中。产生闭包的条件?函数嵌套,内部函数引用了外部函数的数据(变量/函数)。常见的闭包:将函数作为另一个函数的返回值,将函数作为实参传递给另一个函数调用。闭包的作用:使用函数内部的变量在函数执行完后, 仍然存活在内存中(延长了局部变量的生命周期),让函数外部可以操作(读写)到函数内部的数据(变量/函数)。问题:函数执行完后, 函数内部声明的局部变量是否还存在?在函数外部能直接访问函数内部的局部变量吗?闭包的缺点及解决:缺点:函数执行完后, 函数内的局部变量没有释放, 占用内存时间会变长,容易造成内存泄露。解决:能不用闭包就不用,及时释放。 12、面向对象高级 对象创建模式:object构造函数模式:方式1: Object构造函数模式:套路: 先创建空Object对象, 再动态添加属性/方法,适用场景: 起始时不确定对象内部数据。问题: 语句太多。方式2: 对象字面量模式:套路: 使用{}创建对象, 同时指定属性/方法,适用场景: 起始时对象内部数据是确定的,问题: 如果创建多个对象, 有重复代码。方式3: 工厂模式:套路: 通过工厂函数动态创建对象并返回,适用场景: 需要创建多个对象,问题: 对象没有一个具体的类型, 都是Object类型。方式4: 自定义构造函数模式:套路: 自定义构造函数, 通过new创建对象,适用场景: 需要创建多个类型确定的对象,问题: 每个对象都有相同的数据, 浪费内存。方式5: 构造函数+原型的组合模式:套路: 自定义构造函数, 属性在函数中初始化, 方法添加到原型上适用场景: 需要创建多个类型确定的对象。继承模式:方式1: 原型链继承:套路 :定义父类型构造函数,给父类型的原型添加方法,定义子类型的构造函数,创建父类型的对象赋值给子类型的原型,将子类型原型的构造属性设置为子类型,给子类型原型添加方法,创建子类型的对象: 可以调用父类型的方法。关键:子类型的原型为父类型的一个实例对象借用构造函数继承。方式2: 借用构造函数继承(假的)套路:定义父类型构造函数,定义子类型构造函数,在子类型构造函数中调用父类型构造。关键:在子类型构造函数中通用super()调用父类型构造函数。方式3: 原型链+借用构造函数的组合继承:利用原型链实现对父类型对象的方法继承,利用super()借用父类型构建函数初始化相同属性。 13、线程机制与事件机制进程与线程 进程(process):程序的一次执行, 它占有一片独有的内存空间,可以通过windows任务管理器查看进程。线程(thread):是程序执行的一个完整流程,是CPU的最小的调度单元。相关知识:应用程序必须运行在某个进程的某个线程上,一个进程中至少有一个运行的线程: 主线程, 进程启动后自动创建,一个进程中也可以同时运行多个线程, 我们会说程序是多线程运行的,一个进程内的数据可以供其中的多个线程直接共享,多个进程之间的数据是不能直接共享的,线程池(thread pool): 保存多个线程对象的容器, 实现线程对象的反复利用。相关问题:何为多进程与多线程?多进程运行: 一应用程序可以同时启动多个实例运行,多线程: 在一个进程内, 同时有多个线程运行。比较单线程与多线程?多线程优点:能有效提升CPU的利用率。缺点:线程间切换开销,死锁与状态同步问题。单线程优点:顺序编程简单易懂,缺点:效率低。JS是单线程还是多线程?js是单线程运行的,但使用H5中的 Web Workers可以多线程运行。浏览器运行是单线程还是多线程?都是多线程运行的浏览器运行是单进程还是多进程?有的是单进程firefox,有的是多进程chrome如何查看浏览器是否是多进程运行的呢?任务管理器-->进程 14、线程机制与事件机制定时器引发的思考 定时器真是定时执行的吗?定时器并不能保证真正定时执行,一般会延迟一丁点(可以接受), 也有可能延迟很长时间(不能接受)。定时器回调函数是在分线程执行的吗?在主线程执行的, js是单线程的,JS是单线程执行的。如何证明js执行是单线程的?setTimeout()的回调函数是在主线程执行的,定时器回调函数只有在运行栈中的代码全部执行完后才有可能执行。为什么js要用单线程模式, 而不用多线程模式?JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。代码的分类:初始化代码,回调代码。js引擎执行代码的基本流程:先执行初始化代码: 包含一些特别的代码,设置定时器,绑定监听,发送ajax请求,后面在某个时刻才会执行回调代码

15、线程机制与事件机制浏览器的事件循环(轮询)模型
所有代码分类:初始化执行代码: 包含绑定dom事件监听, 设置定时器, 发送ajax请求的代码,回调执行代码: 处理回调逻辑。js引擎执行代码的基本流程:初始化代码===>回调代码。模型的2个重要组成部分:事件管理模块,回调队列。模型的运转流程:执行初始化代码, 将事件回调函数交给对应模块管理,当事件发生时, 管理模块会将回调函数及其数据添加到回调列队中,只有当初始化代码执行完后(可能要一定时间), 才会遍历读取回调队列中的回调函数执行。相关重要概念:执行栈execution stack:所有的代码都是在此空间中执行的。浏览器内核browser core:js引擎模块(在主线程处理),其它模块(在主/分线程处理)。任务队列(callback queue):task queue,消息队列(callback queue):message queue,事件队列(callback queue):event queue,事件轮询event loop:从任务队列中循环取出回调函数放入执行栈中处理(一个接一个),事件驱动模型:event-driven interaction model,请求响应模型
request-response model

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值