1.this
解析器在调用函数时,每次会向函数内部传递一个隐含的参数,这个隐含的参数就是this,this指向的是一个对象,根据函数调用方式的不同,函数会指向不同的对象。
(1)以函数形式调用时,this永远指向window
(2)以方法的形式调用时,this指向调用方法的对象
(3)当以构造函数形式调用时,this指向新建的对象
2.创建对象的方法:
(1)使用工厂模式创建
(2)使用构造函数创建普通函数与构造函数的区别:
(1)普通函数时直接调用,而构造函数需要使用new关键字调用构造函数执行的流程:
(1)立刻创建一个新的对象
(2)将新建的对象设置为函数中的this,在构造函数中可以通过this引用新建的对象
(3)逐行执行函数中的代码
(4)将新建的对象作为返回值返回3.原型和原型对象
(1)我们创建的每一个函数,解析器都会向函数中添加一个属性prototype.
(2)这个属性对应一个对象,这个对象就是原型对象
(3)当函数作为普通函数调用时,prototype没有任何作用
(4)当函数以构造函数的形式调用时,它所创建的对象中都会有一个隐含的属性,指向该构造函数的原型对象,可以通过_proto_访问该属性。
(5)原型对象就相当于是一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,可以将对象中共有的属性设置到原型对象中。
(6)当访问对象中的一个属性或方法时,会先在对象自身中寻找,如果有则直接使用,如果没有则去原型对象中寻找,找到则直接使用。
(7)原型对象也是对象,所以它也有原型,当使用一个对象的属性或方法时,会先在自身寻找,自身如果有,则直接使用,自身没有则去原型对象中找,如果原型对象中有,则使用,如果没有,则去原型的原型中找,直到找到object对象的原型,object对象的原型没有原型,如果在object原型中依然没有找到,则返回undefined。
4.数组的常用方法
(1)push,向数组的末尾添加一个或多个元素,并将新数组的长度返回。
(2)pop,删除数组末尾的最后一个元素,并将删除的元素返回。
(3)unshift,向数组的开头添加一个或多个元素,返回新数组的长度。
(4)shift,删除数组开头的第一个元素,并将删除的元素返回。
(5)slice(start,end),从某个已有的数组返回选定的元素。 该方法不会改变原数组,而是将截取的元素封装到新数组中返回。
参数:
<1>start是截取开始的位置的索引,包含开始索引;
<2>end是截取结束位置的索引,不包含结束索引;
<3>第二个参数可以省略不写,此时截取从开始索引往后的所有元素;
<4>索引可以传递一个负值,从后往前计算,-1表示倒数第一个,-2表示倒数第二个。
(6)splice(start,num,...element),用于删除数组中的指定元素。
<1>使用该方法会影响到原数组,会将指定元素从原数组中删除,并将被删除的元素作为返回值返回。
参数:
<1>start表示要删除的开始位置的索引;
<2>num表示要删除的数量;
<3>第三个及以后的参数表示新加入的元素,会插入到开始索引的前面。
(7)contact(),可以连接两个或多个数组,并将新的数组返回,该方法不会影响原数组。
(8)join,该方法可以将数组转化为字符串。该方法不会影响原数组,而是将转换后的字符串作为返回值返回。
参数:
<1>在join中可以指定一个字符串作为参数,该字符串将会作为数组元素的连接符。
5.数组的遍历
(1)用for循环遍历。
(2)用forEach方法遍历。传入一个回调函数,有三个形参,第一个是当前遍历的元素,第二个是当前索引,第三个是所遍历的数组对象。
(3)用map方法遍历。
6.call和apply的区别
(1)call和apply都是函数对象的方法,需要通过函数对象来调用;
(2)当对函数调用call和apply都会调用函数执行;
(3)在调用call和apply时,可以将一个对象指定为第一个参数,此时这个对象将会成为函数执行的this;
(4)call()方法可以将实参在对象之后依次传递;
(5)apply()方法需要将实参封装到一个数组中统一传递。
this的情况:
(1)以函数形式调用时,this永远是window;
(2)以方法的形式调用时,this是调用方法的对象;
(3)以构造函数的形式调用时,this是新建的那个对象;
(4)使用call和apply调用时,this是指定的那个对象。
7.arguments
在调用函数时,浏览器每次都会传递两个隐含的参数:
(1)函数的上下文对象this;
(2)封装实参的对象arguments;
arguments:
(1)arguments是一个类数组对象,它可以通过索引来操作数据,也可以获取长度;
(2)在调用函数时,所传递的实参都会在arguments中保存;
(3)arguments.length可以用来获取实参的长度;
(4)arguments中有一个属性callee,该属性对应一个函数,即当前正在执行的函数。
注意:即使不定义形参,也可以通过arguments来使用实参,arguments[0]表示第一个实参,arguments[1]表示第二个实参;
8.包装类
(1)包装类类型是针对number,string,boolean三种基本类型来说的,js为我们提供了三个包装类(String,Number,Boolean),通过这三个包装类,可以将基本数据类型的数据转化为对象
(2)包装类产生的时机
基本数据,在调用一些方法时,js会自动生成一个临时的对应的包装类(Number,Boolean,String)的对象,每次产生的对象都不一样。
<1>String:可以将基本数据类型转化为String对象;
<2>Number:可以将基本数据类型转化为Number对象;
<3>Boolean:将将基本数据类型转化为Boolean对象;
9.字符串的相关方法
(1)charAt(index):根据索引获取指定位置的字符,不会影响原数组;
(2)charCodeAt(index):根据索引获取指定位置字符的Unicode编码,不会影响原数组;
(3)contact,用来连接两个或多个字符串,不会影响原数组;
(4)indexOf,用来检索一个字符串中是否包含指定内容,如果字符串中含有该内容,则返回其第一次出现的索引值,如果没有则返回-1;
可以指定第二个参数,用于指定开始查找的位置;
(5)lastIndexOf,该方法和IndexOf一样,区别是lastIndexOf是从后往前找;
(6)slice(start,end),用于从字符串中截取指定内容,不会影响原字符串,而是将截取到的内容返回。
-参数:
<1>start是截取开始位置的索引(包含开始位置),
<2>end是截取结束位置的索引(不包含结束位置),
注意:如果省略第二个参数,则会截取后面所有的,也可以传递一个负数作为第二个参数,负数则从后边开始计算。
(7)subString(start,end),用于截取字符串,和slice类似;
<1>start是截取开始位置的索引(包含开始位置),
<2>end是截取结束位置的索引(不包含结束位置),
注意: 不同于slice(),该方法不能传递负数作为参数,如果传递负数,则默认为0,而且它会自动调整参数位置,如果第二个参数小于第一个参数,则自动交换。
(8)subStr(start,num),用于截取字符串,
-参数:
start是截取开始的索引,num是截取的长度;
(9)split(str),用于将一个字符串拆分为字符数组,
-参数:
需要一个字符串作为参数,将会根据该字符串拆分数组。
(10)toUpperCase(),将字符串转化为大写并返回;
(11)toLowerCase(),将字符串转化为小写并返回;
10.事件冒泡
所谓事件冒泡就是事件的向上传导,当后代元素的事件被触发时,其祖先元素的相同事件也会被触发。在开发中大部分事件冒泡都是有用的,如果要取消事件冒泡,可以通过事件对象的属性event.calcelBubble=true取消。
11.事件的委派
事件委派:指的是将事件统一绑定给元素共同的祖先元素,这样当后代元素的事件触发时,会一直冒泡到祖先元素,从而通过祖先元素的响应函数来处理事件。
注意:事件委派是利用了事件冒泡,通过委派可以减少事件绑定的次数,提高程序的性能。
12.事件传播
事件传播(Event Propagation)是指在浏览器中触发的事件会按照一定的顺序进行传播。这使得我们在编写JavaScript代码时,能够按照规定好的顺序处理我们想要处理的事件。事件传播可以分为两种主要模型:事件捕获(Event Capturing)和事件冒泡(Event Bubbling)。
(1). 事件捕获(Event Capturing):
事件捕获是由外向内的事件传播方式。当用户触发一个元素的事件时,从顶层的window对象开始,一直向下传播,经过每一个处于事件触发元素相关系列的祖先元素,一直到目标元素。
例如,当某个元素被点击时,捕获阶段会从顶层的window对象开始,然后依次向下传播,经过每一个处于该元素祖先元素,直到目标元素。捕获阶段的目的主要是提前观察到事件的发生,然后可以进行一些预处理。
(2). 事件冒泡(Event Bubbling):
事件冒泡与事件捕获正好相反,是一种自内向外的事件传播方式。当事件触发某个目标元素时,会先触发其本身的事件处理程序(如果有的话),然后逐层向外,经过每个直接或间接的祖先元素,直到浏览器的顶层window对象。这是最常用的处理方式,通常我们编写的事件处理程序都会处于这个阶段。
当然,事件传播可以被阻止,这通常由阻止事件冒泡(Stop Propagation)和阻止事件捕获(Prevent Event Capturing)实现。
一般情况下,首先进行事件捕获,然后是事件冒泡。通过在事件处理函数中包含event.stopPropagation()可以阻止事件冒泡,event.preventDefault()可以阻止事件的默认行为(例如点击链接会跳转到指定网页,阻止默认行为后,点击链接则无任何反应)。
13.BOM对象
BOM
(1)浏览器对象模型
(2)BOM可以使我们通过js来操作浏览器对象
(3)在BOM中为我们提供了一组对象,用来完成对浏览器的操作
(4)BOM对象
Window:代表的是整个浏览器的窗口,同时Window也是网页中的全局对象;
Navigator:代表当前浏览器的信息,通过该对象来识别不同的浏览器;
Location:代表浏览器的地址栏信息,通过Location可以获取浏览器地址栏信息,或操作浏览器跳转页面;
History:代表浏览器的历史记录,通过该对象可以操作浏览器的历史记录,由于隐私的原因,该对象不能获取浏览器的具体历史记录,只能操作浏览器向前向后翻页,而且该操作只在当次访问时有效;
Screen:代表用户的屏幕的信息,通过该对象可以获取到用户的显示器的相关的信息;
注意:这些对象在浏览器中都是作为Window对象的属性保存的,可以通过Window对象来使用,也可以直接使用。