day-6
一:数据类型转换:
1.转字符串:x.tostring();undefined和null不能使用
String(x);完全等效于隐士转换
2.转数字:
1.parselint-转整数
2.parseFloat-转小数
Number(x)-万能,相当于隐式转换
3.转布尔
Boolean(x);万能的,相当于隐式转换
6个会转为false:0,'',undefined,null,NaN,false
其余的都为true
隐式类型转换都会出现在运算符之中
二、运算符和表达式:
1.算数运算:+ - * / %
隐式转换:默认会转为数字再运算
特殊:1.+运算,只要碰上一个字符串则会变为拼接;
2.- * / %,纯数字组成的字符串也可以转为数字,但是非纯数字字符串则为NaN(NaN参与任何算数运算都为NaN)
2.比较运算:< > <= >= == === !==
结果都为布尔值
隐式转换:默认在两边都转为数字再比较
特殊:如果两边参与比较的都是字符串,则是按位PK每个字符的十六进制的unicode号(+进制ascli码)
0-9<A-Z<a-z<汉字
百度搜索:中文字符集Unicode编码范围
汉字的第一个字:(Unicode:4e00,Ascll码:19968)
NaN参与任何比较运算结果都为false,甚至不认识自己
解决:!isNaN(x);true-有效数字;false-NaN
3.undefuned===null
问题:==区分不开undefined和null
全等:===,要求值和数据类型都相同---不再是带有隐式转换的比较运算
!==,不带有隐式转换的不等比较
三.逻辑运算符
隐式转换:会变成布尔值,在综合比较
&&:只要全部条件都满足,结果为true; 只要一个条件都不满足,则为false;
||全部条件都不满足,结果为false; 只要一个条件不满足,则为true;
!颠倒布尔值
特殊用法:
短路逻辑:
只要前一个条件已经可以得出最后结论,则后续代码不再执行;
#### &&短路,如果前一个条件为false,则后一个操作才执行;
如果前一个条件为false,则后一个不执行。
语法:条件&&(操作);
特殊:操作只能有一句话
||短路
如果前一个条件为true,则后一个不看;
如果前一个条件为false,则后一个不看。
使用场景:两个值二选一(后期作游览器兼容问题)
e=e/window.event;
位运算:左移:m<<n--m左移了n位,相当于m*2的n次方
右移:m>>n--m右移了n位,相当于m/2的n次方
位运算底数永远只能为2
赋值运算:一句话执行了两个操作,先运算再赋值
i+=1或者i++
递增:i++每次只能加一
累加:i+=n每次相加n
如果参与了别的表达式:变量中的值其实都会+1;
++i----返回的是递增后的新值;
i++----返回的是递增前的旧值
三目运算
语法:条件?操作:默认操作;
条件 1?操作1:条件2?操作2:默认操作;
只能简化简单的分支结构,默认操作不能省略。
总结:
if(){} == &&短路
if(){}else == 三目
if(){}else if(){}else == 三目
day-7 2022.4.7
一:自定义Function:
函数:先定义好,可以反复使用的一个代码段
使用:
创建: 1.声明方式:function 函数名(形参,...){函数体;return返回值}
2.直接量方式:var 函数名=function(形参,...){函数体;return返回值}
调用:
var (接住返回的结果)=函数名(实参);
return的本意是推出函数,但是return后面跟着一个数据;顺便将数据返回到函数作用域的外部,但是retuen只负责返回,不负责保存。
作用域:
1.全局作用域:全部变量和全局函数;
特点:在页面任何位置都可以使用
2.函数/局部作用域:局部变量和局部函数;
特点:在当前函数调用时内部可用;
使用规则:优先使用自己的,自己没有找全局的,全局没有就报错。
缺点:1.不要在函数中对未声明的变量直接赋值---全局污染;
2.局部可以用全局的,全局不可以用局部的---除非搭配return;
声明提前:
在程序执行之前,将var声明的变量(轻)和function声明的函数(重)都会悄悄的集中定义在当前作用域顶部,但是赋值就在原地;
声明方式创建的函数会完整的提前;
直接量方式创建的函数只有变量会提前;
按值传递
两个变量之间惊醒赋值
如果传递的是【原始类型】的值:修改一个变量,另一个变量是不会收到影响的,其实是复制了一个副本给对方;
入伏哦传递的是【引用类型】的值:另一个变量就会收到影响,两者使用的是同一个地址值(浅拷贝);
预定义全局函数:
前辈们定义好的方法,可以直接调用,在哪都可以使用;
1.编码和解码:
问题:url中不允许出现多字节符,否则会出现乱码;
UTF-8编码格式下,一个汉字就是3字节;
解决:发送前,前端将多字节符编码为单字节符(数字,字母);发送后,后端将单字节符解码为多字节原文;
使用:
编码:var code=encodeURIComponent(str);
解码:var 原文=decodeURIComponent(code);
2.isFinte(num):判断num是不是无穷大;
true--有效数字;
false--无穷大;
哪些为false:isNaN,infinty,分母为0
还有以下函数: parselint parseFloat eval isNaN
swich分支:
语法:swichu(变量/表达式){case值1:操作1;braek;case值2:操作2;break;default:默认操作;}
特殊:1.case的比较不带隐式转换
2.默认只要一个case满足后,会将后面的操作全部做完;
建议/解决:后面加上break;
有的地方可以不加break:
1.最后一个默认操作default可以省略;
2.如果有多个条件操作是一样的;
3.default可以省略,如果条件都不满足,什么都不做
day-8 2022.4.8
循环结构:
1.while(循环条件){循环体;变量变化}----不确定循环次数的时候
2.do{循环体;变量变化}while{循环条件}
3.for(循环变量;循环条件;变量变化){循环体}-----明确循环次数的时候
4.循环流程控制语句:
退出循环:break--退出整个循环
continue---推出本次循环,根据需求判断自己还需不需要执行后续的循环
数组的基础:
1.数组:在一个内存(变量)中保存多个数据的一个集合结构
2.创建:1.直接量:var arr=[值1,...];
2.构造函数:var arr=new Array(值1,....);
坑:var arr=newArray(5)---创建了一个长度为5的空数组;
3.访问:数组【下标】
添加/修改:数组名【下表】=新值;
4.数组的不限制:
1.不限制长度
2.不限制类型
3.不限制下标越界
5.数组的唯一属性:arr.length;获取数组的长度
三个固定套路:1.末尾添加arr【arr.length】=新值;
2.获取倒数第n个:arr【arr.length-=n】;
3.删除倒数n个:arr.length-=n;
6.遍历数组:对数组中每个元素执行相同/相似的操作;
for(var i=0;i<arr.length;i++){arr[i]操作}
索引数组:下标都是数字组成的数组
关联/hash数组:下标自定义;
使用:
创建2步:
1.先创建一个空数组:var arr=【】;
2.为数组添加自定义下标并且添加元素值----arr【'自定义'】=新值;
2.访问:arr【'自定义'】;
3.强调:hash数组length永久失效,永远为0!
遍历hash数组:只能使用for in循环:
for(var i in arr){arr[i]};
4.hash数组的原理:
hash 算法 :将字符串计算出一个尽量不重复的数字(地址值),字符串内容相同,则计算出的数字一一定是相同的;
添加元素:将自定义下标交给hash算法,得到一个数字(地址值),把我的元素保存到了这个地址值中;
读取元素:将指定的自定义下标交给hash算法,得到一个和添加时完全相同的数字(地址值),根据地址值找到之前保存的东西;
5.JS里面的一切东西都是对象:除了undefined和null;
一切对象的底层都是hash数组’
Array(数组)的API:
一.arr.to string;
var str=arr.join('自定义连接符');
固定套路:
1.笔试题:将数组中的内容拼接在一起形成一句话/单词;
无缝拼接:var str=arr.join('');
2.将数组的元素拼接为DOM页面元素:
//数据:var arr=[‘-请选择-’,‘北京’,‘南京’];
//转为字符串,并且拼接好了标签;
car str=''+arr.join('')+'';
渲染到DOM树上:sel.innerHTML=str;
2.数组拼接:添加新元素的新方式: var newArr=arr.concat(新值1,...);
根据传入的实参,全部拼接到arr的末尾;
特殊:
1.不修改原数组,只会返回一个新数组;
2.concat支持传入数组参数,悄悄的将你传入的数组打散为单个元素后再拼接;
3.截取子数组:var subArr=arr.slice(starti,end+i);
根据传入的下标开始截取到结束下标;
特殊:1.不修改原数组,只会返回一个新数组;
2.含头不含尾;
3.endi可以省略不写,会从starti位置一直截到末尾;
4.其实两个实参都可以省略不写;从头截到尾:深拷贝;和以前的按值传递的浅拷贝不同,是赋值副本给对方,不相互影响;
以上三个API都不会修改原数组
以下API会修改原数组
4.删除/插入/替换:
删除:var dels=arr.splice(starti,n)----n代表删除个数;
特殊:其实splice也有返回值,返回的是删除元的组成的一个新数组;
插入:arr.splice(starti,0,值1,....);
特殊:1.插入新的元素和后续元素都推到后面如;
2.也有返回值,如果没有删除任何元素则为一个空数组;
3.千万不要直接插入一个数组,会变成一个部分二位数组;
替换:arr.splice(starti,n值1,...);
特殊:删除的元素个数不必和插入的元素个数一致;
5.翻转数组:arr.revrese();
select的专属事件:onchande;状态改变事件;只有选中项发生变化才会触发’
select的专属属性:selsectedlndex;直接获取到当前选中项的下标。