]js学习笔记
第四部分:
1、如果不清楚运算符的优先级,最简单的办法就是使用括号来明确表明计算顺序
赋值操作的优先级非常低,几乎总是最后才被执行
2、如果“+”(加号)运算符表达式中一个是字符串,而另一个不是,则另一个会被自动转换为字符串;
如果加号运算符中一个运算数为对象,则这个对象会被转化为可以进行加法运算的数字或可以进行连接运算的字符串,这一转化是通过调用对象的valueof()或tostring()方法来实现的。
3、如果“-”减法运算符的运算数不是数字,那么系统会自动把它们转化为数字。
也就是说加号运算数会被优先转化为字符串,而减号运算数会被优先转化为数字。以此类推,只能进行数字运算的运算符的运算数都将被转化为数字。(比较运算符也会优先转化为数字进行比较)
4、加号运算符有将参数转化为数字的功能,如果不能转化为数字则返回NaN
如 var a=”100”; var b=+a 此时b的值为数字100
5、递增运算符(++),只能运用于变量,如果用在变量前则为前递增运算符,如果用于变量后面则为后递增运算符。前递增运算符会用递增后的值进行计算,而后递增运算符用递增前的值进行运算,如:
var a=1
var b= a++ //此时b的值为1,因为b的值是a递增前的值。但a的值已经为2了,
var a=1
var b=++a //此时b的值为2,a的值也为2
递减运算符(--)的用法与递增运算符的用法相同
6、关于(===),要想使等式成立,需满足的条件是:
- 等式两边值相同,类型也相同
- 如果等式两边是引用类型的变量,如数组、对象、函数,则要保证两边引用的是同一个对象,否则,即使是两个单独的完全相同的对象也不会完全相等。
- 等式两边的值都是null或undefined,但如果是NaN就不会相等
7、关于(==),要想使等式成立,需满足的条件是:
- 等式两边类型不同,但经过自动转化类型后的值相同,转化时如果有一边为数字,则另一边的非数字类型会优先转化为数字类型;布尔值始终是转化为数字进行比较的,不管等式两边中有没有数字类型,true转化为1,false转化为0。对象也会被转化。
- null==undefined
8、比较运算符如大于、小于等只能对数字或字符串进行比较,不是数字或字符串类型的,将被转化为数字或字符串类型。如果同时存在字符串和数字,则字符串优先转化为数字,如不能转化为数字,则转化为NaN,此时表达式最后结果为false。如果对象可以转化为数字或字符串,则它会被优先转化为数字。如果运算数都不能被转化为数字或字符串,则结果为false。如果运算数中有一个为NaN, 或被转化为了NaN,则表达式的结果总是为false.当比较两个字符串时,是将逐个字符进行比较的,按照的是字符在Unicode编码集中的数字,因此字母的大小写也会对比较结果产生影响。
9、in运算符要求其左边的运算数是一个字符串或者可以被转化为字符串,右边的运算数是一个对象或数组,如果左边的值是右边对象的一个属性名,则返回true.
10、 intanceof运算符要求其左边的运算数是一个对象,右边的运算数是对象类的名字,如果运算符左边的对象是右边类的一个实例,则返回true。在js 中,对象类是由构造函数定义的,所以右边的运算数应该是一个构造函数的名字。注意,js中所有对象都是Object类的实例。
11、+运算符用于数字或字符串时,并不一定就都会转化成字符串进行连接,如:
var a=1+2+”hello” //结果为3hello
var b=”hello”+1+2 //结果为hello12
产生这种情况的原因是 + 运算符是从左到右进行运算的。
12、因为(=)被定义为一个运算符,所以可以将它运用于更复杂的表达式。如:
(a=b)==0 //先给a赋值b,再检测a的值是否为0.
赋值运算符的结合性是从右到左的,因此可以这样用:
a=b=c=d=100 //给多个变量赋同一个值
13、typeof 也是一个运算符,用于返回运算数的类型,typeof也可以用括号把运算数括起来。typeof对对象和数组返回的都是object,因此它只在用来区分对象和原始数据类型时才有用。
14、delete是一个一元运算符,用来删除运算数指定的对象属性、数组元素或变量,如果删除成功返回true,删除失败则返回false。并不是所有的属性和变量都可以删除,比如用var声明的变量就不能删除,内部的核心属性和客户端的属性也不能删除。要注意的是,用delete删除一个不存在的属性时(或者说它的运算数不是属性、数组元素或变量时),将返回true。
delete影响的只是属性或变量名,并不会删除属性或变量引用的对象(如果该属性或变量是一个引用类型时)
15、void也是一个一元运算符,它会忽略它的运算数并返回undefined
第五部分:
1、if语句。
if(expression) statements //如果代码只有一句,可以不添加花括号
if(expression) {statements} //当然也可以添加花括号,这是好的习惯
if(expression) {statements} else{statements} //带else
if(expression) {statements}
else if(expression) {statements}
else if(expression) {statements}
……
else if(expression) {statements}
else{statements} //else if的用法
2、switch语句
switch (expression){
case n1:statements;
break;
case n2:statements;
break;
……
case n3:statements;
break;
default:statements;
break; }
break与default语句是可选的。expression与n1、n2…等的比较用的是 ===,n1、n2…等可以是变量,但最好还是用常量
3、while语句
while(expression){statement}
4、do…while语句
do{statement}
while(expression) ; //这里必须以分号结尾
do…while语句至少会执行一次,且while后面必须以分号结尾
5、for语句
for(initialize;expression;increment){
statement}
for语句的执行过程是首先执行initialize来初始化变量;然后验证expression的真假,为真则执行statement,为假则退出循环,然后在下一次验证expression的真假前,执行increment来改变变量,以此作为循环
6、for in语句
for (variable in object){ statement }
在每次循环时,object的一个属性名都会被作为字符串赋给变量variable.在循环体内部,可以使用这个变量和“[]”运算符来查询该对象的属性值,这意味着每次循环variable的值都不相同
7、break语:中断循环,再嵌套循环中break后面还可以加上大于0的整数,表示要退出的是那层循环
continue语句:直接跳到下一次循环 (在do while语句中最好不要使用continue)
8、 return语句:只能出现在函数中,用来返回值给函数。也可以单独使用return而不带返回值。不论return带不带返回值,函数内的代码执行到 return时,都会中断程序的执行,跳出函数,即使return下面还有其他的代码。如果没用return给函数返回值,则函数的默认值是 undefined
9、throw语句
throw expression //用于抛出一个异常,expression可以是任何类型的数据,如error对象或字符串等
注意:在js中当发生运行错误或使用throw语句时就会抛出异常。抛出异常时,js解释器会停止程序的运行,跳转到最近的异常处理器(即用catch编写的语句),如果抛出异常的代码没有相关的catch从句,检查器会检查次高级的封闭代码,看它是否有相关的异常处理器,依此类推,知道找到一个异常处理器为止。
10、try、catch 、 finally语句
try{…} //放入可能抛出异常的代码,当然也可以放入完全正常的代码。(此语句可选)
catch(e){…} //此处的e为一个标识符,它指定了一个仅存于catch代码块内部的局部变量,js将会把抛出的异常对象或值赋给这个变量。仅当try块抛出了异常catch语句才会执行。
finally{…} //无论try语句抛出或没有抛出异常,finally语句都会执行。即使try中的语句由于return、continue、break语句终止了,那么在控制流转移到新的目的地前finally也会执行。
11、with(object){…} //尽量避免使用with语句,可以申明一个变量来代替复杂的object
12、空语句: ; (没错,就是一个分号)
for(var a=1;a<5;a++) ; // 记住,这句中的分号并不是代表一句的结束,因为在这里,并不需要分号来结束。这里的分号是代表一个空语句,相当于这个循环语句的代码部分。
a=6; //这句话已经不属于上面那个循环语句了,就是因为那个分号
第六部分
1、调用函数时,如果参数多于定义时的个数,则多余的参数将会被忽略,如果少于定义时的个数则缺失的参数数会被自动赋予undefined值。
2、如果是用function语句声明的函数定义则不可以出现在循环或条件语句中,但是如果是用函数直接量方法的函数定义则可以出现在任何js表达式中。
3、arguments对象
函数的arguments对象就像一个数组,里面保存着函数调用时的实际参数,可以用arguments[0]、arguments[1]、 arguments[2]…等来引用这些参数,即使这些参数在定义函数时是没有的。但arguments并非真正的数组对象。
function a(x,y){
arguments[0] //表示第一个参数x
arguments[1] //表示第一个参数y
arguments[2] //表示第三个参数,前提是在调用函数时传入了三个参数
…
arguments.length //表示实际传入参数的个数
arguments.callee(x,y) //调用自身 }
arguments对象具有length属性,表示的是函数调用时实际传入的参数的个数。
arguments对象还具有callee属性,用来引用当前正在执行的函数,这个在匿名函数中尤其有用。
4、函数的length属性(没错,函数也是具有length属性的)
与arguments.length不同,函数的length属性表示的是在定义函数时的形参个数,而不是函数调用时的实际参数个数。可以用arguments.callee.length来调用函数的length属性。