2.1 <script>
元素
- 该元素是双标签, 在HTML中不能省略结束标签
- 如果使用src引入外部js文件, 则标签内的js代码会被忽略
3.4 数据类型
3.4.2 undefined
类型
- 使用var声明变量但未初始化时, 这个变量的值是
undefined
这与尚未定义的变量不同
var a;
// undefined
console.log(a);
// Uncaught ReferenceError: b is not defined 报错
console.log(b)
- 可以使用
typeof
检测未定义的变量, 他将返回undefined
var a;
// undefined
console.log(typeof(a));
// undefined
console.log(typeof(b));
3.4.3 null 类型
- null 表示空对象指针
// object
console.log(typeof(null));
undefined
的值派生自null
, 所以ECMAScript规范规定他们相等
// true
console.log(undefined == null);
3.4.4 Boolean
类型
可以对任何数据类型的值调用转型函数Boolean()
,而且总会返回一个Boolean
值
- 转型函数
Boolean()
会在if
语句中对非数值隐式调用
3.4.5 Number
类型
数值字面量, 一般为十进制, 但也有八进制和十六进制
- 八进制
0开头是八进制, 后面必须是0-7, 超过7的前导0被忽略, 并当做10进制数处理
// 57
console.log(071);
// 79
console.log(079);
- 16进制
0x
开头, 后跟0-9,A-F. 字符可大写也可以小写
// 31
console.log(0x1F);
注意: 在进行算数运算时, 结果都会转为十进制数
// 31 + 57 = 88 console.log(0x1F + 071);
1. 浮点数值
浮点数所占内存是整数的两倍, 所以ECMAScript会适当的将浮点数转为整数
// 1
console.log(1.)
// 10
console.log(10.0)
2. 数值范围
- 最小数值 & 最大数值
// 5e-324
console.log(Number.MIN_VALUE);
// 1.7976931348623157e+308
console.log(Number.MAX_VALUE);
Infinity
&-Infinity
// number
typeof Infinity
// -Infinity
console.log(-1.7976931348623157e+309);
// Infinity 超出最大值
console.log(1.7976931348623157e+309);
isFinity()
判断数值是否在最小值与最大值之间
// true
console.log(isFinite(1))
3. NaN
// number
console.log(typeof(NaN))
表示本来要返回数值的情况结果未返回数值, 避免报错. 其他语言中, 任何数值除以非数值会导致错误, 导致程序停止运行. 在ECMAScript中, 任何数值除以非数值返回NaN, 不影响其他代码运行.
NaN
的特点- 任何涉及
NaN
的操作都会返回NaN
:NaN/10
NaN
与任何值都不相等, 包括NaN本身
- 任何涉及
isNaN()
判断参数是否不是数值
对非数值尝试将转为数值
// true
console.log(isNaN(NaN))
// true
console.log(isNaN(" 0"))
// false true可以转为1
console.log(isNaN(true))
注意:
isNaN()
也适用于对象, 先调对象的valueOf()
, 将返回值转为数值, 不成功, 再调用对象toString()
方法, 再测返回值.
4. 数值转换
Number
可以用于任何数值
parseInt()
用于字符串
- 忽略字符串前的空格
- 如果第一个字符不是数字字符或者负号,
parseInt()
就会返回NaN
;也就是说,用parseInt()
转换空字符串会返回NaN
(Number()
对空字符返回 0)。如果第一个字符是数字字符,parseInt()
会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。例如,"1234blue"会被转换为 1234, 为"blue"会被完全忽略。类似地,"22.5"会被转换为 22,因为小数点并不是有效的数字字符。 - 对于不同进制的字面量可以传入第二个参数
var num1 = parseInt("10", 2); //2 (按二进制解析)
var num2 = parseInt("10", 8); //8 (按八进制解析)
var num3 = parseInt("10", 10); //10 (按十进制解析)
var num4 = parseInt("10", 16); //16 (按十六进制解析)
parsFloat()
用于字符串
- 第一个小数点有效
- 16进制字符串转为0
- 只解析10进制数, 没有第二个参数指定基数
var num1 = parseFloat("1234blue"); //1234 (整数)
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5
var num4 = parseFloat("22.34.5"); //22.34
var num5 = parseFloat("0908.5"); //908.5
4.5.6 string
类型
单引号和双引号完全相同
1. 字符字面量
2. 字符串的特性
字符串不可变
3. 转换字符串
toString()
- 数值, 布尔值, 对象和字符串可以直接调用toString(), null和undefined没有这个方法.
- 方法通常没有参数, 对于数值可以指定参数, 进制基数
var num = 10;
alert(num.toString()); // "10"
alert(num.toString(2)); // "1010"
alert(num.toString(8)); // "12"
alert(num.toString(10)); // "10"
alert(num.toString(16)); // "a"
- 转型函数:
String()
3.4.7Object
类型
共有的属性和方法
3.5 操作符
3.5.1 一元操作符
1. 递增递减操作符
2. 一元加减操作符 (+/-)
- 对于数值就是正负.
- 在对非数值应用一元加操作符时,该操作符会像
Number()
转型函数一样对这个值执行转换。换句话说,布尔值false
和true
将被转换为 0 和 1,字符串值会被按照一组特殊的规则进行解析,而对象是先调用它们的valueOf()
和(或)toString()
方法,再转换得到的值。
3.5.2 位操作符
ECMAScript 中的所有数值都以 IEEE-754 64 位格式存储,但位操作符并不直接操作 64 位的值。而是先将 64 位的值转换成 32 位的整数,然后执行操作,最后再将结果转换回 64 位。对于开发人员来说,由于 64 位存储格式是透明的,因此整个过程就像是只存在 32 位的整数一样。
- 正数以纯二进制格式存储
- 负数同样以二进制码存储,但使用的格式是二进制补码。计算一个数值的二进制补码,需要经过下列 3 个步骤:
- 在 ECMAScript 中,当对数值应用位操作符时,在对特殊的
NaN
和Infinity
值应用位操作时,这两个值都会被当成 0 来处理。如果对非数值应用位操作符,会先使用Number()
函数将该值转换为一个数值(自动完成),然后再应用位操作。得到的结果将是一个数值。
1. 按位非(NOT)
- 按位非操作符由一个波浪线(~)表示,执行按位非的结果就是返回数值的反码。
var num1 = 25; // 二进制 00000000000000000000000000011001
var num2 = ~num1; // 二进制 11111111111111111111111111100110
alert(num2); // -26
这里,对 25 执行按位非操作,结果得到了-26。这也验证了按位非操作的本质:操作数的负值减 1。
2. 按位与(AND)
3. 按位或(OR)
4. 按位异或(XOR)
5. 左移(<<)
6. 有符号的右移(>>)
7. 无符号右移(>>>)
3.5.3 布尔操作符
1. 逻辑非
2. 逻辑与
3. 逻辑或
我们可以利用逻辑或的这一行为来避免为变量赋 null 或 undefined 值。例如:
var myObject = preferredObject || backupObject;
在这个例子中,变量 myObject 将被赋予等号后面两个值中的一个。变量 preferredObject 中包含优先赋给变量 myObject 的值,变量 backupObject 负责在 preferredObject 中不包含有效值的情况下提供后备值。如果 preferredObject 的值不是 null,那么它的值将被赋给 myObject;如果是 null,则将 backupObject 的值赋给 myObject。ECMAScript 程序的赋值语句经常会使用这种模式。
3.5.4 乘性操作符
1. 乘法
2. 除法
如果有一个操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的规则。
3. 求模
4. 加法
5. 减法
3.5.10 逗号操作符
逗号操作符有一种特殊用法: 可以用来赋值, 他会返回表达式中的最后一项
var num = (1,2,3,4);
// 4
console.log(num)
3.6 语句
3.6.4 for语句
for 语句中的初始化表达式、控制表达式和循环后表达式都是可选的。将这三个表达式全部省略,就会创建一个无限循环,例如:
// 无限循环
for (;;) {
doSomething();
}
而只给出控制表达式实际上就把 for 循环转换成了 while 循环,例如:
var count = 10;
var i = 0;
for (; i < count; ){
alert(i);
i++;
}
3.6.4 for-in语句
枚举对象的属性
3.6.8 with语句
with语句的作用是将代码的作用域设置到一个特定的对象中.with 语句的作用是将代码的作用域设置到一个特定的对象中。with 语句的语法如下:
with (expression) statement;
定义 with 语句的目的主要是为了简化多次编写同一个对象的工作,如下面的例子所示:
var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;
上面几行代码都包含 location 对象。如果使用 with 语句,可以把上面的代码改写成如下所示:
with(location){
var qs = search.substring(1);
var hostName = hostname;
var url = href;
}
3.6.9 switch语句
虽然 ECMAScript 中的 switch语句借鉴自其他语言,但这个语句也有自己的特色。首先,可以在switch 语句中使用任何数据类型(在很多其他语言中只能使用数值),无论是字符串,还是对象都没有问题。其次,每个case的值不一定是常量,可以是变量,甚至是表达式。请看下面这个例子:
switch ("hello world") {
case "hello" + " world":
alert("Greeting was found.");
break;
case "goodbye":
alert("Closing was found.");
break;
default:
alert("Unexpected message was found.");
}
在这个例子中,switch 语句使用的就是字符串。其中,第一种情形实际上是一个对字符串拼接操
作求值的表达式。由于这个字符串拼接表达式的结果与 switch 的参数相等,因此结果就会显示
“Greeting was found.”。而且,使用表达式作为 case 值还可以实现下列操作:
var num = 25;
switch (true) {
case num < 0:
alert("Less than 0.");
break;
case num >= 0 && num <= 10:
alert("Between 0 and 10.");
break;
case num > 10 && num <= 20:
alert("Between 10 and 20.");
break;
default:
alert("More than 20.");
}
这个例子首先在 switch 语句外面声明了变量 num。而之所以给 switch 语句传递表达式 true,是因为每个 case 值都可以返回一个布尔值。这样,每个 case 按照顺序被求值,直到找到匹配的值或者遇到 default 语句为止(这正是这个例子的最终结果)。
3.7 函数
函数以return结尾则返回值为undefined
function test(){
return;
}
// undefined
console.log(test())