一:JavaScript组成部分

JavaScript是由三个不同部分组成的,核心(ECMAScript) 、文档对象模型(DOM)和浏览器对象模型(BOM)。

1.ECMAScript

ECMAScript与Web浏览器没有依赖关系。只是Web浏览器只是ECMAScript实现可能的宿主环境之一,其他宿主环境包括Node和Adobe Flash。它规定了这门语言的组成部分:
1.语法
2.类型
3.关键字
4.保留字
5.操作符
6.对象

2.文档对象模型(DOM)

文档对象模型(Document Object Model)是针对XML但经过扩张用于HTML的应用程序编程接口(API,Application Programming Interface)。DOM把整个页面映射为一个多层次节点结构。以HTML代码为例子

<html>
    <head>
     <title>DOM</title>
         <body>
            <h1>DOM</h1>
              <p>Hello world</p>
      </body>
    </head>
</html>

根据 DOM,HTML 文档中的每个成分都是一个节点。DOM 是这样规定的:整个文档是一个文档节点。每个 HTML 标签是一个元素节点。包含在 HTML 元素中的文本是文本节点。每一个 HTML 属性是一个属性节点。注释属于注释节点
每个节点彼此都有等级关系,HTML 文档中的所有节点组成了一个文档树(或节点树)。HTML 文档中的每个元素、属性、文本等都代表着树中的一个节点。树起始于文档节点,并由此继续伸出枝条,直到处于这棵树最低级别的所有文本节点为止。除文档节点之外的每个节点都有父节点。
以上列代码分析,<head> 和 <body> 的父节点是 <html> 节点,文本节点 "Hello world!" 的父节点是 <p> 节点。
大部分元素节点都有子节点。比方说,<head> 节点有一个子节点:<title> 节点。<title> 节点也有一个子节点:文本节点 "DOM"。
当节点分享同一个父节点时,它们就是同辈(同级节点)。比方说,<h1> 和 <p>是同辈,因为它们的父节点均是 <body> 节点。
节点也可以拥有后代,后代指某个节点的所有子节点,或者这些子节点的子节点,以此类推。比方说,所有的文本节点都是 <html>节点的后代,而第一个文本节点是 <head> 节点的后代。
节点也可以拥有先辈。先辈是某个节点的父节点,或者父节点的父节点,以此类推。比方说,所有的文本节点都可把 <html> 节点作为先辈节点。

2.1DOM级别

DOM1级由两个模块组成:DOM核心和DOM HTML。其中,DOM核心规定是如何映射基于基于XML的文档结构,以便简化对文档中任意部分的访问和操作,DOM HTML则在DOM核心的基础上加以扩展,添加了针对HTML文档的对象和方法。
DOM2级在DOM的基础上又扩展了鼠标和用户界面事件、范围、遍历(迭代DOM文档的方法)等细分模块,而且通过对象接口增加对CSS的支持。
DOM3级则进一步扩展了DOM,引入了以统一方式加载和保存文档方法—在DOM加载和保存模块中定义;新增了验证文档的方法—在DOM验证模块定义。

3.浏览器对象模型(BOM)

开发人员可以通过BOM来控制浏览器显示的页面以外的部分。从根本上讲,BOM只处理浏览器窗口和框架;但人们习惯也把所有针对浏览器的JavaScript扩展算作BOM一部分。
1.弹出新浏览器窗口功能;
2.移动、缩放和关闭浏览器窗口的功能;
3.提供浏览器详细信息的navigatior对象;
4.提供浏览器所加载页面的详细信息的location对象;
5.提供用户显示器分辨率详细信息的scree对象
6.对cookies的支持
7.像XMLHttpRequest和IE的ActiveXObject这样的自定义对象。

二:在HTML中使用JavaScript

在HTML中插入JavaScript的主要方法,就是使用<script>元素。HTML4.0.1为<script>元素定义下列6个属性。
1.async:可选,表示应该立即下载脚本,但不妨碍页面中的其他操作,比如下载其他资源或等待其他脚本。只对外部脚本有效
2.charset:可选,表示通过src属性指定的代码的字符集。(很少人用)
3.defer:可选,表示脚本可以延迟到文档完全被解析和显示之后再执行。只对外部脚本有效
4.language:已经废弃。
5.src:可选。表示包含要执行代码的外部文件。
6.type:可选,浏览器已经默认了。
一般把<script>元素放在<body>元素后面,为的是避免浏览器在呈现页面时候出现明显的延迟,也让JavaScript更好操作DOM

<script>
    function sayHi(){
        var i = 'wythe';
        alert("</script>");
    }
<script>

按照解析嵌入式代码规则,当浏览器遇到字符串</script>时候,就会认为那是结束的标签。而通过转义字符""解决这个问题,例如:

<script>
    function sayHi(){
        var i = 'wythe';
        alert("<\/script>");
    }
<script>

三:JavaScript 基本概念

3.1 区分大小写
JavaScript是区分大小写的,也就是说变量、函数、关键字和所有标识符都是区分大小写的。
所谓的标识符,就是指得是变量、函数、属性的名字,或者函数的参数。标识符可以是按照下列格式规则组合起来的一或多个字符:

a.第一个字符必须是一个字母、下划线或一个美元符号($);
b.其他字符可以是字母、下划线、美元符号或数字。

3.2 注释
JavaScript支持两种注释,包括单行注释和块级注释。
单行注释以//开头,如://单行注释
多行注释则以一个斜杠和一个星号(/)开头 以一个星号和一个斜杠( /)结尾。
3.3保留字和关键字
JavaScript把一些标识符拿出来作为自己的关键字。因此,不能再在程序使用这些关键字作为标识符。如break、do、instanceof、typeof、var、case、if、while、function 和for等等...
保留字虽然还没有任何特定的用途,但它们将来可能用作关键字。如:int、short、boolean、goto和byte。
3.3变量
JavaScript的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。换句话说,每个变量仅仅是一个保存值的占位符而已。定义变量时候要使用var操作符,后跟变量名(标识符):var message;初始化的过程就是给变量赋一个值,因此,可以在修改变量值同时修改值的类型。

var message = "hi";
message = 100 //有效不推荐

有一点必须注意,即用var操作符定义的变量将成为定义该变量的作用域的局部变量。也就是说,在函数中使用var定义一个变量,那么这个变量在函数退出后就会销毁,除非定义一个全局变量。

function test(){
  var a = 'hello,wythe';//局部变量
  b = 'hello world';//全局变量
}
test()
console.log(a)//错误,a没有定义。
console.log(b)//hello,world

3.4数据类型
JavaScript的数据类型分为两类:原始类型和对象类型。原始类型包括数字(numner)、字符串(string)、布尔值(boolean)、undefined和null。对象类型则有object,object是属性的集合,每个属性都由名/值对(值可以是原始值,比如数字、字符串,也可以是对象)构成。
3.4.1typeof操作符
由于JavaScript是松散类型,因此需要有一种手段来检测给定变量的数据类型——typeof。对一个变量使用typeof操作符可能返回下列字符串:

  • "undefined"—如果这个值未定义;

  • "boolean"—如果这个值是布尔值;

  • "string"—如果这个值是字符串;

  • "number"—如果这个值是数值;

  • "object"—如果这个值是对象或null 数组也是对象,数组是一种特殊对象,表示带编号的值的有序集合

  • "function"—如果这个值是函数。函数是一种特殊对象,函数具有与它相关联的可执行代码的对象。通过调用函数来运行可执行代码,并返回运算结果
    对于null,typeof返回的是object,那是因为null被认为是一个空对象的引用。

3.4.1 undefined类型
undefined类型只有一个值,那就是undefined。是变量的一种取值,表明值没有初始化。
3.4.2 null类型
null类型也是只有一个值,那就是null。typeof null 返回的是"object"也就是可以认为是一个特殊的对象值,含义是“非对象”。
undefined跟null都是表示值的空缺。null == undefined 会返回true 判断相等符“==” 认为两者相等。这个操作符出于比较的目的会转换其操作数。
3.4.3 number类型
JavaScript是不区分整数值和浮点数值的。最基本的字面量格式是十进制整数,除了十进制以外,还支持八位制(在严格模式下无效)或十六进制的字面值表示。浮点数值,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。浮点数值的最高精度是17位小数,但在进行算术计算的时候其精确度远远不如整数。

 var a = 0.1,
     b = 0.2;   
 if(a+b == 0.3){
    console.log("bingo");
 }else{
    console.log("error");//显示error
 }

因此尽量避免这样运算。NaN,即非数值是个特殊的值,这个数值表示一个本来要返回数值的操作数未返回数值的情况。0除以0会返回NaN,正数除以0返回Infinity,负数除以0返回-Infinity。NaN与任何值都不相等,包括自身。因此JavaScript定义isNaN函数,isNaN接受一个参数,该参数可以是任何类型,函数会判断该参数是否“不是数值”。isNaN接收一个之后,会尝试把这个值转为数值。


    isNaN(1); //false
    isNaN("10");//会转换为数值10,返回false
    isNaN(true);//转换为数值1,返回false
    isNaN("blue");//不能转换为数值,返回true
    isNaN("true");//不能转为数值,返回true
    isNaN("11blue");//true,不能转为数值

数值转换有3个函数可以把非数值转换为数值:Number()、parseInt()和parseFloat().第一个函数(Number)可以用于任何数据类型,而另两个函数专门把字符串转换为数值。
Number()函数的转换规则如下:

  • 如果是布尔值true和false,则分别转换为1和0

  • 如果是数字值,则返回该数值

  • 如果是null值,则返回0

  • 如果是undefined,则返回NaN

  • 如果是字符串,如果字符串只包含数字的话,则将其转为十进制数值,即“1”转为1,“123”则是123,“011”转为11(忽略前导的0),“11.1”则为11.1,"0xf"则转为相同大小的十进制整数。如果字符串是空,则将转为0;除此以外其他字符串,则转为NaN(“122blue”,“0a”,"a")。

  • 如果是对象,则调用对象的valueOf()方法,然后按照前面规则转换返回的值。如果转换的结果是NaN,则调用对象toString()方法,再次按照前面的规则转换返回的字符串值。
    譬如Number({a:2})返回的是NaN,而Number([1])返回的是1

未完待续...


Wythehuang
117 声望6 粉丝