学习小结

161 阅读7分钟

1数据类型转换

   显式转换:程序员主动调用函数完成的类型的转换:
1、转字符串:21、xx.toString();//xx不能是undefined和null,报错,两者不能使用.去操作
	2String(xx);//万能的,没用:完全等效于隐式转换,还不如+""
	一般来说两个都不用,页面上获取到的数据都是字符串

2、*转数字:31、字符串 to 数字:parseInt/Float(str);
	   从左向右,依次读取每个字符,碰到非数字字符就停止转换,如果一开始就不认识,则为NaN
	   Int不认识小数点,Float认识第一个小数点

	2Number(xx);//万能的,没用:完全等效于隐式转换,还不如-0 *1 /1 %1

3、转布尔:1Boolean(xx);//万能的,没用:还不如!!x
	***只有6个为false0""undefinednullNaNfalse,其余都为true
	一定不会手动使用此方法,但是在某些地方会自动带有此方法:
		1、分支条件
		2、循环条件
  隐式转换:一般都出现在运算符和表达式中

2. 运算符和表达式

   1、*算术运算符:+ - * / %
    隐式转换:默认转为数字,再运算
     特殊:1、+运算,只要碰上一个字符串,两边都会悄悄的转为字符串(悄悄调用了一个方法,我们程序员看不见String()),再拼接
	   2、- * / %,只要是纯数字组成字符串,也可以转为数字(悄悄调用了一个方法,我们程序员看不见Number())

       2、*比较/关系运算符:> < >= <= == != === !==
      返回的结果:布尔值:truefalse
    隐式转换:默认一切都转为数字,再比较大小
    特殊:1、如果参与比较【两个都是字符串】,按位pk每个字符的十六进制unicode号(十进制ASCII码)
		0-9<A-Z<a-z<汉字
	  	建议记忆:汉字第一个字:一:4e00(ascii码:19968)
			    最后一个字:龥:9fa5(ascii码:40869)

	  2NaN,参与任何比较运算结果都为false,解决:!isNaN(x)
		x是一个数字,结果true
		x是一个NaN,结果就为false

	  3undefined==null;
	     问题:null==undefined结果为true,区分不开undefinednull
	     解决:全等===:数值相同 并且 数据类型也要相同,换句话说,不再带有隐式转换
		   !==:不带隐式转换的不等比较

		//String()的执行原理:任何东西都可以转为字符串
		function String(x){
			if(x===null){
				console.log("null");
			}else if(x===undefined){
				console.log("undefined");
			}else{
				console.log(x.toString());
			}
		}
                     3 逻辑运算符:
                                                            &&:全部条件都为true,结果才为true
    只要有一个为false,结果就为false

   ||:全部条件都为false,结果才为false
    只要有一个为true,结果就为true

   !:颠倒bool值

特殊:***短路逻辑:只要前一个条件已经可以得出最终结论,则后续条件不会再执行
	&&:如果前一个条件满足,则后一个操作才执行,如果前一个条件不满足,则后一个操作不执行
	    实现了一个【简单】的分支:目的:简化if(){},操作只能【用一句话】
	    语法:条件&&(操作);
	    举例:if(total>=500){total*=0.8}
		  total>=500&&(total*=0.8)

	||:两个值中二选一 - 老IE6/7/8)兼
  4  位运算:
  
  
                   左移:m<<n,读作m左移了n位,m*2的n次方 - 缺点:底数只能是2
                   右移:m>>n,读作m右移了n位,m/2的n次方 - 缺点:底数只能是2
                   
5、赋值运算:+= -= *= /= %= ++ --    

   一句话完成了两个操作,先运算再赋值回去
   比如:i++ => i+=1 => i=i+1;

        递增 vs 累加
        递增:i++,每次只能加1
        累加:i+=n,每次加几由我们自己决定

***鄙视/笔试题:++i 和 i++ 的区别?
	1、单独使用时,放前放后无所谓都一样
	2、如果参与了别的表达式,变量中的值都会+1
		前++,返回的是加了之后的新值
		后++,返回的是加了之前的旧
                    
                    
6、三目运算 - 简化if...else   if...else if...else


    如何使用:
          1、条件?操作1:默认操作;
          2、条件1?操作1:条件2?操作2:条件3?操作3:默认操作;

        特殊:
          1、只能完成【简单】的分支 - 操作只能有一句话,其实以后很多分支里面可能真的就只有一句话
          2、默认操作不能省略 - 会报错
          
          

7自定义函数:方法,一段提前被定义好的,可以反复使用的代码段

         1、如何使用:21、*创建/定义/声明函数&返回结果:21、*声明方式:用function关键字进行声明 - 并不是人人都有声明方式,只有个别人才有,而且声明方式一定是最简单的
		只有3个人具有声明方式:变量、常量、函数,其余人最简单的方式也是直接量
	        function 函数名(形参,...){
			   函数体
			   return 返回值;
	        }

	2、直接量方式:
		var 函数名=function(形参,...){
			   函数体
			   return 返回值;
	        }	
		函数名其实也是一个变量名		
		
        2、调用函数&接住结果
	var result=函数名(实参,...);

   解释:return:本意退出函数,但是如果后面跟着一个数据,则可以将数据返回到全局作用域中,但是仅负责返回,不负责保存,所以我们需要自己创建一个变量接住函数调用的结果
		 return只能写一次,而且最好写在函数体的后面
	 何时使用:并不是任何时候都需要加return1、全局想要使用局部的
			2、调用完函数还希望拿到函数的结果在后续还要做操作时
			3、如果没有return,其实也有默认返回值undefined
	

8.作用域:2个

                       1、全局作用域:全局变量 和 全局函数,在任何位置都可以访问/使用

            2、函数/局部作用域:局部变量 和 局部函数,只能在当前【函数调用时内部可用】

                有了作用域才有变量的使用规则:
                优先使用自己的,自己没有找全局,全局都没有报错
	
***强烈建议:千万不要对未声明的变量直接赋值,导致全局污染
	     所有的变量在使用之前都一定要先var,不能对着没有var变量直接赋值

***哪些属于局部变量:2部分
	1、直接在函数作用域中创建的变量
	2、形参
   

9.声明提前

               在程序执行之前
            悄悄将var声明的变量和function【声明】的函数
            集中提前到当前作用域的顶部
            但是赋值留在原地
            变量比函数更轻

            我们程序员是看不见的,但是会悄悄执行的
            

10.按值传递

           两个变量之间进行赋值
	1、如果传递的是原始类型的值:两个变量之间赋值,做操作,互不影响的 - 其实是复制了一个副本给对方

	2、如果传递的是引用类型的对象:ArrayFunction
		两个变量之间赋值,做操作,是会相互影响的 - 因为两个用的是同一个地址值
                    

11.预定义的全局函数:前辈们(实现浏览器的程序员们)提前定义好,我们可以直接在任何位置使用的函数

 1、编码和解码:
   问题1:url网址中不允许出现多字节字符,如果出现会导致乱码(没人看得懂)
		utf-8编码格式下,一个汉字占3字节
   解决:前端工程师需要将用户输入的网址中的中文编码为单字节字符,后端工程师接住前端传来的东西解码为原文
	 编码:var code=encodeURIComponent("str");
	 解码:var 原文=decodeURIComponent(code);

	 以前有用,现在没用:随着浏览器的不断升级,浏览器现在自带此功能
	 拿来玩玩一个低级的悄悄话

2isFinite(num):判断num是不是在有效范围之内
	三种情况会为false:分母为0,NaN,Infinity

3、重要的:parseInt/Float()、eval()、isNaN()

12.分支结构:根据条件的不同,执行不同的操作

        if...else结构
switch...case结构

语法:
  switch(变量/表达式){
	case1:
	操作1;
	break;
	case2:
	操作2;
	break;
	default:
	默认操作;
  }

注意:
  1、默认只要满足一条路,会把后面所有的操作全都做完,解决:break:一般放在操作的后面,但是:1、最后default不需要加break, 2、如果连续的多个操作是一样的效果,也可以省略中间部分
  2、不带有隐式转换
  3default可以省略不写

if vs switchswitch:优点:效率相对较高,因为不需要做任何范围判断
	        缺点:不能实现范围判断,必须要知道用户有可能输入的结果是什么才能使用
	if    :优点:实现范围判断
		缺点:效率相对较低

	个人建议:js优化,尽量的将if 优化为:三目、短路、switch
            

13.循环结构:反复执行 相同 或 相似的操作

            1while循环:
语法:var 循环变量=几;
      while(循环条件){
	循环体;
	变量变化;
      }

   2do...while循环:
语法:var 循环变量=几;
      do{
	循环体;
	变量变化;
      }while(循环条件)

面试题:whiledo...while的区别?
	只看第一次,如果第一次大家都满足条件,两者没有区别,无非do...while更麻烦
		    如果第一次大家都不满足条件,while一次都不会执行,而do...while至少会执行一次

   3、***for循环:
for(var 循环变量=几;循环条件;变量变化){
	循环体;
}

其实我们的循环目前为止就算学完了,但是后面我们还会看到一些for in循环、for of循环、forEach循环 - 这些都算不上循环,因为不能自己设置从何开始到哪里结束,更算是专门用于遍历数组的操作

   4、循环终止语句:
   *break - 退出整个循环
continue - 退出本次循环