首页 > 代码库 > JavaScript高级程序设计学习笔记--基本概念
JavaScript高级程序设计学习笔记--基本概念
1.语句
ECMAScript中的语句以一个分号结尾;如果省略分号,则由解析器确定语句的结尾,如下例所示:
var sum=a+b //即使没有分号也是有效的语句--推荐 var diff=a-b; //有效的语句--推荐
虽然语句结尾的分号不是必需的,但我们建议任何时候都不要省略它。两个原因:1.加上分号可以避免很多错误 2.加上分号也会在某些情况下增进代码的性能,因为这样解析器
就不必再花时间 推测应该在哪里插入分号了。
2.变量
var message="hi";
像这样初始化变量并不会把它标记为字符串类型,初始化的过程就是给变量赋一个值那么简单。因此,可以在修改变量值的时候修改值的类型,如下所示:
var message="hi"; message=10; //有效,但不推荐
可以像下面那样省略var操作符,从而创建一个全局的变量:
function test(){ message="hi"; //全局变量 } test(); alert(message): //hi
可以使用一条语句定义多个变量,用逗号分隔:
var message="hi",found=false,age=29;
3.typeof操作符
typeof可以用来检测变量的数据类型。对一什值使用typeof操作符可能返回下列某个字符串
“undefined”---未定义
“boolean”---布尔值
“string”---字符串
“number”---数值
“object”---对象或Null
"function"---函数
下面是几个使用typeof操作符的例子:
var message="some thing"; alert(typeof message); //"string" alert(typeof (message)); //"string" typeof是操作符而不是函数,圆括号可以使用,但不是必需的 alert(typeof 95); //"number"
4.undefined类型
在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined,例如:
var message; alert(message==undefined); //true
这个例子与下面是等价的
var message=undefined; alert(message==undefined); //true
对于一个尚未声明过的变量,只能执行一项操作,即使用typeof操作符检测其数据类型。
var message; //下面这个变量并没有声明 //var age alert(age); //产生错误 alert(typeof message); //undefined alert(typeof age); //undefined
5. Null类型
typof操作符检测null值时会返回“object”
6.boolean类型
boolean类型的值只有两个:true和false。但ECMAScript中所有类型的值都有与这两个boolean等价的值。要将一个值转换为boolean,可以调用转型函数Boolean():
var message="Hi"; var messageAsBoolean=Boolean(message);
7.number类型
八进制的第一位必须是0,然后是八进制数字序列(0-7),如果字面值中的数值超出范围,那么前导零将被忽略,后面的数值当作十进制来解析
var octalNum1=070; //八进制的56 var octalNum2=079; //十进制的79
十六进制前面两位必须是0x,
浮点数值
var floatNum1=1.1; var floatNum2=0.1; var floatNum3=.1; //小数点前面没有数据,有效但不推荐
e表示法:var floatNum=3.125e7; //等于31250000
浮点数的精度问题:浮点数的最高精度是17位数,但在进行算术计算时其精度确远不如整数。例如,0.1+0.2的结果不是0.3,而是0.300000000000000004。
这个小小的误差导致无法测试特点的浮点数值,例如:
if(a+b==0.3) { alert(“you got a 0.3”); }
如果这两个数是0.05和0.25,或者0.15和0.15都不会有问题。但如前面所述,如果这两个数是0.1和0.2,那么测试将无法通过
8. NaN
NaN,即非数值(Not a Number),用于表示一个本来要返回数值的操作数未返回数值的情况。
任何涉及NaN的操作(例如NaN/10)都会返回NaN
NaN与任何值都不相等,包括NaN本身。
9.数值转换
Number()函数:如果是null值,返回0;如果是undefined,返回NaN;空字符串,返回0;
parseInt()函数:空字符串会返回NaN. parseInt()能够识别出各种整数格式,如果字符串以“0x”开头且后跟数字字符,就会将其当作一个十六进制整数;
字符串以“0”开头且后跟数字字符,就会将其当作一个八进制整数来解析。例如:
var num1=parseInt("1234blue"); //1234 var num1=parseInt(""); //NaN var num1=parseInt("0xA"); //10(十六进制数) var num1=parseInt("22.5"); //22 var num1=parseInt("070"); //56(八进制数) var num1=parseInt("70"); //70(十进制数) var num1=parseInt("0xf"); //15(十六进制数)
parseInt()还有第二个参数:转换时使用的基数(即多少进制)。如果知道要解析的值是十六进制,那么就指定基数为16,以保证得到正确的结果。如:
var num1=parseInt("0xaf",16); //175
如果指定了第二个参数,字符串可不带前面的0x,如:
var num1=parseInt("af",16); //175 var num1=parseInt("af"); //NaN
不指定基数意味着让parseInt()决定如何解析输入的字符串,因此为了避免错误的解析,我们建议无论在什么情况下都明确指定基数。
10. String类型
字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。
数值、布尔值、对象和字符串都有toString()方法,但Null和undefined值没有这个方法。多数情况下,调用toString()方法不必传递参数,但是,在调用数值的toString()方法时
,可以传递一个参数:输出数值的基数。可以输出二进制、八进制、十六进制等 。
var num=10; alert(num.toString()); //10 alert(num.toString(2)); //1010 alert(num.toString(8)); //12 alert(num.toString(10)); //10 alert(num.toString(16)); //a
11.操作符
一元加和减操作符:一元加操作符以一个加号表示(+)表示,放在数据面前,对数值不会产生任何影响,如:
var num=25; num=+num; //25 其实就是一个正号
不过在对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值执行转换。像布尔值false和true将被转换为0和1。
逻辑与(&&)规则:
如果第一个操作数是对象,则返回第二个操作数;
如果第二个操作数是对象,则只有在第一个操作数的求值结果为true时情况下才返回该对象;
如果两个操作都都是对象,则返回第二个操作数;
如果有一个操作数是null,则返回null;
如果有一个操作数是NaN,则返回NaN;
如果有一个操作数是undefined,则返回undefined;
逻辑或(||)规则:
如果第一个操作数是对象,则返回第一个操作数;
如果第一个操作数的求值结果为false,则返回第二个操作数;
如果两个操作都都是对象,则返回第一个操作数;
如果两个操作数是null,则返回null;
如果两个操作数是NaN,则返回NaN;
如果两个作数是undefined,则返回undefined;
可以用逻辑或来为避免为变量赋null或undefined值,如:
var myObject=preferredObject||backupObject; //preferredObject不为null则值为preferredObject,否则为第二个值backupObject
加性操作符:
如果有一个操作数是NaN,则结果是NaN;
如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来。
忽视加法操作符中的数据类型是ECMAScript编程中最常见的一个错误,看个例子:
var num1=5,num2=10; var message="the sum of 5 and 10 is"+num1+num2; alert(message); //"the sum of 5 and 10 is 510"
关系操作符:<,>,<=,>=
如果一个操作数是数值,则将另一个操作数转换为数值,然后执行数值比较。
任何操作数与NaN进行关系比较,结果都是false.
var result=NaN<3; //false
相等操作符:
null和undefined是相等的。
全等和不全等:全等操作符由3个等于号(===)表示,它只在两个操作数未经转换就相等的情况下返回true,如下面所示:
var result=("55"==55); //true,因转换后相等 var result=("55"===55); //,因转换后相等
逗号操作符:
用于赋值时,逗号操作符总会返回表达式中的最后一项,如下面的例子所示:
var num=(5,1,8,4,0);//num的值为0
12.语句
for语句
由于ECMAScript中不存在块级作用域,因此在循环内部定义的变量也可以在外部访问到,如:
var count=10; for(int i=0;i<count;i++) { alert(i); } alert(i); //10
for语句中的初始化表达式、控制表达式和循环后表达式都是可选的。将这三个表达式全部省略,就会创建一个无限循环,如:
for(;;){ doSomething(); }
for-in 语句
ECMAScript对象的属性没有顺序。因此,通过for-in循环输出的属性名的顺序是不可预测的。具体来说,所有属性都会被返回一次,但返回的先后次序可能会因浏览器而异。
break和continue语句
break和continue语句都可以与label语句联合使用,从而返回代码中特定的位置。这种联合使用的情况多发生循环嵌套的情况下,如下所示:
var num=0; outermost: for(var i=0;i<10;i++){ for(var j=0;j<10;j++){ if(i==5&&j==5){ break outermost; } num++; } } alert(num); //55
with语句
with语句的作用是将代码的作用域设置到一个特定的对象中,由于大量使用with语句会导致性能下降,同时也会给调试代码造成困难,因此在开发大型应用程序时,不建议使用with语句。
switch语句
switch语句在比较值时使用的是全等操作符,因此不会发生类型转换(例如,字符串“10”不等)
13.函数
函数return语句也可以不带任何返回值,在这种情况下,函数在停止执行后将返回unedfined。
理解参数:函数的参数与大多数其他语言的参数不同。ECMAScript函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。也就是说,即使你定义的函数只接收
两个参数,在调用这个函数时也未必一定要传递两个参数,可以传递一个、三个甚至不传参数,而解析器永远不会有什么怨言。之所以这样,是因为ECMAScript中的参数在内部
是通过一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。实际上,在函数体内可以通过arguments对象来访问这个数组,从
而获取传递给函数的第一个参数。
如果只传入了一个参数,那么arguments[1]设置的值不会反应到命名参数中,这是因为arguments对象的长度是由传入参数个数决定的,不是由定义函数的命名参数决定的。
函数没有重载。