第三章 基本概念
3.1 语法
3.1.1 区分大小写
3.1.2 标识符
指变量、函数、属性的名字,或者函数的参数。,按照惯例使用camelcase。
3.1.3 注释
C风格://&/**/
3.1.4 严格模式(可以理解成异常处理?)
在严格模式下,ECMA中的一些不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误
3.1.5 语句
以分号结尾,虽然没有也有效。
3.2 关键字和保留字
3.3 变量
是松散型的,就是可以用来保存任何类型的数据。var message;
未初始化时会保存成“undefined”
不建议修改变量所保存值的类型,虽然有效。
省略var操作符可以定义全局变量,但是不推荐,在严格模式下会抛出错误。
3.4 数据类型
5种简单数据类型:Undefined, Null, Boolean, Number, String.
也可返回“object”,“function”
3.4.2 undefined类型
typeof操作符
用来检测变量的数据类型。(是一个操作符而不是函数,所以不需要使用括号)
var message;
alert(typeof message);
alert(typeof age);//没有被声明,但是也会返回undefined
所以尽量显式初始化变量吧,就可以知道被检测的变量还没有被声明,而不是尚未初始化。
3.4.3 Null类型
Null值表示一个空对象指针。所以typeof会返回object
实际上,undefined是派生自null的,因此
alert(null==undefined);//true 但是==操作符出于比较目的会转换操作数类型
只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值。
3.4.4 Boolean类型
是ECMA中用得最多的类型。=true/false
可以对任何数据类型的值调用Boolean()函数,而且总会返回一个Boolean值。
3.4.5 Number类型
最令人关注的数据类型。
十进制直接写,八进制加个前导0(八进制在严格模式下无效),十六进制加个0x
1.浮点数值
如果某次结果得到了一个超出JAVASCRIPT数值范围的值,那么这个值将被自动转换成infinity,而且不能参与下一次的计算。可以使用isFinite函数判断是否是无穷。
NaN即非数值是一个特殊的数值。isNaN,会先用valueOf将其转换成数值。
有三个函数可以把非数值转换为数值:Number(可以用于任何数据类型), parseInte(), parseFloat()(后两个转换字符串)
Number(011)=11(前导零被吃掉),对空字符返回0
parseInt会依次解析字符直到遇到一个非数字字符。parseInt("22.5")=22;
ECMAScript允许parseInt实现把以0(不是0x或0X)开头的字符串解析为八进制或十进制数。也可以加入第二个参数指定进制。
3.4.6 String类型
任何字符串的长度都可以通过访问其length属性取得。
ECMAScript中的字符串是不可变的,一旦创建便不能再更改其值。要改变某个变量保存的字符串,首先要销毁原来的字符串(???)但是可以用加号拼接?
用toString()函数转换成字符串,可以添加参数指定转换成的进制数。在不知道要转换的值时都是null或undefined可以使用转型函数String(),它能加任何类型的值(+null+undefined)转换为字符串。比toString更有能力一点点。
3.4.7 Object类型
即是数据和功能的集合,用new创建。var o=new Object();
括号可省(如果不传递参数,但不推荐)。
一个重要思想:在ECMAScript中,Object类型是所有它的实例的基础。
Object的每个实例都具有下列属性和方法:
...constructor 构造函数^^
...hasOwnProperty(propertyName)用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。参数必须为字符串
...isPrototypeOf(Object) 用于检查传入的对象是否是另一个对象的原型。
...propertyIsNumerable(propertyName)用于检查给定的属性是否能够使用for-in语句来枚举,参数得是字符串。
...toString() 返回对象的字符串表示
...valueOf() 通常与toString的返回值相同。
3.5 操作符
3.5.1 一元操作符
1.递增和递减操作符(和C一致)
前置先自增或自减再执行运算,后置先执行运算。
var o={valueOf : function(){return -1;}};
2.一元加和减操作符
一元减操作符主要用于表示负数。
3.5.2 位操作符
也有按位与或非
3.5.3 布尔操作符(skip)
!0=!false=!null=!NaN=true
逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。
例子:
var found = true;
var result = (found && someUndefinedVariable);//这里会发生错误
alert(result);//这一行不会执行
另一个例子:
var found = false;
var result = (found && someUndefinedVariable);//不会发生错误
alert(result); //false
逻辑或也是短路操作符。如果第一个操作数的求值结果为true,就不会对第二个操作数求值了。
一个例子:
var found = true;
var result = (found || someUndefinedVariable); //无错
alert(result); //true
另一个例子:
var found = false;
var result = (found || someUndefinedVariable); //出错
alert(result); //不会执行
可以利用逻辑或的这一行为来避免为变量赋值为null或undefined,例如:
var myObject = preferredObject || backupObject;
变量preferredObject中包含优先赋给变量myObject的值,变值backupObject负责在preferredObject中不包含有效值的情况下提供后备值。如果p的值不是null,那么就用它的值;如果是null,则将b的值赋给myObject。
3.5.4 乘性操作符
/得商%取模
在操作数为非数值的情况下会执行自动的类型转换(使用Number())。
如果一个Infinity与0相乘结果为NaN,与非零相乘是±infinity
3.5.5 加性操作符
和字符串用+的时候,数字会被转换成字符串
和加号不同的是,减法中一个操作数为字符串时,先将该字符串转换为数字。
如果一个操作数是对象、数值或布尔值,则调用它们的toString()方法取得相应的字符串值,然后再应用前面关于字符串的规则。对于undefined和null,则分别调用String()函数并取得字符串undefined和null.
3.5.6 关系操作符
<, >, <=
在比较两个字符串时,比较的是两个字符串中对应位置的每个字符的字符编码值。可以用.toLowerCase或.toUpperCase来转换大小写。
如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。
var result="a"<3;//false,因为“a”被转换成了NaN
3.5.7 相等操作符
1.相等和不相等
==&!= 会先转换操作数再比较
null和undefined是相等的。
2.全等和不全等
===除了在比较之前不转换操作数之外,全等和不全等操作符与相等和不相等操作符没有什么区别。
3.5.8 条件操作符
?: 如var max=(num1>num2)?num1:num2;
3.5.9 赋值操作符
num+=10;
3.5.10 逗号操作符
逗号操作符多用于声明多个变量,但除此之外,逗号操作符还可以用于赋值。在用于赋值时,逗号操作符总会返回表达式中的最后一项。
3.6 语句
3.6.1 if语句
if (condition) statement1 else statement2
3.6.2 do-while语句
do {
statement
}while(expression);
至少要执行一次。
3.6.3 while语句
while(expression){statement;}
3.6.4 for语句
使用while做不到的,for同样做不到。
3.6.5 for-in语句
for(property in expression) statement
3.6.6 label语句
label:statement
3.6.7 break和continue (同C)
3.6.8 with语句
作用是将代码的作用域设置到一个特定的对象中。语法如下:
with (expression) statement
相当于是把多个语句封装成一个语句吧,但是性能不好,不建议使用。
3.6.9 switch(同C)
3.7 函数
function functionName(arg0, arg1...){ statements}
毕竟不区分变量类型。所有函数参数中也不需要像C中啥的要加上类型。
3.7.1 理解参数
ECMAScript不介意传进来多少参数,甚至不传递参数,在函数体内可以通过arguments来访问这个参数数组,从而获得传递给这个函数的每一个参数,可以用length属性来确定传递进来多少个参数。(可以利用length加if语句来实现重载功能,ECMAScript中没有重载,如果两个名字相同,后定义的有效)
如
function sayHi(){
alert("hello" + arguments[0]+arguments[1]);
}
sayHi("nico", "how are you");
说明了函数的一个重要特点:命名的参数只提供便利但不是必需的。
没有传递值的命名参数将自动被赋予undefined值。
ECMAScript中的所有参数传递的都是值,不可能通过引用传递参数。
3.7.2 没有重载
可以通过检查传入参数的类型和数量做出不同的反应,以模仿重载。