第三章:基本概念
本章内容:
- 语法
- 数据类型
- 流程控制语句
- 函数
3.1 语法
3.1.1 区别大小写
ECMAScript的一切都区分大小写。
3.1.2 标识符
所谓标识符
,就是指变量、函数、属性的名字。标识符可以按照以下规则组合起来的一个或者多个字符:
- 第一个字母必须是字母、下划线(_)、或一个美元符号($);
- 其他的字母可以是字母、下划线、美元符号或数字;
即:数字不能开头。
3.1.3 注释
// 单行注释
/*
* 这是一个多行注释
*/
3.1.4 严格模式
严格模式是为javascript定义了一种不同的解析和执行模式。在严格模式下ECMAScript3中有一些不确定的行文将得到处理,而且对某些不安全的操作也会抛出错误。在整个代码中启用严格模式,可以顶部添加如下代码:
use strict
3.2 关键字和保留字
ECMAScript把一些标识符拿出来用作自己的关键字啊。因此不能再程序中把这些关键字作为标识符:
关键字:
break | do | instanceof | typeof |
---|---|---|---|
clase | else | new | var |
contiune | for | switch | while |
debugger* | function | this | with |
default | if | throw | |
delete | in | try |
保留字:
class | enum | extends | super |
---|---|---|---|
const | export | import | |
implements | package | public | |
interface | private | static | |
let | protected | yield |
3.4 数据类型
ECMAScript中有5种基本数据类型:Undefined、Null、Boolean、Number和String。
还有一种复杂数据类型Object。Object的本质是由一组无序的名值对组成的。
3.4.1 typeof操作符
由于ECMAScript变量是松散类型的,因此需要一种手段来判断变量的数据类型--typeof
- undefined -- 如果这个值未定义;
- boolean -- 如果这个值是布尔值;
- string -- 如果这个值是字符串;
- number -- 如果这个值是数字;
- object -- 如果这个值是对象或null;
- function -- 如果这个值是函数;
var message = 'some thing';
alert(typeof message); // string
alert(typeof 95); //number
alert(typeof null); //object
因为特殊值null被认为是一种空的对象引用,所以typeof null 会返回object。
typeof运算符并不能正确判断出所有的类型。但对于基本数据类型,typeof具有神奇的功效。
3.4.2 Undifined类型
Undefined类型只是一个值,即特殊的undefined。在使用var声明的变量但没有初始化。那么这个变量的值就是undefined。undefined是定义的全局变量(它和null不一样,它不是关键字),它的值就是“尾的定义。
var message;
// 下面的变量没有声明
// var age;
alert(message == undefined); // true
alert(typeof age); //undefined
3.4.3 Null类型
Null类型是第二个只有一个值的数据类型,这个特殊值是null。从逻辑角度看,null值表示一个空对象指针,而这也是typeof操作符检测null值得时候回返回‘object’的原因。
var car = null;
alert(typeof car); // object
如果定义的变量用来保存对象,那么最好将变量初始化为null。
尽管null和undefined是不同的,但他们都表示“值得空缺”,两者往往可以互换。判断相等运算符==
认为两者是相等的;
alert(null == undefined) // true
3.4.4 Boolean类型
Boolean指代真或假、开或关、是或否。这个类型只有两个值,true和false。
ECMAScript中所有类型的值都有与这两个Boolean值等价的值。
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 非空字符串 | “”(空字符串) |
Number | 任何非零数字 | 0 |
Object | 任何对象 | null |
Undefined | n/a(not applicable不适用) | undefined |
3.4.5 Number类型
Number类型采用了IEEE754格式来表示整数和浮点数值
var intNumber = 55; //整数
var floatNumber = 0.1; //浮点数
注意:
因为采用了IEEE754表示法,这是一种二进制表示法,可以精确到分数比如1/2、8/1、1/1024。但遗憾的是,我们常用的分数都是十进制分数1/10、1/100等。二进制的浮点数不能精确表示类似0.1这种简单数字。
var x = 0.3 - 0.2; //0.09999999999999998
var y = 0.2 - 0.1; // 0.1
alert(x == y); // false
ECMAScript并非独此一家,其他使用这种数值规格的语言也存在这种问题。
解决方案:
1.类库
math.js、decimal.js、big.js
2.浮点运算
toFixed() 方法使用定点表示法来格式化一个数,会对结果进行四舍五入。语法为:
numObj.toFixed(digits); // digits表示小数点后数字的个数;介于 0 到 20 (包括)之间
NaN
NaN,即非数值(Not a Number)是一个特殊的值,这个数值用于表示一个本来要返回一个数值得操作数未返回数值的情况(这样就不会抛出错误)。
NaN本身有两个非同寻常的特点。首先,任何涉及与NaN的操作(NaN/10)都会返回NaN。其次,NaN与任何值都不相等,包括它本身。
alert(NaN == Nan); // false
3.4.6 String类型
String类型是由零或者多个16位Unicode字符串组成的字符序列,即字符串。
ECMAScript中的字符串是不可变的,也就是说,字符串一旦创建,他们的值就无法改变。要改变某个字符串的值,就要先销毁原来的字符串。然后再用另一个包含新值得字符串来填充它。
3.4.7 Object类型
ECMAScript中的对象其实就是一组数据与功能的集合。
var o = new Object();
Object类型是所有它的实例的基础。换句话说,Object类型所具有的任何属性和方法都存在更具体的对象中:
- constructor: 保存着创建当前对象的函数。对于前面的例子,构造函数(constructor)就是Object();
- hasOwnProperty(peopertyName): 用于检测给定的属性在当前的对象实例中(而不是实例的原型上)是否存在。
- isPrototyOf(object): 用于检测传入的对象是否是当前对象的原型。
3.7 函数
函数可以封装多条语句,而且可以在任何地方调用执行。
3.7.1 理解函数参数
ECMAScript中的参数在内部是用一个数组表示的。函数接受到的始终是这个数组,而不关心数组中包含哪些参数。实际上,在函数体里可以通过arguments对象来访问这个参数数组,从而获取传递函数中的每一个参数。
function sayHi(){
console.log('hello :'+arguments[0]+', '+arguments[1]+','+arguments[2]);
}
sayHi('world','123'); // hello :world, 123,undefined
ECMAScript的一个重要特点:命名的参数只是提供便利,但不是必须的。
3.7.2 没有重载
不像其他语言(像Java),可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可。 因为ECMAScript没有签名,所以不能做到真正的重载。
function add(num1, num2){
return num1 + num2;
}
function add(num){
return num + 100;
}
add(200,200); //300
没有重载,后面定义覆盖前面。
小结:
javascript的核心语言特征在ECMA-262中是以名为ECMAScript的伪语言的形式来定义的。ECMAScript中包含了所有的基本语法、操作符、数据类型以及完成基本的计算任务所需要的对象。以下总结了ECMAScript中的基本要素
- ECMAScript中的基本数据类型有:Undefined、Null、Boolean、Number和String;
- 与其他语言不同,ECMAScript没有整数和浮点数值分别定义不同的数据类型,Number类型可用于表示所有数值;
- ECMAScript中有一种复杂的数据类型,即Object类型,该类型是这门语言所有对象的基础;
- 严格模式为这门语言中容易出错的地方增加了限制;
- ECMAScript提供了很多C以及类C语言中相同的基本操作符,包括算术操作符、布尔操作符、关系操作符、相等操作符以及赋值操作符。
- ECMAScript从其他语言中借鉴了很多流程控制语句,例如if、for、switch等。
- ECMAScript的函数与其他语言有诸多不同之处:
- 无需指定函数的返回值,因为任何ECMAScript函数在任何时候都可以返回任何值;
- 实际上,未返回值得函数会返回undefined;
- 没有函数签名的概念,因为函数是以一个包含零个或多个的数组传递的;
- 可以向ECMAScript函数传递任意参数,以arguments对象来访问这些参数;
- 由于不存在函数签名的概念,所以函数无法重载;