js中的运算符、调试、函数和数组
一、运算符
1 <script type="text/javascript"> 2 var r='a'||''; 3 alert(r);//a 4 //前者非空,返回true,后者为空,返回false,|| 表示或者,只要有一个为真,就返回真, 5 // 所以整个表达式返回true。 6 // ||表达式中,只要第一个为真,第二个值不用判断了,直接返回true。 7 // 因为第一个变量的值是true,所以返回第一个变量值。 8 9 var r=null||15; 10 alert(r);//15 11 12 var r='a'&&0; 13 alert(r);//0 14 15 var r=null&&15; 16 alert(r);//null 17 18 var r='12312'||12; 19 alert(r);//12312 20 21 var r='12312'&&12; 22 alert(r);//12; 前后两个表达式都是true,&&表示并且,所以整个表达式是true, 23 // 但是返回的是最后一个为真的表达式的值 24 25 </script>
二、脚本的调试
1.ie调试
2.firefox调试
先安装firebug。
3.Google调试
4.vs调试
把页面设置成起始页,打断点,F5调试。
注意:如果打了断点,刷新后怎么都不不能调试,可能是浏览器安装了某些插件,影响了调试工具的使用。可以先卸载,重启浏览器,再调试。或者直接把浏览器还原到初始状态。
三、函数
1.函数没有访问修饰符,没有返回值(js是一门动态语言,数据类型根据变量的值来定,所以在不需要设置方法的返回值)
2.不要使用js内置的关键字或者系统函数名作为函数名
3.没有方法重载一说,所以f()不管有没有参数,只要是方法名称相同,就是同一个方法,后面的方法会覆盖前面的方法。
4.js中的方法的参数仅仅是为了使用方便,就算不写,也可以在调用的时候传递。这些参数全部保存到了arguments中。
1 <script type="text/javascript"> 2 function f() { 3 alert('first method') 4 } 5 6 function f(name) { 7 alert(name); 8 } 9 10 //f();//undefined。原因:js中没有方法重载一说,所以f()不管有没有参数,只要是方法名称相同,就是同一个方法,后面的方法会覆盖前面的方法。 11 // 所以f()调用的是f(name).由于没有传入参数,声明一个变量,不赋值,该变量的值就是undefined,类型也是undefined。 12 13 //js中的方法的参数仅仅是为了使用方便,就算不写,也可以在调用的时候传递。这些参数全部保存到了arguments中。 14 15 function f1() { 16 var sum=0; 17 for (var i=0;i<arguments.length;i++) { 18 sum+=arguments[i]; 19 } 20 return sum; 21 } 22 alert(f1(1,2,3,4,5,6)); 23 </script>
5.案例
1 <script type="text/javascript"> 2 var userName = "tom"; 3 4 function f() { 5 alert(userName);//undefined 6 var userName = 'zhong'; 7 alert(userName);//zhong 8 } 9 alert(f()); 10 alert(userName);//tom 11 //在函数的内部声明变量,整个函数都能访问。因为js中没有块级作用域的概念。 12 // 如果局部变量和全局变量重名,优先使用靠的最近的变量。 13 // 变量和函数会被预解析,后面的成员会覆盖前面的成员,但是预解析不会执行赋值语句。所以在执行f()中的alert(userName)时,userName已经声明,只是没有赋值,所以弹出undefined。 14 </script>
总结:因为js具有预解析的功能,所以最好在开始一次性把变量全部声明完。
练习 (结果:4……4。因为同一个script中的js代码会先预解析,后面的方法或者变量会覆盖前面的方法或者变量,但是要注意变量只是覆盖变量名,不会覆盖赋值语句)
1 var x=1,y=0,z=0; 2 function add(n) { 3 n=n+1; 4 return n; 5 } 6 y=add(x); 7 function add(n) { 8 n=n+3; 9 return n; 10 } 11 z=add(x); 12 alert(y+'……'+z);
6.函数本身可以做一个函数来调用,还可以看做是一个对象(函数对象),有特有的成员和方法。
1 function myFunction(x) { 2 alert("i"); 3 } 4 //alert(myFunction.toString());//弹出整个方法,包括方法体 5 //alert(myFunction.length);//弹出形参的个数
7.匿名方法
1)声明。
1 //匿名函数 2 var f1=function () { 3 alert('这是匿名函数'); 4 }; 5 //f1();
2)三种使用方法
1>直接赋值给变量调用
如上面声明时候的代码。也可以看下面。
1 var f=function (fn) { 2 alert('这是一个fn函数'); 3 fn(); 4 } 5 6 f(f12)//调用匿名函数f(),传入参数f12,由于f12是个方法,所以可以直接这样调用:fn() 7 //还可以不用传递变量,直接传递一个匿名函数 8 f(function () { 9 alert('这是直接传递匿名函数'); 10 }) 11 12 function f12() { 13 alert('12'); 14 }
2>括上匿名方法,后面加上括号直接调用。后面的括号中可以写参数。
1 (function() { alert('这是匿名方法的第二种调用方式') })(); 2 (function (x,y) { 3 return alert(x+y); 4 })(2,3);
3>new Funtion()方式
1 //var f=new Function('x','y','z','alert(x+y+z)'); 2 var f=new Function('x,y,z','alert(x+y+z)');//通过匿名方法声明的变量,只能在方法内部访问,外界不能访问。eval()中的变量是全局变量 3 f(1,2,3);
练习:结果2…… 4. 变量预解析只解析变量名称,不解析赋值语句。
1 var x=1,y=0,z=0; 2 var add=function (n) { 3 n=n+1; 4 return n; 5 } 6 y=add(x); 7 add=function (n) { 8 n=n+3; 9 return n; 10 } 11 z=add(x); 12 alert(y+'……'+z);
8.数组
1)声明:var data=[]; var data=[2,4,5,1]; var data=new Array(5);//可以不填长度
2) 赋值技巧
1 //一、声明一个数组 2 // var arr=[2,34,1,5,6,3]; 3 // for(var i=0;i<arr.length;i++){ 4 // alert(arr[i]); 5 // } 6 // alert(arr.length); 7 // alert(arr.toString());//2,34,1,5,6,3 8 9 //二、声明一个空数组 10 var data =[]; 11 // data[100]=1;//数组的长度立刻变成101,0-100的元素都是undefined。 12 // alert(data.length); 13 // alert(data.toString()); 14 15 // data[data.length]=1; 16 // data[data.length]=2; 17 // data[data.length]=3; 18 // alert(data.toString());
1 <script type="text/javascript"> 2 //一、声明一个数组 3 // var arr=[2,34,1,5,6,3]; 4 // for(var i=0;i<arr.length;i++){ 5 // alert(arr[i]); 6 // } 7 // alert(arr.length); 8 // alert(arr.toString());//2,34,1,5,6,3 9 10 //二、声明一个空数组 11 var data =[]; 12 // data[100]=1;//数组的长度立刻变成101,0-100的元素都是undefined。单独循环的话,弹出的是undefined,调用tostring()方法,弹出的是空 13 // alert(data.length); 14 // alert(data.toString()); 15 16 // data[data.length]=1; 17 // data[data.length]=2; 18 // data[data.length]=3; 19 // alert(data.toString()); 20 21 // for(var i=1;i<=50;i++){ 22 // if(i%2==0){ 23 // data[data.length]=i; 24 // } 25 // } 26 // alert(data.toString()); 27 28 //三、数组长度可以动态设置 29 data[4]='A'; 30 data[10]='B'; 31 data[20]=true;//此时数组的长度变成21 32 33 //可以动态设置数组的长度 34 data.length=3; 35 for (var i=0;i<21;i++){ 36 alert(data[i]);//只输出前三个元素,后面的的18的元素的值都是undefined。 37 } 38 </script>
浙公网安备 33010602011771号