第3章 基本概念
1.语法
(1)ECMAScript中的一切(变量、函数名和操作符)都区分大小写。
(2)标志符指变量、函数、属性的名字:第一个字符必须是字母、_或$,其他字符可以是字母、_、$或数字,采用驼峰大小写格式。
(3)顶部添加代码"use strict"; 开启严格模式。
(4)最佳实践是始 终在控制语句中使用代码块——即使代码块中只有一条语句。
2.ECMAScript 的全部关键字:
break | do | instanceof | |
case | else | new | var |
catch | finally | return | void |
continue | for | switch | while |
debugger | function | this | with |
default | if | throw | |
delete | in | try |
第 5 版把在非严格模式下运行时的保留字:
class | enum | extends | super |
const | export | import |
3.ECMAScript的变量是松散型的,可以用来保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符。用var定义的变量成为定义该变量的作用域中的局部变量,在函数退出后会被销毁
4.ECMAScript有5种简单(基本)数据类型:Undefined、Null、Number、Boolean、String,一种复杂数据类型:Object
(1)使用 typeof 操作符检测给定变量的数据类型:
- "undefined"——如果这个值未定义;
- "boolean"——如果这个值是布尔值;
- "string"——如果这个值是字符串;
- "number"——如果这个值是数值;
- "object"——如果这个值是对象或 null;
- "function"——如果这个值是函数。
(2)数据类型
- Undefined 类型:只有一个值,即特殊的 undefined。在使用 var 声明变量但未对其初始化时,这个变量的值就是 undefined。
- Null 类型:只有一个值即特殊的值是 null,undefined 值是派生自 null 值的,因此 ECMA-262 规定对它们的相等性测试要返回 true:alert(null == undefined); //true
- Boolean 类型:只有两个字面值:true 和 false。
- Number 类型:使用 IEEE754 格式来表示 整数和浮点数值。NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。
-
3 个函数可以把非数值转换为数值:Number()、parseInt()和 parseFloat()。
- String类型:示由零或多个 16 位 Unicode 字符组成的字符序列,即字符串。ECMAScript 中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。
- Object类型:一组数据和功能的集合。
5.操作符:用于操作数据值,在应用于对象时,相应的操作符通常都会调用对象的 valueOf() 和(或)toString()方法,以便取得可以操作的值
(1)一元操作符,递增和递减操作符:前置型和后置型。
- 前置型:++n;--n;
-
//变量的值都是在语句被求值以前改变的,前置递增和递减操作与执行语句的优先级相等, var num1 = 2; var num2 = 20; var num3 = --num1 + num2;// 等于 21 var num4 = num1 + num2;// 等于 21
- 后置型:n++;n--;
-
//递增和递减操作在包含它们的语句被求值之后才执行 var num1 = 2; var num2 = 20; var num3 = num1-- + num2; // 等于 22 var num4 = num1 + num2; // 等于 21
-
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
(2)在对非数值应用一元加操作符时,该操作符会像 Number()转型函数一样对这个值执行转换。
var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function() {
return -1;
IncrementDecrementExample04.htm
} };
s1 = +s1; // 值变成数值 1
s2 = +s2; // 值变成数值 1.1
s3 = +s3; // 值变成 NaN
b= +b; // 值变成数值 0
f= +f; // 值未变,仍然是 1.1
o= +o;// 值变成数值-1
(3)位操作符
- 按位非(NOT):由一个波浪线(~)表示,执行按位非的结果就是返回数值的反码。
- 按位与(AND):由一个和号字符(&)表示,只在两个数值的对应位都是 1 时才返回 1,任何一位是 0,结果都是 0。
- 按位或(OR):由一个竖线符号(|)表示,在有一个位是 1 的情况下就返回 1,而只有在两个位都是 0 的情况下才返回 0。
- 按位异或(XOR):由一个插入符号(^)表示,在两个数值对应位上只有一个 1 时才返回 1,如果对 应的两位都是 1 或都是 0,则返回 0。
- 左移:由两个小于号(<<)表示,将数值的所有位向左移动指定的位数。
- 有符号的右移:由两个大于号(>>)表示,将数值向右移动,但保留符号位(即正负号标记)。
- 无符号右移:由 3 个大于号(>>>)表示,将数值的所有 32 位都向右移动。
(4)布尔操作符
- 逻辑非:由一个叹号(!)表示,将它的操作数转换为一个布尔值,然后再 对其求反。
- 逻辑与:由两个和号(&&)表示,属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值,遵守一下规则:
如果第一个操作数是对象,则返回第二个操作数;
如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该对象;
如果两个操作数都是对象,则返回第二个操作数;
如果有一个操作数是 null,则返回 null;
如果有一个操作数是 NaN,则返回 NaN;
如果有一个操作数是 undefined,则返回 undefined。 - 逻辑或:由两个竖线符号(||)表示,也是短路操作符,遵循下 列规则:
如果第一个操作数是对象,则返回第一个操作数;
如果第一个操作数的求值结果为 false,则返回第二个操作数;
如果两个操作数都是对象,则返回第一个操作数;
如果两个操作数都是 null,则返回 null;
如果两个操作数都是 NaN,则返回 NaN;
如果两个操作数都是 undefined,则返回 undefined。
6.语句
(1)if语句:
-
if (condition) statement1 else statement2
(2)do-while语句:一种后测试循环语句,即只有在循环体中的代码执行之后,才会测试出口条件,循环体内的代码至少会被执行一次。
-
do { statement } while (expression);
(3)while语句:前测试循环语句,有可能永远不会被执行。
-
while(expression) statement
(4)for语句:前测试循环语句,由于 ECMAScript 中不存在块级作用域,因此在循环内部定义的变量也可以在外部访问到。
-
for (initialization; expression; post-loop-expression) statement
(5)for-in语句:一种精准的迭代语句,可以用来枚举对象的属性。ECMAScript 对象的属性没有顺序。因此,通过 for-in 循环输出的属性名的顺序是不可预测的。
-
for (property in expression) statement
(6)label语句:在代码中添加标签,可以在将来由 break 或 continue 语句引用。
-
label: statement
(7)break和continue语句:用于在循环中精确地控制代码的执行。其中,break 语句会立即退出循环, 强制继续执行循环后面的语句。而 continue 语句虽然也是立即退出循环,但退出循环后会从循环的顶 部继续执行。
(8)with语句:将代码的作用域设置到一个特定的对象中,为了简化多次编写同一个对象的工作。
-
with (expression) statement;
(9)switch语句:每个 case 的值不一定是常量,可以是变量,甚至是表达式,在比较值时使用的是全等操作符,因此不会发生类型转换。
-
switch (expression) { case value: statement break; case value: statement break; case value: statement break; default: statement }
7.函数
(1)ECMAScript 中的函数在定义时不必指定是否返回值。
(2)任何函数在任何时候都可以通过 return 语句后跟要返回的值来实现返回值,位于 return 语句之后的任何代码都永远不会执行。
(3)ECMAScript函数不介意传递进 来多少个参数,也不在乎传进来参数是什么数据类型,因为ECMAScript 中的参数在内部是用一个数组来表示的。在函数体内可以通过 arguments 对象来 访问这个参数数组,从而获取传递给函数的每一个参数。
(4)所有参数传递的都是值,不可能通过引用传递参数。
(5)ECMAScript 函数没有重载,定义了两个名字相同的函数,则该名字只属于后定义的函数。