二阶段4.6-4.8(第二周)

113 阅读6分钟

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;直接获取到当前选中项的下标。