第一章
- java script是一种专门为网页交互而设计的脚本语言
- ECMAScript 提供外围语言性能
- 文档对象模型DOM 提供拜访和操作网页内容的办法和接口
- 浏览器对象模型,提供与浏览器交互的办法和接口
第二章
2.1 <script>
向HTML页面插入JavaScript的次要办法就是是用<script>元素
- async- charset- defer- language- src- type : 示意编写代码应用的脚本语言的内容类型(也称为MIME类型)
- 间接在页面中嵌入JavaScript
- 蕴含内部JavaScript
在解释器对<script>元素外部的所有代码求值结束以前,页面中的其余内容都不会被浏览器加载或显示
带有 src 属性的<script>元素不应该在其<script>和</script>标签之间再 蕴含额定的 JavaScript 代码。如果蕴含了嵌入的代码,则只会下载并执行内部脚本文件,嵌入的代码 会被疏忽。
通过<script>元素的 src 属性还能够蕴含来自内部域的 JavaScript 文件。这一点既让 <script>元素倍显弱小,又让它备受争议。在这一点上,<script>与<img>元素十分类似,即它的 src 属性能够是指向以后 HTML 页面所在域之外的某个域中的残缺 URL,例如:
<script type="text/javascript" src="http://www.somewhere.com/afile.js"></script>
2.1.1 标签的地位
所有<script>元素都应该放在页面的<head>元素中
在文档的<head>元素中蕴含所有 JavaScript 文件,意味着必须等到全副 JavaScript 代码都被下载、 解析和执行实现当前,能力开始出现页面的内容(浏览器在遇到<body>标签时才开始出现内容)。
2.1.2 提早脚本
- defer
这个属性的用处是表明脚本在执行时不会影响页 面的结构。也就是说,脚本会被提早到整个页面都解析结束后再运行。
defer 属性只实用于内部脚本文件
2.1.3 异步脚本
- async
标记为 async 的脚本并不保障依照指定它们的先后顺序执行
2.1.4 在XHTML中的用法
可扩大超文本标记语言,即 XHTML(Extensible HyperText Markup Language),是将 HTML 作为 XML 的利用而从新定义的一个规范。编写 XHTML 代码的规定要比编写 HTML 严格得多,而且间接影 响是否在嵌入 JavaScript 代码时应用<script/>标签。
防止在XHTML中呈现语法错误
- 一是用相应的 HTML 实体(<)替换代码中所有的小于号(<),替换后的代码相似如下所示
- 保障让雷同代码在 XHTML 中失常运行的第二个办法,就是用一个 CData 片段来蕴含 JavaScript 代 码。
第三章 基本概念
3.1 辨别大小写
3.1.4 严格模式
“use strict”
严格模式是为 JavaScript 定义了一种不同的 解析与执行模型。在严格模式下,ECMAScript 3 中的一些不确定的行为将失去解决,而且对某些不平安 的操作也会抛出谬误。
3.1.5 语句
ECMAScript 中的语句以一个分号结尾;
3.2 关键字和保留字
breakcasecatchcontinuedebugger*defaultdeletedo instanceofelse newfinally returnfor switchfunction thisif throwin trytypeofvarvoidwhilewith
3.3 变量
ECMAScript 的变量是涣散类型的,所谓涣散类型就是能够用来保留任何类型的数据。换句话说, 每个变量仅仅是一个用于保留值的占位符而已。定义变量时要应用 var 操作符(留神 var 是一个要害 字),后跟变量名(即一个标识符),如下所示:
var message;
有一点必须留神,即用 var 操作符定义的变量将成为定义该变量的作用域中的局部变量。也就是说, 如果在函数中应用 var 定义一个变量,那么这个变量在函数退出后就会被销毁
尽管省略 var 操作符能够定义全局变量,但这也不是咱们举荐的做法。因为在局 部作用域中定义的全局变量很难保护,而且如果无意地疏忽了 var 操作符,也会因为 相应变量不会马上就有定义而导致不必要的凌乱。给未经申明的变量赋值在严格模式 下会导致抛出 ReferenceError 谬误。
3.4 数据类型
- undefined
- null
- boolean
- number
- string
- object
3.4.1 typeof操作符
3.4.2 undefines 类型
在应用 var 申明变量但未对其加以初始化时,这个变量的值就是undefined
3.4.3 null类型
如果定义的变量筹备在未来用于保留对象,那么最好将该变量初始化为 null 而不是其余值
实际上,undefined 值是派生自 null 值的,因而 ECMA-262 规定对它们的相等性测试要返回 true: alert(null == undefined); //true
3.4.3 Boolean
3.4.5 Number
用 e 表示法 示意的数值等于 e 后面的数值乘以 10 的指数次幂。ECMAScript 中 e 表示法的格局也是如此,即后面是 一个数值(能够是整数也能够是浮点数),两头是一个大写或小写的字母 E,前面是 10 的幂中的指数, 该幂值将用来与后面的数相乘。上面是一个应用 e 表示法示意数值的例子:
var floatNum = 3.125e7; // 等于31250000
ECMAScript 可能示意的最小数值保 存在 Number.MIN_VALUE 中——在大多数浏览器中,这个值是 5e-324;可能示意的最大数值保留在 Number.MAX_VALUE 中
任何波及 NaN 的操作(例如 NaN/10)都会返回 NaN,这 个特点在多步计算中有可能导致问题。其次,NaN 与任何值都不相等,包含 NaN 自身。
为了打消在应用 parseInt()函数时可能导致的上述困惑,能够为这个函数提供第二个参数:转换 时应用的基数(即多少进制)。
- parseInt- parseFloat
3.4.6 String类型
String 类型用于示意由零或多个 16 位 Unicode 字符组成的字符序列,即字符串
3.4.7 Object类型
ECMAScript 中的对象其实就是一组数据和性能的汇合。对象能够通过执行 new 操作符后跟要创立 的对象类型的名称来创立。而创立 Object 类型的实例并为其增加属性和(或)办法,就能够创立自定 义对象,如下所示:
- constructor:保留着用于创立以后对象的函数
- hasOwnProperty(propertyName): 用于查看给定的属性在以后对象实例中是否存在
- isPrototypeOf(Object) 用于查看传图对象是否是以后对象的原型
- propertyIsEnumerable(propertyName)用于查看给定的属性是否可能for-in
因为在 ECMAScript 中 Object 是所有对象的根底,因而所有对象都具备这些根本的属性和办法。
3.5 操作符
相等和不相等——先转换再比拟,全等和不全等——仅比拟而不转换。
ECMAScript 中的相等操作符由两个等于号(==)示意。
除了在比拟之前不转换操作数之外,全等和不全等操作符与相等和不相等操作符没有什么区别。
3.6 语句
3.6.5 for-in 语句
for(property in expression) statementfor(var propertyName in window){ document.write(propertyName);}
ECMAScript 对象的属性没有程序。因而,通过 for-in 循环输入的属性名的程序是不可预测的
3.6.6 label语句
应用 label 语句能够在代码中增加标签,以便未来应用。以下是 label 语句的语法
3.6.8 with
with 语句的作用是将代码的作用域设置到一个特定的对象中。with 语句的语法如下
with (expression) statement;
var qs = location.search.substring(1);var hostName = location.hostname;var url = location.href;with(location){ var qs = search.substring(1); var hostName = hostname; var url = href;}在这个重写后的例子中,应用 with 语句关联了 location 对象。这意味着在 with 语句的代码块 外部,每个变量首先被认为是一个局部变量,而如果在部分环境中找不到该变量的定义,就会查问 location 对象中是否有同名的属性。如果发现了同名属性,则以 location 对象属性的值作为变量的值。
3.7 函数
ECMAScript 中的函数应用 function 关键字来申明,后跟一组参数以及函数体。
3.7.1 了解参数
ECMAScript函数的参数与大多数其余语言中函数的参数有所不同。ECMAScript函数不介意传递进 来多少个参数,也不在乎传进来参数是什么数据类型。也就是说,即使你定义的函数只接管两个参数, 在调用这个函数时也未必肯定要传递两个参数。
起因是 ECMAScript 中的参数在外部是用一个数组来示意的。函数接管 到的始终都是这个数组,而不关怀数组中蕴含哪些参数(如果有参数的话)。如果这个数组中不蕴含任 何元素,无所谓;如果蕴含多个元素,也没有问题。实际上,在函数体内能够通过 arguments 对象来 拜访这个参数数组,从而获取传递给函数的每一个参数
arguments 对象只是与数组相似(它并不是 Array 的实例),因为能够应用方括号语法访 问它的每一个元素(即第一个元素是 arguments[0],第二个元素是 arguments[1],以此类推)
命名的参数只提供便当,但不是必须的。另 外,在命名参数方面,其余语言可能须要当时创立一个函数签名,而未来的调用必须与该签名统一。但 在 ECMAScript 中,没有这些条条框框,解析器不会验证命名参数。
通过拜访 arguments 对象的 length 属性能够获知有多少个参数传递给了函数。
明明参数只是为了提供便当
对于 arguments 的行为,还有一点比拟有意思。那就是它的值永远与对应命名参数的值放弃同步
function doAdd(num1, num2) { arguments[1] = 10; alert(arguments[0] + num2);}每次执行, 会讲第二个参数批改为10, 因为arguments对象中的值会主动反映到对应的命名参数,所以批改arguments[1],也就批改了num2他并不是说读取这两个值会拜访雷同的内存空间,他们的内存空间是独立的,然而他们的值会同步
没有传递值的命名参数将主动被赋予 undefined 值
ECMAScript 中的所有参数传递的都是值,不可能通过援用传递参数
3.7.2 没有重载
ECMAScript 函数不能像传统意义上那样实现重载。而在其余语言(如 Java)中,能够为一个函数 编写两个定义,只有这两个定义的签名(承受的参数的类型和数量)不同即可。
如果在 ECMAScript 中定义了两个名字雷同的函数,则该名字只属于后定义的函数。