《JavaScript高级程序设计》学习笔记(第三章)- 上
2014-11-14 12:39
225 查看
目前为此,ECMAScript第3版还是使用最广的版本,以下的笔记除非特别说明,否则都是以第3版为基础。
其它字符可以是字母、下划线、美元符号或数字。
虽然也可以用扩展的ASCII与UNICODE字符来作为标识符字母,但是这是不推荐的行为。
与Java一样,ECMAScript的标识符推荐使用驼峰命名法,即第一个字母小写,其余每个单词的首字母大写。如:
虽然语句结尾的分号是可以忽略的,但是加上分号可以避免很多不必要的错误,因此任何时候都不要省略它。
具体的关键字与保留字列表可搜索,这里就不浪费空间了。
使用
如果省略了
"undefined" —— 未定义
"boolean " —— 布尔类型
"string" —— 字符串类型
"number" —— 数据类型
"object" —— 对象类型或null
"function" —— 函数类型
虽然对包含
一个未定义的变量,唯一能使用的操作符就是
虽然Boolean类型只有两个值,但是可以使用
因为ECMAScript使用IEEE754来表示浮点数,所以会存在精度问题,这是无法避免的。
任何涉及NaN的操作都会返回NaN。同时,NaN与任何值都不相等,包括自己本身。
使用
其中,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()方法,然后再次依照前面的规则转换返回的字符串值。
典型例子:
因为Number()函数的转换规则过于复杂,因此在处理整数的时候更常用的是
除了
第二种是使用
语法
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中比较复杂的类型,涉及到比较多的知识点,这些会在后面的章节中有详细讲解。相关文章推荐
- 《汇编语言》学习笔记 第三章 寄存器(内存访问)
- 《es6标准入门》学习笔记-第三章 变量的解构赋值
- 《Java 学习笔记》 第三章阅读体验
- 《C++ Primer》学习笔记——第三章C++数据类型
- 《android编程权威指南》学习笔记之第三章 日志跟踪理解Activity生命周期
- 《OpenGL超级宝典4》学习笔记——第三章(一)
- 《Win32多线程程序设计》学习笔记 第三章 快跑与等待
- 《Android面试宝典》学习笔记(第三章:组件)
- 《自顶向下法》学习笔记——第三章:运输层
- 《c++ templates》学习笔记(2)——第三章
- 《OpenGL超级宝典4》学习笔记——第三章(二)
- 《c++ primer》学习笔记 第三章 标准库类型(string, vector,bitset)
- 《Android进阶之光》学习笔记——第三章 View体系与自定义View
- 《metasploit渗透测试魔鬼训练营》学习笔记第三章----情报搜集
- 《Oracle Database 11g SQL 开发指南》学习笔记——第三章_使用SQL*PLUS
- 《Mongodb权威指南》学习笔记 第三章 创建、更新及删除文档(一)
- LuceneInAction(第2版)学习笔记——第三章 为应用程序添加搜索功能
- 《μCOS-III源码分析笔记》学习笔记|2|第三章时间管理
- 《Mongodb权威指南》学习笔记 第三章 创建、更新及删除文档(二)
- 《计算机系统要素》学习笔记:第三章时序逻辑