JS第二周回忆

1.数据类型的转换

  • 1-1转字符串

    tostring(x) string(x)

  • 1-2字符串转数字 parseInt 取整,遇到字母停止, parseFloat 认识第一个小数点 Number(X)万能的 不认识小数点但是不如-01/1%1

  • 1-3转布尔值 Boolean(x)//万能的 ,任何人都能转为布尔,绝对不会手动使用,还不如!!X;

    ***只有六个值会为false,"",0,NaN,false,undefined;null; 在分支/循环的条件之中,自动隐式转换,以后不管在条件里面写的有多奇怪,你都要知道他会悄悄的变成一个布尔值,只需要判断是不是那6个 1-4隐式转换:都是出现在运算符中;

2、***算数运算符和表达式

  1. 2-1算数运算符+ - /% %特点:1.取余,判断奇偶性 2.具有隐式转换,默认转为数字在运算; undefined-NaN; null-0; true-1; fasle-0; +特点: 碰到字符串,会拼接; -/%:可以将字符串转为数字,但是是纯数字的字符串才可以,包含非数字就会输出NaN;
    1. 2-2 比较运算符> < >= <= == != === !== 结果布尔值 隐式转换,默认转化为数字,在比较大小 特点:1.如果俩边都是字符串,则是按位Pk每个字符的十六进制unicode号(十进制ascii码); 0-9<A-Z<a-z<汉字 2.NaN参与任何运算结果都是Fasle;所以我们没办法用普通方法比较;!isNaN(函数名); 3.区分==和=== undefined==null//true; undefined===null//fasle
  • 3 . 作用:综合比较,结果也是为布尔值

  • 隐式转换:左右两边都会悄悄转为布尔值,再综合比较结果
    
  •   &&:全部满足,才满足 一个不满足,则不满足
  •   ||:全部不满足,才不满足一个满足,则满足
    
  •             !:颠倒布尔值
    
  •   特殊:短路逻辑:如果前一个条件,已经可以得出最终结论了,没有必要看后续
    
  • &&短路:如果前一个条件满足,才执行后一个操作,如果前一个条件不满足,则不管后续操作

  • 目的:简化【简单的】分支: 1、一个条件一件事,满足就做,不满足就不做:if(){} 2、【简单的】- 操作只能有一句话:多句操作导致我们以后维护项目时观看/阅读代码不方便,往往以后很多操作可能就只有一句话 语法:条件&&(操作); ||短路:实现浏览器兼容性问题:二选一:e=e||window.event;

  • 4.自定义函数:也叫做方法,是需要预定义好的以后可以反复使用的代码块;

  • 4-1创建函数的俩种并且调用;

  • 1、*****声明方式创建函数:用一个关键字function做声明 function 函数名(形参列表){ 函数体; return 返回值; }

    2、直接量方式创建函数:函数名其实就是一个变量名 var 函数名=function(形参列表){ 函数体; return 返回值; } return的本意:退出函数的意思 1.只不过如果return后面跟着一个数据,会顺便将其返回到全局作用域中,但是只负责返回负责保存!所以在调用函数时:如果有return,记得拿一个变量接住结果 2何时使用:如果你希望拿到函数的结果,以后还要做别的操作,就需要搭配上return 调用函数:var result=函数名(实参列表);

  • 4-2函数作用域: 1.全局作用域:局变量和全局函数,在任何地方都可以使用; 2.函数/局部作用域:局部变量和局部函数,在【函数调用时内部可用】; 3.带来了变量的使用规则:优先使用局部的,局部没有找全局,全局没有就报错;

  • 4.特点:1、千万不要对着未声明的变量直接赋值:a=1;//会导致全局污染,全局本来没有的东西,突然被添加一坨内存,建议创建变量时,记得一定要写var
    
  • 2、儿子不孝啊:局部的东西全局居然不能用,解决:看上面

  • 3、哪怕没有写return,其实最后也有return值,只不过是一个return undefined,不喜欢undefined,默认return undefined

  • 4、return一般只会出现在函数的最后,而且只能出现一个

  • 5、往往前辈们提供的方法,底层都有一个return操作,前辈们觉得以后用这些方法的人,可能还需要拿着这个结果去做别的操作

  • 4-3.声明提前:师爷留下的问题之一,真正开发绝对不会用到,只会出现在笔试之中

  • 原理: 在程序正式执行之前,会悄悄地将var声明的变量和function声明的函数, 集中提前到当前作用域的顶部, 变量比函数轻,但是赋值留在原地; 明说:自己写代码绝对不会碰到,只要我们遵守原则:1、先创建后使用2、变量名和函数名尽量的不要重复只有鄙视中碰到,如果你以后碰到先使用在创建,或者经常重复变量名,很有可能就是在考你声明提前先转为我们提前后的样子,再去判断

  • 5 预定义全局函数:前辈们提前写好的,我们程序员可以直接使用的,全局(在任何地方都可以使用)

  • 5-1编码和解码:编码:var code=encodeURIComponent("剑风传奇"); 解码:var 原文=decodeURIComponent(code); 但是这个东西在某次浏览器更新后,当前就淘汰了!浏览器现在自带此功能。

  • 、isFinite(num):判断num是不是无穷大,true->有效数字,false->无穷大哪些会为false:NaN、Infinity、分母为0,所以有多个都为false,不能用来判断是不是NaN;

  • 厉害的:parseInt/Float、isNaN、eval(字符串脱衣服,字符串拼接运算的时候)

  • 6***分支结构:switch...case...:根据条件的不同,选择一部分代码执行语法: switch(变量/表达式){ case 值1:操作1;break; case 值2:操作2;break; default:默认操作; }

    特殊:1、case的比较不带隐式转换的 2、问题:默认只要一个case满足后,会将后面所有的操作全部做完

  • 解决:break;建议:每一个case的操作后都跟上一个break;

  • 有的地方也可以省略break:

  • 1、最后的一个操作default可以省略break

  • 2、如果中间多个条件,做的操作是一样的,也可以省略掉中间的操作

  • 3、default可以省略不写,如果条件都不满足的情况,则什么事都不会执行

  • 面试题:if vs swtich

  • 1、switch:好处:执行效率相对较高缺点:必须要知道最后的结果才能使用,case不能做范围判断

  • 2、if好处:可以做范围判断 缺点:执行效率相对较低; 开发时:用哪个都无所谓代码优化:尽量的将if换成switch;

. -6***循环结构 var 循环变量=几; while(循环条件){循环体,循环变量变化}; var 循环变量=几; do(循环体;循环变量的变化)while{循环条件};

面试题while和do...while的区别?除了写法上有区别,还有一个点:只看第一次如果第一次大家都满足,两者其实没区别如果第一次大家都不满足。while一次都不会执行,而do...while至少会执行一次

  • 3.for循环var 循环变量=几;循环条件;循环变量的变化){循环体; } 确定循环次数用for循环,不确定用if循环;
  • 4.终止循环语句:break;//退出整个循环 continue;//退出本次循环,还会继续做下一次
  • 7 数组 俩种 索引数组:
    • hash数组 下标是可以自定义的数组 为什么要自定义下标:索引数组的下标无具体的意义,不便于我们查找。 如何创建: var arr=[]; arr['自定义下标']=新值; 访问 arr['自定义下标']; 遍历 for(var i in 数组名){ 数组名[i] } 无敌发for in 可以遍历索引数组,也可以遍历hash数组;
    ***JS中除了undefined和null不是一个对象,万物皆对象,而【一切对象的底层都是hash数组】
  •    面试题:hash数组原理
    
  •    hash算法就是:将字符串交给hash数组,会得到一个尽量不重复的数字,但是字符串内容相同,得到的数字一定相同;
    
  •    添加元素:将自定义下标交给hash算法,得到一个数字(地址值),把要保存的数据保存;
    
  •    读取数据:将指定的自定义下标教给hash算法,会得到一个和添加时完全相同的数字(地址值);通过这个地址值可以拿到最初保存的东西;
    
  • 7 数组的API,其实就是前辈们提前定义好的一些函数,我们程序员可以直接使用,这些函数只有数组可用
  • 7-1***** 数组转为字符串
  •  var str=arr.join("指定字符");
    
  •  特点 1.如果没有传入实参,和tostring()效果一致,默认,隔开; 
    
  • 面试题 如何实现无缝拼接;
    
  • var arr=["h","e","l","l","o"," ","w","o","r","l","d"];
    
  • console.log(arr.join(""));
  • 2.***** 将数组元素拼接为页面元素(数据渲染);
  • 获取数据:var arr=["-请选择-","北京","南京","西京","东京"];
  • 拼接字符串:var str=""+arr.join("")+""; 让字符串上DOM树,innerHTML是识别标签 select.innerHTML=str; 二级联动:4个关键点
  • 1、必须使用二维数组,细分每一个城市,并且二维数组的顺序要和之前的一维数组对应;
  • 2、select.οnchange=function(){} - 状态改变事件:只有选中项发生变化时,才会触发;
  • 3、select可以直接获取当前选中项的下标,而不需要自定义下标;select.selectedIndex;
  • 4、其实绑定事件,等号左边部分就是你的函数名; 7-2**拼接数组:添加元素到末尾;
  • var newArr=arr.concat(值1,arr2...);
    
  • 特点此方法不会修改原数组:
    

1.必须拿一个变量去接住结果(返回的一个新数组) 2、哪怕拼接的是一个数组,悄悄的打散数组,单个添加; 7-3截取子数组:从数组某一部分开始拿去

  • var newArr=arr.slice();
    
  • 特殊:1.不会修改原数组,需要有一个变量接住;
    
  •         2.含头不含尾:末尾的下标要加1才能拿到            
    
  • 3,如果2个参数都省略,就是复制了一份,深拷贝,互不影响; 
    
  • 4.支持负数参数,-1代表倒数第一个,-n代表倒数第n个

  • 5.、如果只传入了一个实参,则为从starti开始,到末尾

  • ————————————————————————————————-前三个API都不修改原数组; 7-4删插替

    1.  splice
      
    1.  删除:var dels=arr.splice(starti,n);//从starti位置开始删除n个元素
      
    1. 特殊:返回的是你删除的元素组成的数组 - 有可能你删除的正好是你需要的
    1. 插入:var dels=arr.splice(starti,0,新值1,....);
    1. 特殊:1、原来starti位置的元素以及后续元素都会被向后移动
    1. 2、没有删除元素,也有返回值,返回的是一个空数组而已
    1. 替换:var dels=arr.splice(starti,n,新值1,....);
    1. var dels=arr.splice(starti,0,新值1,....);
    1. 特殊:删除的个数 和 插入的个数不必相同 7-5 翻转数组 arr.reverse()只能翻转; 7-6数组排序 arr.sort() 特点:1.默认转为字符串,按位PK每个字符的unicode(ascii) 2、希望按照数字排序 - 升序 arr.sort(function(a,b){return a-b;}) a是后一个数,b是前一个数: 如果a>b,就会返回一个正数,说明后一个数> 前一个数如果a<b,就会返回一个负数,说明后一个数< 前一个数如果a==b,就会返回一个0,说明后一个数==前一个数而sort的底层就能通过你返回的值来判断要不要帮你交换位置 7-10栈和队列:添加元素和删除元素的新方式 队列:只能一端进入,另一端出 - 现实生活中较多,何时使用:按照先来后到的顺序 栈:一端封闭,只能从另一端进出 - 现实生活中较少,何时使用:希望使用到最新的数据的时候;
  • 开头插入:arr.unshift(新值,....)

  • 开头删出:var first=arr.shift();//一次只能删除一个,而且一定是删除的第一个元素,有可能删除的东西就是你需要的东西

  • 不喜欢:开头进出,会导致每个元素的下标都会发生变化

  • 结尾入:*arr.push(新值,...);
    
  • 结尾出:var last=arr.pop();//一次只能删除一个,而且一定是删除的最后一个元素,有可能删除的东西就是你需要的东西

  • 至少不会影响到其他人的位置 以上4个API可以混搭;

  • 8-*二维数组:数组的元素,又一次引用了一个数组 何时使用:你希望再一个数组内再次细分分类 如何使用:var peoples=[ ["吴飞华",18,"洪兴"], ["冯伟朕",19,"东英"], ["封永跃",20,"三联"] ]; 访问:arr[r][c] - r代表行下标,c代表列下标 特点:1、列下标越界,返回undefined 2、行下标越界,返回报错,因为行下标越界已经得到undefined再加[]则报错 如何遍历:for(var r=0;r<people.lengrg;r++){ for(var c=0;c<people[r].length;c++){ console.log(people[r][c])}}

  • 9.****string的基础概念: 什么是字符串:多个字符串组成的【只读】字符【数组】 ; 1.【只读】:字符串所有的API都不会修改原字符串,只会返回新的字符串; 2、【数组】:跟数组有相同点: 字符串可以使用下标获取某个字符 字符串可以使用length获取字符的长度 字符串可以遍历得到每个字符 字符串可以使用数组不修改原数组的API(concat、slice) 差异:所有数组直接修改原数组的API,字符串都不可以使用!字符串自己也有一堆API 10.***js内置对象(引用类型):11个: string Number Boolean->包装类型; Array function Date Math RegEXP Error objiect Global 1、保存着全局变量和全局函数,只不过浏览器端/客户端/前端global被window代替了,以后我们学习Node.js后端语言的时候你会发全局真的是global 2、唯独window对象可以省略不写 ; 包装类型:专门封装原始类型的值,将原始类型悄悄的变成了引用类型的对象(属性和方法) 为什么:前辈们觉得比如字符串经常会被我们拿来做一些操作,为了方便我们程序员,提供了包装类型,把字符串变成了一个对象,提供了我们一些操作字符串的属性和方法 本身原始类型的值,不带有任何属性和方法,意味着不能使用.去做操作的 何时使用:只要你试图使用.去操作原始类型的值的时候,包装类型就会悄悄出现 何时释放:方法一旦调用结束,包装类型就会自动释放

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值