3.1.2 标识符
第一个字符必须是字母,下划线(_),或者一个美元符号($);
其他字符可以是字母,下划线,或数字。
ECMAScript标识符采用驼峰大小写的格式。
3.3 变量
ECMAScript的变量是松散类型的,所谓松散类型就是指可以存放任何数据类型的数据。
注意:使用var操作符定义的变量将成为定义该变量的作用域中的局部变量。也就是说如果在函数中使用var定义一个变量,那么这个变量在函数退出后将会被销毁。
例如:
function test () {
// 局部变量
var message = "hi";
}
test ();
// 出现错误 由于使用 var 定义当函数被调用时,就会创建该变量并为其赋值。在此之后,这个变量就会立即被销毁。
alert (message);
但是省略 var 操作符就会创建一个全局变量
function test () {
message = "hi"
}
test();
alert(message); // hi
这是因为message变成了一个全局变量。调用过一次函数就会有定义,就可以在函数外部的任何地方被访问到。
3.4 数据类型
ECMAScript中有
5种简单数据类型(也称基本数据类型):,null,boolean,number 和 string
1种复杂数据类型 – Object – 实质上是由一组无序的名值对组成的。 ECMAScript不支持任何创建自定义类型的数值。
3.4.1 typeof操作符
typeof是一个操作符而不是一个函数。
typeof操作的操作数可以是变量,也可以是字面量。
3.4.2 Underfined类型
Underfind类型只有一个值,即特殊的underfined。在使用var声明变量而未对其加以初始化时,这个变量的值就是underfined;
var message;
alert(message == underfined); // true
注意:包含underfined值的变量与尚未定义的变量还是不一样的。
// 声明后默认获得了underfined值
var message;
// 但是下面的这个没有声明
var age
alert(message); // underfined
alert(age); // 产生错误
对于未声明过的变量只能执行一项操作,就是使用typeof操作符检测其数据类型。
3.4.3 Null类型
Null类型是第二个只有一个值的数据类型,这个值是null;
null值表示一个空对象指针,而这也是使用typeof操作符检测null会返回"Object"的原因。
var car = null;
alert(typeof car); // Object
实际上:underfined 值 是派生自null 值的。因此他们的相等性测试要返回true;
alert( null == underfined); // true
但值得注意的是:
alert(null === undefined); // false 因为它们是不同类型的值。
3.4.4 Boolean类型
Boolean类型是使用最多的一种类型,该类型只有两个字面值:true 和 false;这两个值与数字值不是一回事;true不一定为1;false不一定为0;
虽然Boolean类型的字面量值只有两个,但ECMAScript中的所有类型的值都有与这两个Boolean值等价的值。要将一个值转换为对应的Boolean值,可以调用转型函数Boolean;
数据类型 转换为true的值 转换为false的值
Boolean true false
String 任何非空字符串 ""(空字符串)
Number 任何非零数字值(包括无穷大) 0和NaN
Object 任何对象 null
Underfined n/a(not applicable不适用) underfined
3.4.5 Number类型
八进制字面值第一位必须是零(0);十六进制字面值的前两位必须是0X;在进行算数计算时,所有的八进制和十六进制的值都会被转换为十进制。
注意:鉴于js中保存数值的方式,可以保存正零(+0) 和 负零(-0);正数和负数被认为相等。
- 浮点数值
由于保存浮点数值需要的 内存空间 是 保存整数值得两倍;因此ECMAScript会不失时机的将浮点数值转换为整数值;
对于那些极大或极小的数值,可以用e表示法(即科学计数法)表示的浮点数值表示。
浮点数值的最最高精度为17位小数,但在进行算数计算时其精度远远不如整数,因此因此永远不要测试某个特定的浮点数值
// 不要做这样的测试 0.1 + 0.2 = 0.30000000000000004
if (a + b == 0.3) {
alert("you get 0.3")
}
// 测试的两个数的和不是 0.3 但如果这两个数是0.05 和 0.25 或者 0.15 和 0.15 都不会有问题
-
数值范围
由于内存的限制,ECMAScript并不能保存世界上的所有值,能表示的最小值保存在Number.MIN_VALUE中,最大值保存在Number.MAX_VALUE中,如果某次计算超过了js的范围,那么这个数值将会自动转换为Infinity值,具体来说,如果这个值是负数,就转换为-Infinity(负无穷)。如果是正数就转换成Infinity(正无穷)
如果想确定一个数是不是位于最小数和·最大数之间,那么可以使用isFinite()函数。这个函数在参数位于最小数和最大数之间会返回true。
注意:如果某次计算返回正或是负Infinity值那么该值将无法参加下一次的计算,因为Infinity是无法参与计算的数值。 -
NaN
NaN,即非数值(Not a Number)是一个特殊的数值,这个数值表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误);
特点:任何涉及NaN的操作(例如:NaN/10)都会返回NaN,这个特点会在多步计算中有可能导致问题。其次NaN与任何值都不相等,包括NaN本身。
alert(NaN == NaN); // false
isNaN函数会判断是否"不是函数";
- 数值转换
有三个函数可以把非数值转换为数值:Number(),parseInt(),parseFloat().
注:number()可以用于任何数据类型 而后两个函数专门用于将字符串转换成数值。
number()函数转换规则:如果是null值,返回0;
如果是 underfined 则返回 NaN。
如果字符串中不包含任何有意义的数值那么就会返回NaN;
parseInt():函数在转换字符串时,更多的是看齐是否符合数值模式。它会忽略字符串前面的空格,直到找到第一个非空字符。
如果第一个字符不是数字字符或者负号,parseInt()会返回NaN,也就是说用parseInt()转换空字符串或返回NaN,(Number()函数会对空字符串返回0)
这个函数存在第二个参数;进行转换时的进制。
parseFloat(): 第一个小数点有效,其次会忽略前导的0;
// 10(十六进制数)
var num = parseInt(0xA);
// 0
var num = parseFloat(0xA);
3.4.6 String类型
String类型表示用于有0个或多个16位的Unicode字符组成的字符序列,即字符串。
-
字符字面量
String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者具有其他用途的字符。
\n 换行 \t 制表 \unnnn 以十六进制代码nnnn表示的一个Unicode字符。
任何字符串的长度都可以通过访问其length属性取得,这个属性返回字符数包括16位字符的数目。如果字符串包含双字节字符,那么length属性可能不会精确地返回字符串中的字符数目; -
字符串的特点
ECMAScript中的字符串是不可变的,也就是说,字符串一旦创建,他们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。 -
转换为字符串
要把一个值转换成字符串有两种方式。第一种是使用几乎每个值都会有的toString()方法.
数值,布尔值,对象和字符串值(每个字符串也有toString方法,该方法返回字符串的一个副本)都有toString()方法,
但是null 和 undefined值没有这个方法。
在数值调用toString()方法时可以传递一个参数:输出数值的进制;默认是以十进制返回数值的字符串表示。
在不知道要转换的值是不是null或undefined的情况下,还可以使用转型函数String(),这个函数能够将任何类型的值转换成字符串。
规则: 如果有toString()方法,则调用该方法返回相应的结果。
如果值是null,返回"null"
如果值是undefined,返回"undefined"
3.4.7 Object类型
ECMAScript中的Object是所有对象的基础。
ECMAScript中的对象就是一组数据和功能的集合。对象可以通过执行new操作符后要跟创建的对象类型的名称来创建。
3.5操作符
3.5.1 一元操作符
1.递增和递减操作符
他们不仅适用于整数,还适用于字符串,布尔值,浮点数值和对象。
在应用一个不包含有效数字字符的字符串时,将变量的值设置为NaN。
3.5.2 位操作符
ECMAScript中所有的数值都是以IEEE-754 64位格式存储,但位操作符并不直接操作64位的值。而是先将64位的值转换成32位的整数,然后执行操作,最后再将结果转换成64位。
在对特殊值NaN 和 Infinity 值进行位操作时,这两个值将会被当做0处理。
如果对非数值应用位操作符,会先使用Number()函数将该值转换为一个数值(自动完成),然后再应用位操作,得到的结果将是一个数值。
3.5.3 布尔操作符
一共有三个:非(NOT),与(AND),或(OR)
-
逻辑非 ( ! )
可以用于ECMAScript中的任何值,无论这个值是什么数据类型,这个操作符都会返回一个布尔值。
逻辑非操作符首先会将其操作数转换成一个布尔值,然后再对其求反。
骚操作:同时使用两个非操作符,会模拟Boolean()转型函数的行为。其中第一个逻辑非操作符会基于无论什么操作数返回一个布尔值,第二个逻辑非操作则对该布尔值求反,于是就得到了这个值真正对应的布尔值。 -
逻辑与 ( && ) 在使用逻辑与操作符时始终要记住他是一个短路操作符。
逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值;
规则: 如果第一个操作数是对象,就返回第二个操作数。
如果第二个操作数是对象,只有在第一个操作数的求值结果为true的情况下才会返回该对象。
如果两个操作数都是对象,则返会第二个操作数。
如果第一个操作数是null,则返回null;
如果第一个操作数是NaN,则返回NaN;
如果第一个操作数是undefined,则返会undefined; -
逻辑或 ( || ) 也是一个短路操作符
可以利用逻辑或的行为避免为变量赋 null 或 undefined 值。
如果有一个值不是布尔值,逻辑或也不一定返回布尔值。
规则: 如果第一个操作数是对象,则返会第一个操作数。
如果第一个操作数的求值结果为false,则返会第二个操作数。
如果两个操作数都是对象,则返回第一个操作数。
如果两个操作数都是null,则返会null;
如果连个操作数都是NaN,返回NaN;
如果两个数都是undefined,返回undefined;
3.5.4 乘性操作符
ECMAScript定义了三个乘性操作符:乘法,除法,求模。
1. 乘法
操作数为非数值情况下会进行自动类型的转化。如果某个操作数不是数值,后台会使用Number()转型函数对其转型为数值。空字符串被转换成0,布尔值true为1;
规则: 如果乘积超过了ECMAScript数值的范围,则返会Infinity或者是-Infinity。
如果有一个数是NaN,那么结果就是NaN;
如果Infinity 与 0相乘那么结果就是NaN。
如果是Infinity 与 非0 数相乘,那么结果是Infinity 或是 -Infinity 取决于有符号操作数的符号。
如果是Infinity 与 Infinity 相乘那么结果是Infinity;
2. 除法
规则: 如果有一个操作数是NaN,那么结果就是NaN。
如果是Infinity 被 Infinity 除,则结果是NaN。
如果是零被零除,则结果是NaN。
3. 求模
规则: 被除数是无穷大而除数是有限大的数值,结果是NaN;
如果被除数是有限大而除数是0,结果是NaN;
如果Infinity被Infinity除,结果是NaN。
如果被除数是有限大而除数是无穷大的数值,则结果是被除数。
3.5.5 加性操作符
1.加法
规则: 如果有一个操作数是NaN,则结果是NaN
如果是Infinity 加 Infinity,结果是Infinity;
如果是-Infinity 加 -Infinity,结果是-Infinity
如果是Infinity 加 -Infinity,则结果是NaN。
+0 + +0 = +0; -0 + -0 = -0;+0 + -0 = +0;
如果两个都是字符串则将第二个与第一个连接起来。
2. 减法
规则: 如果有一个操作数是NaN,则结果为NaN;
如果是Infinity - Infinity = NaN;
如果是 -Infinity - -Infinity = NaN;
如果是Infinity - -Infinity = Infinity;
如果-Infinity - Infinity = -Infinity;
如果是 +0 - +0 = +0;
如果是 -0 - +0 = -0;
如果是 -0 - -0 = +0;
3.5.6 关系操作符
任何操作数与NaN比较都是false;
3.7 函数
函数在执行完return语句之后停止并立即退出。因此,位于return语句之后的任何代码都永远不会执行。
3.7.1 理解参数
函数体内可以通过arguments对象来访问参数数组,从而获得传递给函数的每一个参数。
通过访问arguments对象的length属性可以获知有多少个参数传递给了函数。
命名的参数只提供便利,但不是必须的。
3.7.2 没有重载
ECMAScript没有传统意义上那样实现重载,但是可以通过检查传入函数中参数的类型和数量作出不同反应,可以去模仿方法的重载。