1、JavaScript简介算法
一、ECMAScript编程
1995~今已经20年的历史,产生JavaScript是须要它去解决必定的问题:在浏览器端作一些数据的验证,试想当年的网络环境,若是可以在浏览器端作数据验证可以方便不少。现在的JavaScript拥有了闭包、匿名函数、甚至元编程的能力。一门可以解决棘手问题的新语言的诞生一定有很广阔的市场,有市场就会有竞争,竞争逐渐演化为标准也就是ECMAScript、它定义了一门脚本语言的标准,在此基础上加入DOM,BOM的支持构成了现在的JavaScript。数组
二、 DOM(Document Object Model)浏览器
DOM是一个编程接口,操做的对象是基于XML的HTML(HTML元素的容器)结构。安全
DOM将一个HTML文件表示成一个分层树形图,借助DOM提供的API,开发人员能够很方便的增、删、改、查HTML文件节点网络
DOM由两部分构成:DOM Core和DOM HTML 前者用于描述HTML结构,后者用于提供一些操做,是否是很符合数据结构+算法的思想。数据结构
三、 BOM(Browser Object Model)闭包
BOM是一个描述浏览器窗口的对象模型。好比窗口大小,分辨率,location,这些都是属于浏览器窗口的信息,跟DOM没有关系,同时也提供了和浏览器交互的方法和接口。函数
2、在HTML中使用JavaScript测试
在HTML代码中使用<script></script>标签将JavaScript代码嵌入HTML文件中,包含在这个标签里的JavaScript代码从上到下依次解释。
能够经过这个标签的src属性连接外部的JavaScript文件,也能够在这个标签中间直接写JavaScript代码。不可以在一个script标签中即便用src属性连接外部文件又使用内嵌的方式写入JavaScript代码,若是这样写内嵌的代码将被忽略。
3、基本概念
一、 严格模式:为JavaScript定义了一种不一样的解析和执行模型,在严格模式下ECMAScript3中一些不肯定的行为将获得处理,并且某些不安全的操做也会跑出错误。要在脚本中启用严格模式,能够在顶部添加以下代码
“use strict”;
二、 变量
每一个变量仅仅是一个用于保存值的占位符而已 :var xxxx;//(xxxx是变量名),
注意:
①、此处仅仅是定义了变量xxxx单未给变量初始化,此时xxxx会保存一个特殊的值:undefined
②、使用var操做符定义的变量将成为定义该变量做用域中的局部变量,这是相对于全局变量来说的,若是不适用var而直接给一个未声明过的变量赋值,那么当这个变量定义语句执行事后这个变量将成为全局变量。未经声明的变量赋值在严格模式下会致使抛出ReferenceError错误。
三、 数据类型
① ECMAScript定义了5中简单的数据类型(基本数据类型)
a) Undefined
很是神奇的一种数据类型,其余语言中没见过,这种类型只有一个值即:undefined。如上所述在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。
b) Null
这也是一个很是神奇的类型,只有一个值null,标识一个空对象的指针。通常若是定义的变量是要用来保存对象的,那么最好在初始化的时候将它初始化为null值,这样一来在之后用到该变量的时候只须要直接检查该变量是否为null值就能够知道相应的变量是否已经保存了一个对象的引用。
Var car=null;
Alert(Type of car) //Object;
……;
If(car != null){
//对car对象执行某些操做
}
又一枚神奇的定义:undefined派生自null
Alert(null == undefined); //true
c) Boolean
只有两个值true、false;
全部类型的值都有与这两个值等价的值,可使用Boolean(变量名)来转换。
d) Number
NaN值,Not a Number
任何数除0都会返回NaN,NaN与任何值都不相等包括NaN自己
e) String
② 1中复杂的数据类型
Object,本质上是由一组无序的名值对组成
建立自定义对象的方式是建立Object类型的实例并为其添加属性和方法。基本类型不具备这个特性。
Var person = new Object();//定义一个person对象
Person.name=’helloworl~~~’;//为person对象添加一个name属性
Alert(person.name);// helloworl~~~
不支持任何建立自定义类型的机制,全部值最终都将是上述6种数据类型之一。 经过typeof操做符能够识别变量的类型,函数在ECMAScript中是对象,不是一种数据类型,然而函数有一些特殊的属性,所以经过typeof操做符来区分函数和其余对象是有必要的。
四、 函数
① 、无须制定函数的返回值,由于任何ECMAScript函数均可以在任什么时候候返回任何值。
② 实际上、未指定返回值的函数返回的是一个特殊的undefined值。
③ ECMAScript中也没有函数签名的概念,由于其函数参数是以一个包含零活多个值得数组的形式传递的。
④ 能够向ECMAScript函数传递任意数量的参数,而且能够经过arguments对象来访问这些参数。
⑤ 因为不存在函数签名的特性,ECMAScript函数不能重载。
五、 变量的类型检测
① 、Typeof 操做符,注意这是一个一元操做符,它用来检测变量的类型
Var a=true;
Var b;
Var c=null;
Var d = new Object();
Alert(typeof a);// 输出:boolean
Alert(typeof b);// 输出:undefined
Alert(typeof c);// 输出:object
Alert(typeof d);// 输出:object
② Instanceof 操做符,是一个二元操做符,测试一个对象是否是另外一个对象的实例,返回ture false。
Alert(person instanceof Object);//变量person是Object吗?
Alert(colors instanceof Array);//变量colors是Array吗?
Alert(pattern instanceof RegExp);//变量pattern是RegExp吗?
在检测基本数据类型时typeof很好用,可是在检测引用类型的变量时,这个操做符的用处不大,由于它只会返回object或function。一般咱们并不想知道某个值时对象,而是想知道它是什么类型的对象,这个时候用instanceof操做符就能够实现此目的。
六、 做用域
JavaScript中没有块级做用域,于是支持根据条件来定义变量。在其余类C的语言中,由花括号封闭的代码都有本身的做用域。
If(true){
Var color=’blue’;
}
Alert(color); //’blue’
七、 垃圾收集
JavaScript具备自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程当中使用的内存。垃圾收集机制的原理简单的讲就是找出那些不在继续使用的变量,而后释放其所占用的内存。通常都是周期性的执行这一操做,固然也能够主动调用。
找程序中的无用变量的策略可能会由于实现而异,一般有以下两个策略:
①、 标记清除:当变量进入环境时,就将这个变量标记为“进入环境”。从逻辑上将,永远不能释放进入环境的变量所占用的内存,由于只要执行流进入相应的环境,就可能用到他们。而当变量离开环境时,则将其标记为“离开环境”。垃圾收集器完成清除离开环境的对象内存的工做。
②、 引用计数(不太常见):跟踪每一个值被引用的次数,当声明了一个变量并将一个引用类型的值赋给该变量时,则这个值得引用次数就是1,若是同一个值又被赋给另外一个变量,则该值得引用次数加1.相反,若是包含对这个值引用的变量又取得另一个值,则这个值得引用次数减1,当这个值得引用次数变成0时,则说明没有办法再访问这个值了,于是就能够将其占用的内存空间回收回来。
优化内存占用的最佳方式,就是为执行中的代码只保存必要的数据,一旦数据不在有用,最好经过将其值设置为null来释放其引用。这个作法叫作解除引用。这一作法使用于大多数全局变量和全局对象的属性。局部变量会在他们离开执行环境时自动被解除引用。注意:解除一个值得引用并不意味着自动回收该值所占用的内存。解除引用的真正做用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。
本文系我的读书总结,转载请注明出处