ECMA-262通过叫做ECMAScript的“伪语言”为我们描述了所有的基本概念:
- 语法
- 关键字和保留字
- 变量
- 数据类型
- 操作符
- 语句
- 函数
3.1 语法
ECMAScript 的语法大量借鉴了C及其他类C语言(如Java 和 Perl)的语法
3.1.1 区分大小写 ECMAScript中的一切(变量、函数名和操作符)都区分大小写。
3.1.2 标识符
标识符,就是指
变量、函数、属性的名字,或者函数的参数。
标识符可以是按照下列各式规则组合起来的一个或多个字符:
- 第一个字符不能是数字,必须是一个字母、下划线(_)或者一个美元符号($);
- 其他字符可以是字母、下划线、美元符号或数字。
按照惯例,ECMAScript标识符采用
驼峰大小写格式,也就是第一个字母小写,剩下的每个单词的首字母大写。
注:不能把关键字、保留字、true、false 和 null 用作标识符。
特殊:(其实也是惯例)为了区别ECMAScript中的其他函数,
构造函数始终都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头。
(摘自《JavaScript高级程序设计》P145) 例如:
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() {
alert(this.name)
};
}
3.1.3 注释
单行注释以两个斜杠开头:
// 单行注释
多行注释以 /* 开头,以 */ 结尾:
/*
* 这是一个多行(块级)注释
*
*/
3.1.4 严格模式
ECMAScript 5
引入了严格模式(
strict mode
)的概念。
严格模式是为
JavaScript
定义了一种不同的
解析与执行模型。在严格模式下,
ECMAScript 3
中的一些不确定的行为将得到处理,而且对某些不安全
的操作也会抛出错误。
要在整个脚本中启用严格模式,可以在顶部添加如下代码:
"use strict";
这行代码看起来像是字符串,而且也没有赋值给任何变量,但其实它是一个编译指示(
pragma
),
用于告诉支持的
JavaScript
引擎切换到严格模式。这是为不破坏
ECMAScript 3
语法而特意选定的语法。
在函数内部的上方包含这条编译指示,也可以指定函数在严格模式下执行:
function doSomething(){
"use strict";
//函数体
}
支
持严格模式的浏览器包括
IE10+
、
Firefox 4+
、
Safari 5.1+
、
Opera 12+
和
Chrome
。
3.1.5 语句
语句是以一个分号( ; )结尾;任何时候不要省略它。
代码块可以使用花括号({ }) 来把多条语句组合到一个代码块中。
3.2 关键字和保留字
关键字: 可以用来表示控制语句的开始和结束,或者用于执行特定操作。不能用于标识符。
注: 带*上标的是第5版新增的关键字
保留字: 还没有任何特定的用途(囧),但它们可能在将来被用作关键字。
注: let 和 yield 是第5版新增的保留字。
最好不要使用关键字和保留字作为标识符和属性名!
3.3 变量(第四章整章详述)
ECMAScript 的变量是松散类型的,即可以用来保存任何类型的数据。
定义变量是要使用 var 操作符,后跟变量名(即一个标识符)。
例: var message;
另外,可以同时定义多个变量,主要把每个变量用逗号分隔开即可:
var message = "hi",
found = false,
age = 28;
注意:
用 var 操作符定义的变量将成为定义该变量的作用域中的局部变量。也就是说,在函数中使用 var 定义了一个变量,那么这个变量在函数退出后就会被销毁。
例如:
function test () {
var message = "hi"; //局部变量
}
test();
alert(message); //错误
这个例子中如果省略 var ,message将会变成全局变量,就可以在函数外部的任何地方被访问到。
但是由于在局部作用域中定义全局变量很难维护,而且如果有意忽略 var 操作符,也会由于相应变量不会马上有定义而导致不必要的混乱。所以,不推荐这么使用。
3.4 数据类型
5种
基本数据类型 :
Undefined、
Null、
Boolean、
Number 和
String
1种
复杂数据类型 :
Object——本质上是由一组无序的名值对组成的。(第五章详述)
3.4.1 typeof 操作符
作用:用来检测给定变量的数据类型。
对一个值使用 typeof 操作符可能返回下列某个字符串:
- "undefined"——如果这个值未定义
- "boolean"——如果这个值是布尔值
- "string"——如果这个值是字符串
- "number"——如果这个值是数值
- "object"——如果这个值是 对象 或 null(因为特殊值 null 被认为是一个空的对象引用)
- "function"——如果这个值是 函数
3.4.2 Undefined 类型
Undefined 类型只有一个值,即特殊的 undefined。
在使用 var 声明变量,但并未对其加以初始化时,这个变量的值就是 undefined。
不过,包含undefined值的变量和尚未定义的变量还是不一样的。例:
var a; // a 声明后未赋值,默认取得undefined值
// var b; // b 没有声明
alert(a); //"undefined"
alert(b); //产生错误
alert(typeof a);
// "undefined"
alert(typeof b);
// "undefined"
虽然 a 和 b 一个声明,一个未声明,本质上有区别,但实际上无论对哪个变量也不可能执行真正的操作。 typeof操作符都返回undefined。
3.4.3 Null 类型
只有一个值,即特殊的 null 。
从逻辑上讲,null 值表示一个空对象的指针。所以用 typeof 检测 null 值会返回 "object"。如下:
var car = null;
alert(typeof car); //"object"
实际上, undefined 派生自 null 值。 alert(null == undefined); //true
3.4.4 Boolean 类型
该类型只有两个字面值: true 和 false
虽然Boolean类型的字面值只有两个,但 ECMAScript 中所有类型的值都有与这两个 Boolean 值等价的值。
这些转换规则对理解流控制语句自动执行相应的Boolean转换非常重要。
3.4.5 Number 类型
1、浮点数值
——该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。
var floatNum1 = 1.2;
var floatNum1 = 0.2;
var floatNum1 = .2; //有效,但不推荐
对于极大或极小的数值,可以使用科学计数法表示
var floatNum = 3.21e6; //等于3210000;
浮点数的最高精度是17位小数,但在进行算术计算时精确到远远不如整数。会产生
舍入误差。
2、数值范围
ECMAScript能表示的最小数值保存在 Number.MIN_VALUE 中,在大多数浏览器中,这个值是 5e-324
ECMAScript能表示的最大数值保存在 Number.MAX_VALUE 中,在大多数浏览器中,这个值是 1.7976931348623157e+308
超出这两个数值范围,会转换为:
正无穷(Infinity) 负无穷(-Infinity)
用函数
isFinite( )来确定一个数值是不是有穷的(即是不是位于最大值与最小值之间)
3.NaN
——即非数值(Not a Number)
用于表示一个本来要返回数值的操作数未返回数值的情况。
特点:
- 任何涉及NaN的操作(例如 NaN/10)都会返回NaN
- NaN 与任何值都不相等,包括NaN本身。
用
isNaN( )来确定一个参数是否“不是数值”。
alert(isNaN(NaN)); //true
alert(isNaN(10)); //false
alert(isNaN("10")); //false (可以被转换成数值10)
alert(isNaN("blue")); //true (不能被转换成数值)
alert(isNaN(true)); //false (可以被转换成数值1)
4、数值转换
有3个函数可以把非数值转换为数值:
- Number( ) 用于任何数据类型
- parseInt( ) 字符串>>>数值
- parseFloat( ) 字符串>>>数值
转换规则如下:
3.4.6 String 类型
1、字符字面量(转义序列)
这些字符字面量可以出现在字符串中的任意位置,而且也将被作为一个字符来解析,如下面的例子
所示:
var text = "This is the letter sigma: \u03a3.";
这个例子中的变量
text
有
28
个字符,其中
6
个字符长的转义序列表示
1
个字符。
2、转换为字符串
- toString( )
数值、布尔值、对象甚至字符串都有toString( ) 方法。但 null 和 undefined 没有该方法。
- String( )
-
- 如果值有 toString( ) 方法,则优先调用该方法并返回相应结果。
- 如果值是 null ,则返回 "null"
- 如果值是 undefined,则返回 "undefined"
var value1 = 10;
var value2 = true;
var value3 = null;
var value4 ;
alert(String(value1)); // "10"
alert(String(value2)); // "true"
alert(String(value3)); // "null"
alert(String(value4)); // "undefined"
3.4.7 Object 类型
——对象就是一组数据和功能的集合。
可以通过执行 new 操作符后跟要创建的对象类型的名称来创建。
在ECMAScript中,Object类型是所有它的实例的基础。
Objec每个实例都具有下列属性和方法:
- constructor : 保存着用于创建当前对象的函数。
- hasOwnProperty(propertyName) : 用于检查给定的属在当前对象实例中(而不是在实例的原型中)是否存在。
- isPrototypeOf(object) : 用于检查传入的对象是否是当前对象的原型。
- propertyIsEnumerable(properName) : 用于检查给定的属性是否能够使用 for-in 语句来枚举
- toLocaleString( ) : 返回对象的字符创表示,该字符串与执行环境的地区相关
- toString( ) : 返回对象的字符串表示
- valueOf( ) : 返回对象的字符串、数值或布尔值表示。