JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。
script元素
-
script
定义了下列 6 个属性:
defer
:可选。表示脚本可以延迟到文档完全被解析和显示之后再执行。只对外部脚本文件有效。IE7 及更早版本对嵌入脚本也支持这个属性。async
:可选。表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本。只对外部脚本文件有效。script type=”text/javascript” async src=”example1.js” script 。但与 defer不同的是,标记为 async 的脚本并不保证按照指定它们的先后顺序执行。charset
:可选。很少有人用。language
:已废弃。src
:可选。表示包含要执行代码的外部文件。type
:可选。不过,这个属性并不是必需的,如果没有指定这个属性,则其默认值仍为text/javascript。 -
注意事项
无论如何包含代码,只要不存在 defer 和 async 属性,浏览器都会按照script元素在页面中出现的先后顺序对它们依次进行解析。换句话说,在第一个script元素包含的代码解析完成后,第二个script包含的代码才会被解析,然后才是第三个、第四个……
现代 Web 应用程序一般都把全部 JavaScript 引用放在
<body>
元素中页面内容的后面。 -
在XHTML中的用法
这里比较语句 a < b 中的小于号(<)在 XHTML 中将被当作开始一个新标签来解析。
解决方案:
1) 用相应的 HTML 实体(<)替换代码中所有的小于号(<);
2) 在 XHTML(XML)中,CData 片段是文档中的一个特殊区域,这个区域中可以包含不需要解析的任意格式的文本内容;
<![CDATA[
...
]]>
-
嵌入代码与外部文件
最好的做法还是尽可能使用外部文件来包含 JavaScript 代码(可维护性、可缓存、适应未来);
-
小结
把 JavaScript 插入到 HTML 页面中要使用script元素。使用这个元素可以把 JavaScript 嵌入到HTML 页面中,让脚本与标记混合在一起;也可以包含外部的 JavaScript 文件。而我们需要注意的地方有:
在包含外部 JavaScript 文件时,必须将 src 属性设置为指向相应文件的 URL。而这个文件既可以是与包含它的页面位于同一个服务器上的文件,也可以是其他任何域中的文件。
所有script元素都会按照它们在页面中出现的先后顺序依次被解析。在不使用 defer 和async 属性的情况下,只有在解析完前面script元素中的代码之后,才会开始解析后面script元素中的代码。
由于浏览器会先解析完不使用 defer 属性的script元素中的代码,然后再解析后面的内容,所以一般应该把script元素放在页面最后,即主要内容后面,</body>标签前面。
使用 defer 属性可以让脚本在文档完全呈现之后再执行。延迟脚本总是按照指定它们的顺序执行。
使用 async 属性可以表示当前脚本不必等待其他脚本,也不必阻塞文档呈现。不能保证异步脚本按照它们在页面中出现的顺序执行。
另外,使用<noscript元素可以指定在不支持脚本的浏览器中显示的替代内容。但在启用了脚本的情况下,浏览器不会显示<noscript元素中的任何内容。
基本概念
-
数据类型
ECMAScript 中有 5 种简单数据类型: Undefined、Null、Boolean、Number和 String。
还有 1种复杂数据类型——Object,Object 本质上是由一组无序的名值对组成的。
-
typeof操作符
1) “undefined”——如果这个值未定义
Undefined 类型只有一个值,即特殊的 undefined。在使用 var 声明变量但未对其加以初始化时,这个变量的值就是 undefined;实际上,undefined 值是派生自 null 值的,因此 ECMA-262 规定对它们的相等性测试要返回 true: alert(null == undefined); //true
2) “boolean”——如果这个值是布尔值;
3) “string”——如果这个值是字符串;
4) “number”——如果这个值是数值
NaN
,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。NaN 与任何值都不相等,包括 NaN 本身。alert(isNaN(NaN)); //true
alert(isNaN(10)); //false(10 是一个数值)
alert(isNaN(“10”)); //false(可以被转换成数值 10)
alert(isNaN(“blue”)); //true(不能转换成数值)
alert(isNaN(true)); //false(可以被转换成数值 1)
5) “object”——如果这个值是对象或 null
Null 类型是第二个只有一个值的数据类型,这个特殊的值是 null。从逻辑角度来看,null 值表示一个空对象指针,而这也正是使用 typeof 操作符检测 null 值时会返回”object”的原因;
6) “function”——如果这个值是函数。
-
数值转换
有 3 个函数可以把非数值转换为数值:Number()、parseInt()和 parseFloat()。
Number()函数的转换规则如下。
如果是 Boolean 值,true 和 false 将分别被转换为 1 和 0。
如果是数字值,只是简单的传入和返回。
如果是 null 值,返回 0。
如果是 undefined,返回 NaN。
如果是字符串,遵循下列规则:
如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即”1”会变成 1,”123”会变成 123,而”011”会变成 11(注意:前导的零被忽略了);
如果字符串中包含有效的浮点格式,如”1.1”,则将其转换为对应的浮点数值(同样,也会忽略前导零);
如果字符串中包含有效的十六进制格式,例如”0xf”,则将其转换为相同大小的十进制整数值;
如果字符串是空的(不包含任何字符),则将其转换为 0;
如果字符串中包含除上述格式之外的字符,则将其转换为 NaN。
如果是对象,则调用对象的 valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的 toString()方法,然后再次依照前面的规则转换返回的字符串值
var num1 = Number(“Hello world!”); //NaN
var num2 = Number(“”); //0
var num3 = Number(“000011”); //11
var num4 = Number(true); //1
parseInt规则:
第一个字符不是数字字符或者负号,parseInt()就会返回 NaN;
例如,”1234blue”会被转换为 1234,因为”blue”会被完全忽略。类似地,”22.5”,会被转换为 22,因为小数点并不是有效的数字字符。
String类型:
字符串可以由双引号(”)或单引号(’)表示,因此下面两种字符串的写法都是有效的:
\n
换行\t
制表\b
空格\r
回车\f
进纸\\
斜杠\'
单引号(’),在用单引号表示的字符串中使用。例如:’He said, 'hey.'’\"
双引号(”),在用双引号表示的字符串中使用。例如:”He said, "hey."”\xnn
以十六进制代码nn表示的一个字符(其中n为0~F)。例如,\x41表示”A”\unnnn
以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如,\u03a3表示希腊字符Σ如果值有 toString()方法,则调用该方法(没有参数)并返回相应的结果;
如果值是 null,则返回”null”;
如果值是 undefined,则返回”undefined”。
Object类型:
var o = new Object();
Object 的每个实例都具有下列属性和方法:
hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。如:o.hasOwnProperty(“name”)
propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用 for-in 语句(本章后面将会讨论)来枚举。与 hasOwnProperty()方法一样,作为参数的属性名必须以字符串形式指定。
toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
toString():返回对象的字符串表示。
valueOf():返回对象的字符串、数值或布尔值表示。通常与 toString()方法的返回值相同。
-
语句
for-in 语句是一种精准的迭代语句,可以用来枚举对象的属性。以下是 for-in 语句的语法:
for (var propName in window) { document.write(propName); }
-
函数
推荐的做法是要么让函数始终都返回一个值,要么永远都不要返回值。否则,如果函数有时候返回值,有时候有不返回值,会给调试代码带来不便。
函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。也就是说,即便你定义的函数只接收两个参数,在调用这个函数时也未必一定要传递两个参数。可以传递一个、三个甚至不传递参数,而解析器永远不会有什么怨言。
函数不能像传统意义上那样实现重载。