javascript笔记

JavaScript基础概念:

1. JavaScript实现:

JavaScript和ECMAScript通常被人用来表达相同的含义,但是JavaScript并不是这么一点含义,它是由ECMAScript,DOM,BOM 这三部分组成。

javascript笔记_第1张图片

a. ECMAScript 核心 b. DOM 文档对象模型 c. BOM 浏览器对象模型

1.1 ECMAScript

组成部分:语法,类型,语句,关键字,保留字,操作符,对象。

1.2 DOM

文档对象模型(DOM , Document Object Model)是针对XML但是经过拓展用于HTML的应用程序编程接口。DOM把整个页面

映射为一个多层节点结构,开发人员借助DOM Api对节点进行操作。

1.3 BOM 浏览器对象模型(Browser Object Model)使用BOM控制浏览器显示页面意外的部分。

2. 在HTML中使用JavaScript方式

Script标签,代码嵌入与外部文件

3. 基本概念

语法,数据类型,流程控制,函数

3.1 语法:区分大小写,标识符(第一个字符必须是一个字母,下划线 ,美元符号开头),注释(单行 ,块级)

严格模式:
ECMAScript5引入的严格模式,严格模式就是为javascript定义了不同类型的解析与执行模式,在严格模式下,ECMAScript3中的一些不确定的行为将得到处理,
而且对于一些不安全的操作会抛出异常。要在整个脚本中启用严格模式,可以在顶部添加代码:"use strric";这段代码表示编译指示,用于告诉支持javascript
切换到严格模式。

3.2 变量,作用域和内存的问题:

基本类型和引用类型:
ECMAScript中包含两种数据类型就是:基本类型和引用类型
次两种类型与变量与其它语言的区别:
javascript变量松散,决定它只是在特定的时间用于保存特定值的一个名字而已。由于不存在定义某个变量必须保存何种数据类型值的规则。变量的值及其
数据类型可以在甲苯的生命周期内改变。基本类型只是简单的数据段。而引用类型就是可能有多个值构成的对象。

传递参数:
ECMAScript中所有的函数的参数都是按值传递,就是说,把函数的外部的值赋给函数的参数的时候是将一个实参的值赋值给形参。当参数的是基本类型
的时候就会基本类型的值复制过去,引用类型的时候就是将引用类型值的地址复制过去。

检测类型可以使用关键字 typeof 。

执行环境和作用域:
执行环境(execution context,简称环境):执行环境定义了变量或者函数有权访问其他数据,决定它的各自行为。每一个执行环境都有一个与其关联的变量对象,环境
中定义的所有变量和函数都保存在这个对象中(类似于:NET 控制层的上下文)。编写代码的时候无法访问该对象,但是解析器在处理数据的时候会在后台使用它。

全局执行环境是最外围的一个执行环境,根据ECMAScript实现所在的宿主环境不同,表示执行环境的对象也不同。在web浏览器中,全局执行环境表示的是window对象。
因此所有的全局变量和函数都是作为window对象的属性和方法所创造。某个执行环境中所有的代码执行完毕之后,该环境销毁,保存在其中的所有变量和函数都会随之销毁。

每一个函数都有自己的执行环境,当执行流静茹一个函数的时候,函数的环境就会被推到一个环境栈中。而函数执行完毕之后,栈就会将其弹出,把控制权返回给之前的执行环境。

作用域链:当代码在一个环境上执行的时候,会创建一个作用域链。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。作用域的前端,始终都是当前执行的
代码所在环境的变量对象。标识符的解析都是通过作用于链一级一级地搜索标识符的过程,搜索过程始终是从作用域链的前端开始,然后逐渐向后回溯。直到找到为止,如果没有就会报错。

延长作用域链:执行环境类型总的来说,分成全局环境与局部环境。但是通过其办法还是可以来延长作用域链。js的 一些语句可以在作用域的去前端增加一个临时变量
对象,该变量对象会在代码执行后被移除。具体的说就是执行流执行到任何一个语句时,作用域链就会得到加长。
其中:try-catch语句与with语句就是在作用域链的前端添加一个变量对象。

没有块级作用域:javascript中块级区域不会成为独立的执行环境,所有不存在块级作用域,在块级区域创建的变量会增加到当前正在执行的环境中,所在在块级区域创建变量之后,
在块级区域以外,是可以访问到该对象的。



垃圾收集:
javascript中具有自动垃圾收集机制,也就是说执行环境会负责管理代码执行过程中使用的内存。
javascript中垃圾收集方式:
标记清除:当变量进入环境的时候就标记"进入环境",当变量离开环境是就标记"离开环境",垃圾收集器在运行的时候会给存储在内存中的所有变量都标记上标记,然后
它会去掉环境中的变量以及被环境中的变量引用的变量标记。而后在被加上标记的变量将被视为准备删除的变量。因为环境中已经无法访问到这些变量。最后垃圾收集后销毁哪些带标记的
的变量并且回收其占的内存。

引用计数:跟踪记录每一个值被引用的次数,通过在赋值与被赋值过程中加1减1,判断最终为0的时候举销毁变量并回收内存。


4. 引用类型:
在ECMAScript中引用类型是一种数据结构,用于将数据和功能组织在一起。它也常被称之为类。但是并不妥当,有时候也被称为对象定义,因为它们描述是一类对象所具有的属性和方法。


1.object类型:ECMAScript中的基类。
object对象的实例方式:
构造函数创建:var student1 = new  Object();
对象字面量表示法:var student2 = {name:'zwc2',age:21};

实际上对象字面量表示法也是向函数传递大量可选参数的首选方式。对象字面量传参可极大程度的提交函数的参数要求,可以传递大量的可选参数。

2.Array类型:比较常用的数据类型,ECMAScript中的数据与其它的语言中数组有着很大的区别。ECMAScript中的数组每一项都可以保存不同类型的数据。
ECMAScript中的数组的大小是可以动态的调整的。就是可以随着数据的增加自动增长来容纳新数据。
object对象的实例方式:
构造函数创建:var arrayObj = new Array();   
var arrayObj = new Array(20);
var arrayObj = new Array('a','b','c'); 

数组字面量表示法:
var arrayObj = [];
var arrayObj = [1,2,3,4]
获取数组:通过数组下标获取(返回0-array.lenght-1)。
检测数组:ECMAScript3做出规定之后就出现了某个对象不是数组的经典问题。可以使用instanceof操作符来判断是否为数组。
例如:if(value instanceof Array){}
但是操作符instanceof操作符在于,它假定一个全局执行环境,如果一个网页包含多个框架,那么实际上就存在两个以及两个之上的全局执行环境。
从而存在两个不同版本的Array的构造函数。所在在ECMAScript中就新增了Array.isArray的方法。
转换方法:所有的对象都存在toLocaleString(),toString()和valueOf()方法。其中toString()方法会返回有数组中每一项中的值按照分隔符的形式拼接成字符串。
valueOf()返回的还是数组。而使用join()方法,可以使用不同的分割符来构建这个字符串。
栈方法:ECMAScript数组中也提供了让数组的行为类似于其他数据结构的方法。具体来说数组可以表现的类似于栈。为了模拟这种LIFO(后进先出)的数据结构
ECMAScript中提供了push()和pop()方法。以便实现这种栈的行为。
队列方法:队列的数据结构是"先进先出"。队列在列表的末端插入数据,在队列的前端删除项。在数组的末端插入元素有push()方法可以实现,所以ECMAScript就提供
了shift()的方法来操作数组,用于删除数组中的第一项并返回。ECMASript中来提供了unshift()方法,用于在数组的前端插入数据,并返回新的数组长度。
重排序方法:reverse()反转数组项。
  sort()默认情况下按照升序排列数据组。该方法会调用每个数组项的toString()转型方法,然后比较得到的字符串。以确定如何排序。也就是该方法最终
  比较的是字符串。该方法也可以接收一个比较函数作为参数,以便来指定那个值在那个值之前。比较函数接收两个参数,如果两个参数相等则返回0。第一个参数位于第一个参数
  之后就返回一个正数。
这两个方法的返回值都是经过排序后的数组。
操作方法:ECMAScript为操作包含在数组中项提供了很多操作方法。
concat():基于当前数组的中的所有项创建一个新的数组。具体的来说,这个方法会创建当前数组的一个副本,然后将接受到的参数添加到这个副本的末端。最后返回一个新构建的数组。
splice():该方法存在很多用法。
删除:splice(0,2);可以删除数组中的前两项。
插入:splice(2,0,"red","green");从数组位置2开始插入数据"red","green"
替换:splice(2,1,"red","green");删除数组位置为2的想,然后从2中开始插入数据"red","green"
位置方法:ECMASript5为数组实例添加了两个为位置操作方法。
indexOf():从数组头开始查找。
lastIndexOf():从数组的末尾查找。
这两个方法都是返回要查找项在数组中位值,在没有找到的情况下返回-1。在查找的时候会使用===全等查找。
迭代方法:ECMAScript5为数组定义了5个迭代方法
every():对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true。
filter():对数组中每一项运行给定函数,返回该函数会返回true的项成的数组。
forEach():对数组中每一项运行给定函数,没有返回值。
map():对数组中的每一项运行给定函数,返回每次调用的结构组成数组。
some():对数组中的每一项运行给定函数,如果该函数对任意一项返回true,则返回true。

5.Function类型:
函数的内部属性:
arguments:一个类数组对象,包含着传入函数中所有的参数。虽然arguments的主要用途是保存函数参数。但是这个对象还有一个名为callee的属性。该属性是一个指针。
指向拥有这个arguments对象的函数。
this:指的是函数执行的环境对象。

函数的属性和方法:
属性:
length:表示函数希望接受的命名参数的个数。
prototype:表示对象的原型。
两个非继承方法:
apply():
call():
这两个方法的用途都是在特定的环境下调用函数。真正的用处是在扩充函数赖以运行的作用域。
除了这俩个方法,ECMAScript5还定义一个bind()方法,这个方法会创建一个函数的实例。其中this值会绑定传给Bind()函数的值。

6.基本包装类型:
String,Boolean,Number。

7. Global对象:
ECMAScript中对该对象的定义就是“兜底对象”,不属于其他对象的属性和方法就是它的属性或者方法。
主要:
URI编码,
eval():就像是一个完整的ECMAScript解析器。只有一个参数,就是要执行一个参数,就是要执行ECMAScript。
window对象:全局对象,所以在全局对象只能够定义的变量和函数都成为了window对象的属性。
Math对象:数学计算的属性和方法的集合。

9.面向对象的程序设计:
EMACScript中把对象定义为:“无序属性的集合,其属性可以包含基本值,对象或者函数。”
EMACScript中的属性类型:
1.数据属性:数据属性包含一个数据值的位置,在这个位置可以读取和写入。
数据属性4个描述其行为的特性:
Configurable,Enumerable,Writable,Value
2.访问属性:该属性不包含数据值,它们包含一对getter和setter函数。
访问属性4个描述其行为的特性:
Configurable,Enumerable,Get,Set
注意:访问器属性不能直接定义,必须使用Object.defineProperty()来定义。
在ECMAScript5中定义了一个Object.definePropertys();来表示可以定义多个属性。


创建对象:

1.工厂模式:
在ECMAScript中无法创建类,开发人员就发明了一种函数,用韩束来封装一特定的借口创建对象的细节。
工厂模式虽然解决了创建多个相似对象的问题,但是没有解决对象识别的问题。

2.构造函数模式:
ECMAScript中的构造函数可以用来创建特定类型的对象。类似于Object,Array等这样原生构造函数。
按照惯例,构造函数始终都应该以一个大写字母开头,而非构造函数式一小写字母开头。
构造函数与其它函数唯一的区别就是在于它的调用方式不同,不过,构造函数毕竟只是函数,任何还能输,只要通过new操作符来调用。
就可以当初构造函数来看待。

3.原型模式:每一个函数都有一个原型属性,这个属性是一个指针,指向一个对象,而这个对象用途就是包含可以由特定类型的所有实例的原型对象。
使用原型对象的好处就是可以让所有的对象都共享他所包含的属性和方法。

4.使用原型和构造函数混合创建对象:
使用这种的原因是解决原型模式的一个属性共享的问题。

5.动态原型模式:
把信息封装在构造函数中,可以通过检查某个存在的方法是否有效,来决定是否需要初始化原型。


继承:
继承是面向对象编程的基本概念,ECMAScript中函数没有签名,所有无法实现接口继承。所以只能实现继承,其实实现继承的主要依靠还是原型来实现。


1.什么是原型链:原型对象将包含指向另一个原型的指针,相应的另一个原型包含着一个指向另一个构造函数的指针。这样就形成了原型链。

2.借用构造函数(对象冒充的方式实现继承)
在子类的构造函数内部调用超类型的构造函数,因为函数只不过是在特定环境中执行的代码的对象,所在可以使用call()和apply()方法可以在新创建的对象行执行构造函数。

3.组合继承:将原型链继承和借用构造函数继承这两种结合形成的继承模式。

10.函数表达式:
递归:递归函数就是一个函数通过名字调用自身而实现的。
闭包:是指有权访问另一个函数作用域中的变量函数。创建闭包的常见方式,就是在一个函数的内部创建另一个函数。

11. 其他

BOM:浏览器对象
window:表示一个浏览器的实例。


客户端检测:
能力检测:
最常用的客户端检测方式就是能力检测。能力检测的对象不是识别特定的浏览器,而是识别浏览器的能力,采用这种方式就不必顾忌特定的浏览器如何,只要确定浏览器支持的功能。

DOM:
文档对象模型,实在针对html和xml文档的一个api,dom描绘一个层次化的节点树,可以让开发人员添加移除,和修改页面的一个部分。
节点层次:
DOM可以将任何html或xml文档描述成一个有多层节点构成的结构。
Node类型:
DOM1级定义了一个Node接口,该接口将由DOM中的所有节点类型实现。这个Node接口在javascript中所有的节点类型都能够继承自Node类型。
因此所有的节点类型都共享这相同的基本属性和方法。没一个节点都有一个nodeType属性。用于表示节点的类型。

事件:
事件流:
事件流描述的是页面中接收的事件的顺序。
事件冒泡:
IE的事件流为事件冒泡,就是事件开始的时候 由最具体 的元素接受,然后逐渐向上传播到较为不具体的节点。
事件捕获:
不太具体的节点应该最早的捕获到该事件,而最具体的节点应该最后获取事件。

你可能感兴趣的:(javascript)