javascript笔记二

108 阅读5分钟

1 function 函数 也叫做方法 以后可以反复使用的

     1、创建函数并且调用:21、声名方式创建
             function  函数名(){
             函数体;
             return 返回值;
             }
          2、直接量创建函数  函数名其实就是一个变量名
             var 函数名=function(形参列表){
               函数体;
               return  返回值;}
               return  本意是 退出函数的意思 只负责返回不负责保存 用一个变量接住结果
               
               function f1() {
              var a = 100;
              return a; //return只负责返回,不负责保存
             }
              var result = f1();
              console.log(result);
      2、做用域:2种;
          1、全局作用域   全局变量和全局函数在任何地方都可以使用的
          2、局部作用域   局部变量和局部函数在(函数调用时在内部使用)
          规则:优先使用局部的,局部没用找全局,全局没有就会报错。
          特殊:1、不要对未声名的变量直接赋值,a=1 .会全局污染,全局没有被突然添加上了一坨。
                2、局部的东西,全局不能用
                3、那怕没有写return其实也有return只不过后面跟的是undefined
                4return一般出现在最后面,而且只能出现一次
                5、往往前辈们提供的方法后面都有一个return操作,可能前辈们觉得以后用这些方法                     的人,可能拿着此方法的结果拿去做后续操作。
       3、声名提前
           在程序正式运行之前  将var声名的变量(轻),和function声名的函数(重)都会悄悄地集                中的提前到当前作用域的顶部,但是赋值留在原地。
           声名方式的函数会完整的提前,直接量的方式创建的函数不会完整提前,只有变量部分会提                前。
           何时使用:基本不会使用。
           只要你遵守以下规则:
            1、变量名和函数名尽量不要重复
            2、先创建后使用
            3、如果是先用后创建,可能多半是在考你声名提前。
                    var a=1;
		function f1(){
			console.log(a);
			var a=100;				
                            console.log(a);
                            }
		      f1();			
                          console.log(a);
                          
                     var a=1;
                     function f1(){
                             var a
                         console.log(a);(报错)
			  a=100;				
                             console.log(a);100
                            }
		       
                           
                           
                        f1();			
                         console.log(a);1function f1(){
	               console.log(a);  210
			a=20;
			console.log(a); 320
		   }
		    console.log(a);   1undefined
		    var a=10;
		   f1();
		   console.log(a);   420
		    a=100;
		   console.log(a);   5100
         4、按值传递:两个变量之间到的赋值 分两种情况
               如果传递的是原始类型的值 
               修改一个变量不会影响另一个变量,其实复制一个副本给对方。
               如果是引用类型的对象,修改一个变量,另一个变量也会受影响,引用类型根本没有保                    存到变量之中,只是保存了一个地址,两者同用一个地址,所以会相互影响。
               /	        var a=1;
  //			var b=a;
  //
  //			b++;
  //
  //			console.log(a);
  //			console.log(b);

  //			var arr1=[1,2,3,4,5];//arr1其实只是保存到了一个地址值
  //			var arr2=arr1;//arr1吧地址值给了arr2,两者用的同一个地址值,所以会相互修改
  //
  //			arr1.length--;
  //			arr2.length--;
  //
  //			console.log(arr1);
  //			console.log(arr2);
   备注 原始类型 string(字符串)  number(数字)  undefined booleantruefalsenull
   
   2、预定义全局函数:前辈们提前定义好的,我们程序员可以直接使用的,在任何位置都可以使用
*parseInt/Float/isNaN/eval... 其实都是预定义全局函数,但是alert/prompt不属于我们现在学          的范畴:确实也是全局预定义函数,只不过属于BOM

1、编码和解码
      问题:url中不允许出现多字节字符(汉字,utf-8编码格式下,一个汉字占3字节),如果出               现会乱码
      解决:发送前,前端将多字节字符编码为单字节字符(数字、字母、符号)
	发送后,后端将单字节字符在解码为多字节原文
      如何:
	编码:var 不认识=encodeURIComponent("大梵");
	解码:var 原文=decodeURIComponent(不认识);
     这个东西没有用,在某一次浏览器更新后,当前就被淘汰了,浏览器自带此功能 - 唯一的用              处,现在就是玩了:悄悄话

2isFinite(num):判断num是不是有效范围 - 垃圾并不能用于判断是不是NaN,因为有三个人会是            false
  哪些会为falseNaN,Infinity,分母为0

3、***分支结构:根据条件的不同,选择部分代码执行

1if分支
      var score=prompt("请输入您的分数");
     if(score>=90){alert("奖励一台兰博基尼");}
        else if(score>=80){alert("奖励一台A6");}
        else if(score>=70){alert("奖励一台自行车");}
        else if(score>=60){alert("奖励一台奥迪双钻");}
        else{alert("奖励钉子皮托烟锅巴");}
2三目&短路
        5 > 3 && alert("对的");(前面是条件,满足就做后面的)
    console.log(score>=90?"奖励一台兰博基尼":score>=80?"奖励一台奥迪A6":score>=70?"奖励一         台自行车":score>=60?"奖励一台奥迪双钻":"奖励钉子皮托烟锅巴");(备注默认操作不能省略)
    score==90&&"奖励一台兰博基尼"
3switch...case...语法
	switch(变量/表达式){
		case 值1:
		操作1;
		case 值2:
		操作2;
		case 值3:
		操作3;
		default:
		默认操作;
	}
      var user=parseInt(prompt("欢迎使用10086查询系统: \n1、查询余额 \n2、查询流量 \n3、              查询套餐 \n4、人工服务"));
     switch(user){
			case 1:
			alert("正在查询余额...");
			break;
			case 2:
			case 3:
			alert("正在维护...");
			break;
			case 4:
			alert("正在转接人工...");
			break;
			default:(默认操作)
			alert("暂无此功能");
		}
	特殊:1不具备隐式转换
	           2问题:默认只要一个case满足后,就会将后面所有操作全部做一次
		解决:break;
		建议:每一个case的操作后都要跟上一个break
			有的地方可以不加break:
				1最后一个操作default可以省略break
				2如果中间连续的多个操作,是相同的,也可以省略掉中间部分
		
	面试题:if  vs switch
	1switch:缺点:必须要知道最后的结果才能使用,不能做范围判断
		  优点:执行效率相对较高

	2if         : 优点:可以做范围判断
		 缺点:执行效率相对较慢

	建议:代码优化:尽量的将if替换为switch或者三目或短路