一、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、事件的传播
在网页中标签与标签之间是有嵌套关系的,比如这样一个页面:
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