您的位置:首页 > Web前端 > JavaScript

《JavaScript高级程序设计》学习笔记(第三章)- 上

2014-11-14 12:39 225 查看
目前为此,ECMAScript第3版还是使用最广的版本,以下的笔记除非特别说明,否则都是以第3版为基础。

语法

ECMAScript大量借鉴了C以及其它类C语言的语法,因此很多都是大同小异的。

区分大小写

在ECMAScript中所有的一切(变量、函数名和操作符)都是大小写敏感的。

标识符

第一个字符必须是一个字母、下划线(_)或美元符号($);

其它字符可以是字母、下划线、美元符号或数字。

虽然也可以用扩展的ASCII与UNICODE字符来作为标识符字母,但是这是不推荐的行为。

与Java一样,ECMAScript的标识符推荐使用驼峰命名法,即第一个字母小写,其余每个单词的首字母大写。如:

firstSecond
myCar
doSomethingImportant

注释

分为单行与多行注释。语法与C++相同:

// This is a single comment

/*
** This is a comment
** This is another comment
** multiline comment
*/

语句

ECMAScript的语句以分号(;)结束,并且可以使用花括号({})将多条语句组合到一个代码块中。

虽然语句结尾的分号是可以忽略的,但是加上分号可以避免很多不必要的错误,因此任何时候都不要省略它。

var sum = a + b; // single statement

// code block
if(test) {
test = false;
alert(test);
}

关键字和保留字

和其它语言一样,ECMAScript也有一组特殊用途的关键字,这些关键字是不能用来当标识符的。同时ECMAScript还有一组保留字,保留字虽然目前在这门语言中还没有任何的用途,但是它们在将来有可能被用作关键字,所以保留字同样不能拿来当标识符。

具体的关键字与保留字列表可搜索,这里就不浪费空间了。

变量

定义一个变量要使用
var
操作符,后跟一个变量名(即标识符),ECMAScript是弱语言类型,也就是说一个变量可以用来保存任何值:

var message = "hi";
message = 100;      // 有效,但不推荐

使用
var
定义的变量会成当前作用域的局部变量,即在函数中定义的变量,在函数退出后就会被销毁:

function test() {
var message = "hi"; // 局部变量
}
test();
alert(message); // 出错!

如果省略了
var
关键字,则这个变量就会变成全局变量。虽然使用这个方法可以在函数中定义全局变量,但是这种方法会导致维护性等问题,所以强烈不建议使用这种方法。

function test() {
message = "hi"; // 全局变量
}
test();
alert(message); // hi

数据类型

使用
typeof
操作符可以用来判断一个变量的数据类型,对一个值使用
typeof
操作符,会返回相应的字符串:

"undefined" —— 未定义

"boolean " —— 布尔类型

"string" —— 字符串类型

"number" —— 数据类型

"object" —— 对象类型或null

"function" —— 函数类型

Undefined类型

undefined类型只有一个值,即
undefined
。使用
var
声明变量但未对其进行初始化的时候,这个变量的值就是
undefined


虽然对包含
undefined
值的变量跟未定义的变量使用
typeof
都会返回
undefined
,但是其实这两种是有本质上的不同:

var message; // 定义变量,但值为undefined
// var age;  // 未定义的变量
typeof message; // 得到"undefined"
typeof age; // 得到"undefined"

一个未定义的变量,唯一能使用的操作符就是
typeof
,除此之后,对它进行任何操作都会出错。

alert(message); // "undefined"
alert(age); // 出错

Null类型

Null类型同样只有一个值,即
null
。Null逻辑是上一个空对象指针,所以对其使用
typeof
操作符会返回
object
。虽然
null
undefined
很相近,但是他们的用途却是大不相同的,无论何时,我们都没有必要把一个变量显式设置为
undefined
,反之,当你声明了一个意在保存对象的变量,却未真正开始保存对象时,我们有必要将其设置为
null


Boolean类型

Boolean类型有两个值:
true
false


虽然Boolean类型只有两个值,但是可以使用
Boolean()
转型函数,将其它类型的值转换为Boolean类型;

Number类型

EcmaScript中的Number类型分为整数跟浮点数。因为保存浮点数需要的内存空间是整数的两倍,所以只要有可以,ECMAScript就会将浮点数转化为整数;

var intNum1 = 5; // 整数
var floatNum1 = 3.14; // 浮点数
var floatNum2 = .14; // 0.14 浮点数
var floatNum3 = 1. // 转化为1
var floatNum4 = 1.0 // 转化为1


因为ECMAScript使用IEEE754来表示浮点数,所以会存在精度问题,这是无法避免的。


数值范围

Number类型数值的范围在
Number.MAX_VALUE
Number.MIN_VALUE
之间,如果计算结果超出这个范围,则结果值会被自己转化为
Infinity
-Infinity


isFinite()
函数可以用来确定一个值是否在Number的数值范围之间。

var result = Number.MAX_VALUE + Number.MAX_VALUE;
alert(isFinite(result)); // false

NaN

NaN(Not a Number)是一个特殊的数值,这个值用来表示一个本来要返回数值的操作数未返回数值的情况。

任何涉及NaN的操作都会返回NaN。同时,NaN与任何值都不相等,包括自己本身。

alert(NaN == NaN); // false

使用
isNaN()
函数可以判断一个值是否为NaN。

alert(isNaN(NaN)); //true
alert(isNaN(10)); //false(10 是一个数值)
alert(isNaN("10")); //false(可以被转换成数值 10)
alert(isNaN("blue")); //true(不能转换成数值)
alert(isNaN(true)); //false(可以被转换成数值 1)

数值转换

有3个函数可以将非数值转换为数值:
Number()
parseInt()
parseFloat()


其中,Number()可用于任何数据类型,后两个则是针对字符串进行转换。因此,Number()的转换规则最为复杂。

Number()函数的转换规则如下:

如果是 Boolean 值, true 和 false 将分别被转换为 1 和 0。

如果是数字值,只是简单的传入和返回。

如果是 null 值,返回 0。

如果是 undefined ,返回 NaN 。

如果是字符串,遵循下列规则:

如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即 "1"会变成 1, "123" 会变成 123,而 "011" 会变成 11(注意:前导的零被忽略了);

如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);

如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;

如果字符串是空的(不包含任何字符),则将其转换为 0;

如果字符串中包含除上述格式之外的字符,则将其转换为 NaN 。

如果是对象,则调用对象的 valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN ,则调用对象的 toString()方法,然后再次依照前面的规则转换返回的字符串值。

典型例子:

var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number(true); //1

因为Number()函数的转换规则过于复杂,因此在处理整数的时候更常用的是
parseInt()
函数。
parseInt()
会忽略字符串的前导空格,如果非空格字符串的第一个字符不是数字字符或者正负号,则返回
NaN
。如果第一个字符是合法的数字字符或者正负号,则会继续向下解析,直到字符串结束,或者遇到非数字字符。同时,
parseInt()
还有第二个参数,可以用来指定要转化数值的进制,加上这个参数可以避免很多错误,所以建议无论何时都加上这个参数。

var num1 = parseInt("1234blue", 10); // 1234
var num2 = parseInt("", 10); // NaN
var num3 = parseInt("070", 8); // 56
var num4 = parseInt("AF", 16); // 175
var num5 = parseInt("AF", 10); // NaN

parseFloat()
的解析规则与
parseInt()
类似,从字符串的第一位开始解析,直到字符串结束,或遇到第一个无效的浮点数字字符为止。也就是说字符串中的第一个小数点是有效的,而第二个开始则是无效的。同时,如果字符串只包含了整数而非浮点数,则
parseFloat()
会将字符串解析为整数。

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
var num6 = parseFloat("3.125e7"); //31250000

String类型

String类型主要用来表示多个字符组成的字符串。ECMAScript中,使用单引号与双引号都可以表示字符串,并且效果没有区别。同时,在ECMAScript中,字符串是不可变的,也就是说一旦字符串被创建,他们的值就无法改变。

转换为字符串

有两种方法可以将其它类型的值转换为字符串,第一种是使用类型各自的toString()方法:

var age = 11;
var ageAsString = age.toString(); // 字符串"11"
var found = true;
var foundAsString = found.toString(); // 字符串"true"

除了
null
undefined
没有这个方法,其他类型中都可以使用这个方法来转换成字符串。同时,针对数值类型的
toString()
方法,可以传递一个参数,用来指定要转换的进制。

第二种是使用
String()
函数进行转换,这个函数可以用于任何类型的数值。如果是有
toString()
方法的数值,则调用
toString()
进行转换。如果是
null
undefined
,则返回相应的"null"或"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"

Object类型

Object类型是ECMAScript中比较复杂的类型,涉及到比较多的知识点,这些会在后面的章节中有详细讲解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: