第一章
defer属性的作用
<script type="text/javascript" defer="defer" src="xxx.js"><script>
相当于告诉浏览器立即下载,但延迟执行
async属性的作用
与defer类似,只是标记为async的脚本不保证按照指定它们的先后顺序执行
</script>字符串问题
在使用<script>嵌入JavaScript代码时,记住不要在代码中的任何地方出现"</script>"字符串。例如下面一个错误:
<script type="text/javascript">
function sayScript() {
alert("</script>");
}
src属性
需要注意的是,带有src属性的<script>元素如果包含了嵌入的代码,则只会下载并执行脚本文件,潜入的代码会被忽略,比如:
<script src="xxx.js" type="text/javascript">
alert("hello") // 这句不会被执行
</script>
数据类型
ECMAScript中规定了五种简单数据类型(基本数据类型)和一种复杂数据类型:
- 简单数据类型
- Undefined
- Null
- Boolean
- Number
- String
- 复杂数据类型
- Object
typeof操作
typeof是一个操作符而不是函数,但也可以加圆括号使用
var message = "something"
alert(typeof message); // "string"
alert(typeof(message)); // "string"
alert(typeof 95); // "number
typeof返回的可能值有:
- "number"
- "string"
- "boolean"
- "undefined"
- "object" (null也返回"object")
- "function" (从技术角度讲,函数在ECMAScript中是对象,然而由于特殊性,因此通过typeof来区分函数和其他对象是有必要的)
对尚未初始化的变量和未声明的变量执行typeof操作都会返回undefined:
var message;
// 下面这个变量并未声明
// var age
alert(typeof message); // "undefined"
alert(typeof age); // "undefined"
对尚未声明的变量,只能执行一项操作,即typeof,其他操作将导致报错。
undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true(两个等号):
alert(null == undefined); // true
如果用三个等号则返回false:
alert(null === undefined); // false
数据的Boolean值
数据类型 | true | false |
---|---|---|
String | 任何非空字符串 | ""(空字符串) |
Number | 任何非零数值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | undefined |
ECMAScript中所有类型的值都有与Boolean值等价的值
Number
八进制用前置0代表,十六进制用前置0x代表,如果前置了0,但是数值超过八进制,则前置0被忽略,最终按十进制表示。
var n1 = 070; // 八进制的56
var n2 = 079; // 无效的八进制数值--解析为79
var n3 = 0x1f; // 十六进制的31,可大写,也可小写
由于浮点数值需要的内存空间是整数的两倍,因此ECMAScript会不失时机地将浮点数值转化为整数值。
var floatNum1 = 1.; // 小数点后面没有数字,解析为1
var floatNum2 = 10.0; // 整数,解析为10
永远不要测试某个特定的浮点数值。
if (a + b == 0.3) { // 不要做这样的测试!
alert("you got 0.3");
}
任何数除以0将得到NaN,任何涉及NaN地操作都会返回NaN,NaN与任何值都不想等,包括NaN本身。
isNaN()方法可以用来检测是否是NaN,isNaN()在接收到一个值之后,会尝试将这个值转换为数值,某些不是数值的值会直接转换为数值,例如字符串“10”或Boolean值:
alert(isNaN(NaN)); // true
alert(isNaN(10)); // false
alert(isNaN("10")); // false (可以被转换为数值10)
alert(isNaN("blue")); // true
alert(isNaN(true)); // false(可以被转换为数值1)
尽管有点不可思议,但isNaN确实也适用于对象。在基于对象调用isNaN()时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换为数值,如果不能,则基于这个返回值再调用toString()方法,再测试返回值。
Object
Object的每个实例都具有下列属性和方法
- Constructor 构造函数
- hasOwnProperty(propertyName): 用于检查给定的属性在当前实例中(而不是在实例原型中)是否存在。其中,作为参数的属性名必须以字符串形式指定。
- isPrototypeOf(object)
- propertyIsEnumerable
- toLocalString()
- toString()
- valueOf()
一元操作符
var s1 = "2";
var s2 = "z";
var b = false;
var f = 1. 1;
var o = {
valueOf: function() { return -1; }
};
s1++; // 值 变成 数值 3
s2++; // 值 变成 NaN
b++; // 值 变成 数值 1
f--; // 值 变成 0. 10000000000000009( 由于 浮点 舍入 错误 所致)
o--; // 值 变成 数值- 2
一元+操作符加在变量前面,等同于Number()操作。
var s1 = "2";
var s2 = "z";
var b = false;
var f = 1. 1;
var o = {
valueOf: function() { return -1; }
};
s1++; // 值 变成 数值 3
s2++; // 值 变成 NaN
b++; // 值 变成 数值 1
f--; // 值 变成 0. 10000000000000009( 由于 浮点 舍入 错误 所致)
o--; // 值 变成 数值- 2
o = +o; // 值变成-1