1.区分大小写
ECMAScript中的一切(变量,函数名和操作符)都区分大小写。这也就意味着,变量名test和变量名Test分别表示两个不同的变量,而函数名不能使用typeof,因为它是一个关键字,但typeOf则完全可以是一个有效的函数名
2.标识符
所谓标识符,就是指变量,函数,属性的名字,或者函数的参数。标识符可以是按照下列格式规则组合起来的一或多个字符:
<!--[if !supportLists]-->a.<!--[endif]-->第一个字符必须是一个字母,下划线(_)或一个美元符号($) ;
<!--[if !supportLists]-->b.<!--[endif]-->其他字符可以是字母,数字,下划线或美元符号($)。
标示符中的字母
3. Number类型
Number类型应该是ECMAScript中最令人关注的数据类型了,这种类型使用IEEE754格式来表示整数和浮点数值(浮点数值在某些语言中也被称为双精度数值)。为支持各种数值类型,ECMA-262定义了不同的数值字面量格式。
在进行算数计算时,所有以八进制和十六进制表示的数值最终都将被转换成十进制数值。
由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机地将浮点数值转换为整数值。
var num1 = 10.0;//此浮点数会转换成整数值来存储
NaN
NaN,即非数值(Not a Number)是一个特殊的数值(可以用alert(typeof NaN ); 返回”number”),这个数值用于表示一个本来应该返回一个数值却未返回一个数值的情况(这样就不会抛出错误了)。Eg:在其他编程语言中,任何数值除以0都会导致错误,从而停止代码执行。但在ECMAScript中任何数值除以0会返回NaN,因此不会影响其他代码的执行。
NaN本身有两个非同寻常的特点。首先,任何涉及NaN的操作(eg:NaN/10)都会返回NaN,这个特点在多步计算中有可能导致问题。其次,NaN与任何值都不相等,包括NaN本身。Eg: alert(NaN == NaN) ; //false
针对NaN的这两个特点,ECMAScript定义了isNaN()函数。这个函数接受一个参数,该参数可以是任何类型,而函数会帮我们定义这个参数是否”不是数值”。IsNaN()在接受到一个值之后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,eg:字符串”10”或Boolean。而任何不能被转换为数值的值都将会导致这个函数返回true。
alert(isNaN(“10”));//false,字符串”10”可以转换成数字10
alert(isNaN(true));//false,Boolean值true可以转换为数值1。Boolean值false可以被转换成0
数值转换
有3个函数可以把非数值转换为数值:Number(), parseInt()和parseFloat()。第一个函数,即转型函数Number()可以用于任何数据类型,而另两个函数则专用于把字符串转换成数值
在使用parseInt()是最好指定基数,这个可以避免ECMAScript 3与ECMAScript 5的分歧。Eg:
在ECMAScript 3中,parseInt(“070”);//56(八进制)
在ECMAScript5中,parseInt(“070”);//0,因为在ECMAScript5 Javascript引擎中,parseInt()已经不具有解析八进制的能力,因此签到
parseFloat()只解析十进制值,因此它没有用第二个参数指定基数的用法。另外,如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是零),parseFloat()会返回整数(整数所需的存储空间是浮点数所需的存储空间的一半),以下是使用parseFloat()转换数值的几个典型示例。
var num1 = parseFloat(“0xA”);//0, 十六进制格式字符串始终被转换成0
var num2 = parseFloat(“0908.5”);//908.5
4. String类型
String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由双引号(“)或单引号(‘)表示,因此下面两个字符串的写法都是有效的:
var firstName = “gaoweigang”;//以双引号开头的字符串必须以双引号结尾
var lastName = ‘gaoweigang’;//以单引号开否的字符串必须以单引号结尾
如果字符串中包含双字节字符,那么length属性可能不会精确地返回字符串中的字符数目。
字符串的特点
ECMAScript中的字符串是不可变,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量,eg:
var lang = “java”;
lang = lang + “script”;
以上示例中的变量lang开始时包含字符串”java”。而第二行代码把lang的值重新定义为”java”与”script”的组合,即”javascript”。实现这个操作的过程如下:首先创建一个能容纳10个字符的新字符串
5. Object类型
ECMAScript中的对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建,而创建Object类型的实例并为其添加属性和方法,就可以创建自定义对象,如下所示:
var o = new Object();
在ECMAScript中,如果不给构造函数传递参数,则可以省略后面的那一对圆括号。Eg:
var o = new Object;//有效,但不推荐省略圆括号
仅仅创建Object的实例并没有什么好处,但关键是要理解一个重要的思想:即在
ECMAScript中(就像Java中的java.lang.Object对象一样),Object类型是所有其他的实例的基础。换句话说,Object类型所具有的任何属性和方法也同样存在于更具体的对象中。
从技术角度讲,ECMA-262中对象的行为不一定适用于JavaScript(ECMA-262只是JavaScript的核心部分,并不是全部)中的其他对象。浏览器环境中的对象,比如BOM和DOM中的对象,都属于宿主对象,因为它们是由宿主实现提供和定义的。ECMA-262不负责定义宿主对象,因此宿主对象可能会也可能不会继承Object
6.函数
return语句也可以不带任何返回值。在这种情况下,函数在停止执行后将返回undefined值。这种用法一般用在需要提前停止函数执行而又不需要返回值的情况下。
ECMAScript函数的参数与大多数其他语言中的函数的参数有所不同。ECMAScript函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。也就是说,即便你定义的函数只接收两个参数,在调用这个函数时也未必一定要传递两个参数。可以传递一个,三个甚至不传递参数,而解析器永远不会有什么怨言。之所以会这样,原因是ECMAScript中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。如果这个数组中不包含任何元素,无所谓;如果包含多个元素,也没有问题。实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。
命名的参数只提供便利,但不是必须的。另外,在命名参数方面,其他语言可能需要事先创建函数签名,而将来的调用必须与该标签名一致。
关于arguments的行为,还有一点比较有意思。那就是它的值永远与对应命名参数的值保持同步,修改arguments的值会影响相应的命名参数的值。但是它们(arguments与命名参数)内存空间是独立的,这种影响是单向的:修改命名参数不会改变arguments中对应的值。
arguments对象的长度是由传入参数个数决定的,不是有定义函数时的命名参数的个数决定的
eg:
function test(num1, num2){
arguments[1] = 20;
alert(num2);//undefined,因为只传递了一个参数
alert(arguments[1]);//20;
}
test(10);//只传一个参数,那么arguments的长度就为1,
注意:ECMAScript中的所有参数传递的都是值,不可能通过引用传递参数。
Problem:
在javaScript中,为什么0.1+0.2 不等于0.3?