Javascript是一种由Netscape的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如Perl,遗留的速度问题,为客户提供更流畅的浏览效果。当时服务端需要对数据进行验证,由于网络速度相当缓慢,只有28.8kbps,验证步骤浪费的时间太多。于是Netscape的浏览器Navigator加入了Javascript,提供了数据验证的基本功能。
基本信息
JavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。同时也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能,比如响应用户的各种操作。它最初由网景公司(Netscape)的Brendan Eich设计,是一种动态、弱类型、基于原型的语言,内置支持类。JavaScript是Sun公司的注册商标。Ecma国际以JavaScript为基础制定了ECMAScript标准。JavaScript也可以用于其他场合,如服务器端编程。完整的JavaScript实现包含三个部分:ECMAScript,文档对象模型,字节顺序记号。
Netscape公司在最初将其脚本语言命名为LiveScript。在Netscape在与Sun合作之后将其改名为JavaScript。JavaScript最初受Java启发而开始设计的,目的之一就是“看上去像Java”[1],因此语法上有类似之处,一些名称和命名规范也借自Java。但JavaScript的主要设计原则源自Self和Scheme[2]。JavaScript与Java名称上的近似,是当时网景为了营销[3]考虑与Sun公司达成协议的结果。为了取得技术优势,微软推出了JScript脚本语言。Ecma国际(前身为欧洲计算机制造商协会)创建了ECMA-262标准(ECMAScript)。现两者都属于ECMAScript的实现。尽管JavaScript作为给非程序人员的脚本语言,而非是作为给程序人员的编程语言来推广和宣传,但是JavaScript具有非常丰富的特性。
前身是 Live Script
正式名称:ECMAScript
ECMAScript-262是JavaScript标准,基于网景(Netscape)公司提出JavaScript语言和微软公司提出的JScript语言
ECMA开始于1996年,在1997年7月,采纳了首个版本,1998年,该标准成为了国际ISO标准
作者简介
Brendan Eich
布兰登·艾奇(Brendan Eich,1964年~),JavaScript
[4]
的发明人,从2007年开始在
Mozilla公司担任首席技术长官(Chief Technology Officer)
组成部分
一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:核心(ECMAScript)、文档对象模型(Document Object Model,简称DOM)、浏览器对象模型(Browser Object Model,简称BOM)
ECMAScript
ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会)通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛,它往往被称为JavaScript或JScript,但实际上后两者是ECMA-262标准的实现和扩展。
目前最新版为v5
ECMAScript关键字的完整列表:
break else new var typeof case finally return void catch for switch while default if throw delete in try do instanceof 如果把关键字用作变量名或函数名,可能得到诸如“Indetifier expected”(应该有标识符)这样的错误信息。
ECMA-262的保留字 :
ECMAScript定义了一套保留字,保留字在某种意义上是为了将来的而保留的单词。因此,保留字不能被用作变量名或函数名。ECMA-262第3版中保留字的完整列表如下:
abstract enum int short
boolean export interface static
byte extends long super char final
native synchronized class float package
throws const goto private transient debugger
implements protected volatile double
import public
如果将保留字用作变量名或函数名,那么除非将来的浏览器实现了该保留字,否则很可能收不到任何错误消息。当浏览器将其实现后,该单词被看作关键字,如此将出现关键字错误。
DOM
Document Object Model,文档对象模型,DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。换句话说,这是表示和处理一个HTML或XML文档的常用方法。有一点很重要,DOM的设计是以对象管理组织(OMG)的规约为基础的,因此可以用于任何编程语言。最初人们把它认为是一种让JavaScript在浏览器间可移植的方法,不过DOM的应用已经远远超出这个范围。Dom技术使得用户页面可以动态地变化,如可以动态地显示或隐藏一个元素,改变它们的属性,增加一个元素等,Dom技术使得页面的交互性大大地增强。
BOM
浏览器对象模型(BrowserObjectModel) 研发者通过使用BOM,可移动窗口、更改状态栏文本、执行其它不与页面内容发生直接联系的操作。BOM是JavaScript应用中唯一没有相关标准的部分,这是BOM真正独特且经常出现问题的所在。 BOM主要处理浏览器窗口与框架,但事实上,浏览器特有的JavaScript扩展都被认作是BOM的一部分。
这些扩展包括:
1. 弹出新浏览器窗口的能力;
2. 移动、关闭和更改浏览器窗口大小的能力;
3. 可提供WEB浏览器详细信息的导航对象;
4.可提供浏览器载入页面详细信息的本地对象;
5 .可提供用户屏幕分辨率详细信息的屏幕对象;
6. 支持Cookies;
7. Internet Explorer对BOM进行扩展以包括ActiveX对象类,可以通过JavaScript来实现ActiveX对象。
由于BOM没有相关标准,每个浏览器都有其自己对BOM的实现方式。BOM有窗口对象、导航对象等一些实际上已经默认的标准,但对于这些对象和其它一些对象,每个浏览器都定义了自己的属性和方式。
相关概念
语句
JavaScript程序是由若干语句组成的,语句是编写
程序的指令。JavaScript提供了完整的基本编程
语句,它们是:
赋值语句、switch选择语句、while循环语句、for循环语句、for each循环语句、do...while循环语句、break循环中止语句、continue循环中断语句、with语句、try…catch语句、if语句(if..else,if…else if…)。
函数
函数是命名的语句段,这个语句段可以被当作一个整体来引用和执行。使用函数要注意以下几点:
1)函数由关键字function定义(也可由Function构造函数构造)。
2)使用function关键字定义的函数在一个作用域内是可以在任意处
调用的(包括定义函数的语句前);而用var关键字定义的必须定义后才能被调用。
3)函数名是调用函数时引用的名称,区分大小写,调用函数时不可写错函数名。
4)参数表示传递给函数使用或操作的值,它可以是常量,也可以是变量,也可以是函数,在函数内部可以通过arguments对象(arguments对象是一个伪数组,属性callee引用被调用的函数)访问所有参数。
5)return语句用于返回表达式的值。
6)yield语句扔出一个表达式,并且中断函数执行直到下一次调用next。
对象
JavaScript的一个重要功能就是
面向对象的功能,通过基于对象的程序设计,可以用更直观、模块化和可重复使用的方式进行程序开发。
一组包含数据的属性和对属性中包含数据进行操作的方法,称为对象。比如要设定网页的背景颜色,所针对的对象就是document,所用的属性名是bgcolor,如document.bgcolor="blue",就是表示使背景的颜色为蓝色。
内置对象
JavaScript 字符串(String)对象
字符串是 JavaScript 的一种基本的数据类型。需要注意的是,JavaScript 的字符串不可变(immutable),String 类定义的方法都不能改变字符串的内容。像 String.toUpperCase() 这样的方法,返回的是全新的字符串,而不是修改原始字符串。
String 对象的 length 属性声明了该字符串中的字符数。
String 类定义了大量操作字符串的方法,一般分为这样几类:查找子字符串、截取,分割和拼接字符串、匹配正则表达式、改变字符串样式等。
JavaScript Date(日期)对象
Date 对象用于处理日期和时间,Date 对象会自动把当前日期和时间保存为其初始值。
Date 对象的大部分方法是以下几类:
getXXX:获取 年、月、日、时、分、秒、等等。
setXXX:设置 年、月、日、时、分、秒、等等。
toXXXString:转成一定格式的字符串。
JavaScript Array(数组)对象
数组对象的作用是:使用单独的变量名来存储一系列的值。
数组的常用属性是:length,代表了这个数组中元素的个数。
数组的常用方法分这么几类:排序、添加和删除元素、拼接另一个数组、转成字符串。其中添加元素和移除元素的几个方法还有模拟堆栈或队列这些数据结构的作用。
JavaScript Boolean(逻辑)对象
Boolean(逻辑)对象用于将非逻辑值转换为逻辑值(true 或者 false)。
在 JavaScript 中,布尔值是一种基本的数据类型。Boolean 对象是一个将布尔值打包的布尔对象。Boolean 对象主要用于提供将布尔值转换成字符串的 toString() 方法。当调用 toString() 方法将布尔值转换成字符串时(通常是由 JavaScript 隐式地调用),JavaScript 会内在地将这个布尔值转换成一个临时的 Boolean 对象,然后调用这个对象的 toString() 方法。
JavaScript Math(算数)对象
Math(算数)对象的作用是:执行常见的算数任务。
Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math(),像 Math.sin() 这样的函数只是函数,不是某个对象的方法。您无需创建它,通过把 Math 作为对象使用就可以调用其所有属性和方法。(相当于静态类和静态方法)
Math 对象的常用属性都是数学相关的常量属性,如圆周率π、2的平方根,算数常量e(自然对数的底数,约等于2.718)。
Math 对象中最常用的方法有这样一些:向上(向下)取整、四舍五入取整、随机数、返回2个数中的大数或小数。
JavaScript RegExp 对象
什么是 RegExp?
RegExp 是正则表达式的缩写。当您检索某个文本时,可以使用一种模式来描述要检索的内容。RegExp 就是这种模式。简单的模式可以是一个单独的字符。更复杂的模式包括了更多的字符,并可用于解析、格式检查、替换等等。您可以规定字符串中的检索位置,以及要检索的字符类型,等等。
这个知识点,相对还是比较繁杂的,想熟练掌握是需要花费一些功夫的,具体请看 JS 手册。
JavaScript Global 对象
这是一个固有对象,目的是把所有全局方法集中在一个对象中。Global 对象不能用 new 运算符创建。它在 Scripting 引擎被初始化时创建,并立即使其方法和属性可用。
属性:Infinity 属性 | NaN 属性
方法:escape 方法 | eval 方法 | isFinite 方法 | isNaN 方法 | parseFloat 方法 | parseInt 方法 | unescape 方法
事件
用户与网页交互时产生的操作,称为事件。事件可以由用户引发,也可能是页面发生改变,甚至还有你看不见的事件(如Ajax的交互进度改变)。绝大部分事件都由用户的动作所引发,如:用户按鼠标的按键,就产生click事件,若鼠标的指针在链接上移动,就产生mouseover事件等等。在JavaScript中,事件往往与事件处理程序配套使用。
而对事件的处理,W3C的方法是用addEventListener()函数,它有三个参数:事件,引发的函数,是否使用事件捕捉。为了安全性,建议将第三个参数始终设置为false
传统的方法就是定义元素的on…事件,它就是W3C的方法中的事件参数前加一个“on”。而IE的事件模型使用attachEvent和dettachEvent对事件进行绑定和删除。JavaScript中事件还分捕获和冒泡两个阶段,但是传统绑定只支持冒泡事件。
常用类型
Object:对象
Array:数组
Number:数
Boolean:
布尔值,只有true和false两个值,是所有类型中占用内存最少的
null:一个空值,唯一的值是null,表空引用
undefined:没有定义或赋值的变量
NaN:非数字类型
相关规则
在JavaScript中,“==="是全同运算符,只有当值相等,数据类型也相等时才成立。
等同运算符“=="的比较规则:
当两个运算数的类型不同时:将他们转换成相同的类型。
1)一个数字与一个
字符串,字符串转换成数字之后,进行比较。
2)true转换为1、false转换为0,进行比较。
3)一个对象、
数组、函数与 一个数字或字符串,对象、数组、函数转换为原始类型的值,然后进行比较。(先使用valueOf,如果不行就使用toString)
4)其他类型的组合不相等。
想两个运算数类型相同,或转换成相同类型后:
1)2个字符串:同一位置上的字符相等,2个字符串就相同。
2)2个数字:2个
数字相同,就相同。如果一个是NaN,或两个都是NaN,则不相同。
3)2个都是true,或者2个都是false,则相同。
4)2个引用的是同一个
对象、函数、
数组,则他们相等,如果引用的不是同一个对象、函数、数组,则不相同,即使这2个对象、函数、数组可以转换成完全相等的原始值。
5)2个
null,或者2个都是未定义的,那么他们相等。
而“===”是全同运算符,全同运算符遵循等同运算符的比较规则,但是它不对运算数进行类型转换,当两个运算数的类型不同时,返回false;只有当两个运算数的类型相同的时候,才遵循等同运算符的比较规则进行比较。
例如:null==undefined 会返回真, 但是null===undefined 就会返回假!