js基础(第二周)

83 阅读12分钟

day6:

数字类型的转换

1:强制转换

a:转字符串

var str=x.tostring() //x 不能是un和null

var str=string (x) //万能的,完全等效于隐式转换,还不如+“”

b:转数字

parse Int/Floath(str) //专门为字符串转数字准备的 。原理:从左到右一次读取每个字符,碰到非数字字符则停止, Number(X) //万能的,完全相当于隐式转换

c:转布尔

Boolean(x);//万能的,任何人都可以转布尔,绝不会手动去使用,!!xx(反用)

只有6个会为false:0 " " false un null NaN

2:隐式转换:都是出现在运算符之中

运算符和表达式

1:算术运算符合:+ - * / %

特殊:

1:% 取余,判断奇偶性

2:具有隐式转换,默认转为数字,再运算

un-->NaN

null-->0

true-->1

false-->0

特殊:****

  • 运算 ,碰上字符串,成为拼接
    • / % :字符串也可以转为数字,但是纯数字组成的字符串才行,包含非数字字符则为NaN

2:比较运算符: > < >= <= <=== !=== !==

结果:布尔值,触发隐式转换,转为数字,再比较大小

特殊

1:如果参与比较的左右两边都是字符串,则按位PK每个字符的+六进制的unicode号或者十进制的ascii码常识排序0-9< A-Z<a-z <汉字

常识 汉字的第一个字:一:un号4e00 as:19968

最后一个字:頫: un 号:9fa5 as:40869

2:NaN 参与任何比较运算都为false,所有没有办法使用普通的比较运算来判断xxx是不是NaN.一般用(!isNaN

3:区分un 和null

un==null //true

un === null //false

全等:=== 要求数值相同,并且数据类型也要相同,不在带有隐式转换

!== 不再带有隐式转换的不等比较

重写String方法,看出==和===的区别
function String(x){
if(x== =undefined){
return "undefined"; //return->返回,后面跟着的就是返回的结果
}else if(x= ==null){
return "null";
}else{return x.toString();}}

3:逻辑运算符

作用:综合比较,结果也是为布尔值。隐式转换:左右两边都会悄悄转为布尔值,再综合比较结果

&&与:全部满足,才满足,一个不满足,都不满足

||或:全部不满足,才不满足,一个满足,则满足

颠倒布尔值

特殊: 短路逻辑 如果一个条件,已经可以得出最终结论了,没有必要看后续

&&与短路运算 如果前一个条件满足,才执行后一个操作,如果前一个条件不满足,则不管后续操作:目的简化【简单的】分支

语法:条件&&(操作)

||与短路运算:实现浏览器兼容问题

语法: 表达式1 || 表达式2

4 位运算

左移: m << n,读作m左移了n位,翻译:m*2的n次方
右移:m>>n,读作m右移了n位,翻译:m/2的n次方
垃圾:底数只能固定为2,虽然可以设置幂,但是不能设置底数



—句话完成两个操作,先计算,再赋值回去
                 

i++; //递增,每次只会固定+1 i+=1; //累加,每次加几由我们程序员决定 i=i+1; //最老土的写法

笔试/算法题:++ii++的区别?
	单独使用时,放前放后无所谓,效果一样

但是如果参与了别的表达式,变量中的值都会+1

	但是如果参与了别的表达式,变量中的值都会+1。                                                               
++前 【返回的是加了过后】的新值            
后++【返回的是加了过前】的旧值    

6:三目运算

简化if..else ...if..else..else

法: 1、条件? 操作1 : 默认操作; 看条件满足否,满足则作操作1,不满足则作默认操作

特殊:默认操作不能省略,省略会报错,如果操作有多句话,还是推荐if分支

day7

1:自定义函数

也叫做方法,需要预定义好的,以后可以反复使用的代码段

1:创建函数并调用的:2种

a:声明方式创建函数:用一个关键字function做声明

`function函数名(形参列表){

函数体;

return;}

调用函数函数名(实参列表)`

b:直接量方式创建函数:函数名其实就是一个变量名

`var 函数名=function(形参列表){

函数体;

return;}

调用函数:var result=(函数名实参列表); `

return的本意:退出函数的意思,只不过如果return 后面跟着一个数据,会顺便讲起返回全局作用域中,但是只负责返回,不负责保存:如果有return,记得拿一个变量借助结果

调用函数:var result=(函数名实参列表) 何时使用:如果你希望拿到函数的结果,以后还要做别的操作,就需要搭配.上return

2:作用域2种

1:全局作用域:全局变量和全局函数,在任何地方都可以使用

2:函数/局部作用域:局部变量和局部函数,在【函数调用时内部时可用】带来了变量的使用规则:【优先使用局部的,局部没有找全局,全局没有就报错】

特殊:

a:千万不要对着未声明的变量直接赋值:a=1 //会导致全局污染,全局没有的东西,突然被添加一坨内存,建议创建变量时,一定要var

b:局部的东西全局不能使用

c:哪怕没有return,其实最后也有return值,只不过返回的是一个un,

d:retun一般只会出在函数的最后,而且只能出现一个

3:声明提前:笔试重点

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

4:按值传递:两个变量之间进行赋值

如果传递的是原始类型的值修改一个变量,另外一个变量不会受到影响

如果传递的是引用类型的对象,那11个,修改一个变量,另外一个变量其实也会受到影响,因为大家操作的其实是一个相同的的【地址值】--浅拷贝

分支结构switch...case

根据条件的不同,选择一部分代码执行 语法: switch(变量/表达式) {case 值1:操作1;break

case\值2:操作2 ;break

default:默认操作;} 特殊: case的比较不带隐式转换的,问题:默认只要一个case满足后,会将后面所有的操作全部做完
解决: break; 建议:每一个case的操作后都跟上一个break;
有的地方也可以省略break: 1、最后的一个操作default可以省略break。2、如果中间多个条件,做的操作是一样的,也可以省略掉中间的操作。

面试题:if VS switch

1、switch:

好处:执行效率相对较高

缺点:必须要知道最后的结果才能使用,case不能做范围判断

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

扩展: JS动画:几乎和JS无关,与CSS有关(transition过度) JS操作样式:瞬间生效的,只需要加上过度就会慢慢生效 - animate.css动画库(库:很多很多的动画)

day4

1循环结构

while 循环

`语法:var 循环变量=几

while(循环条件){

循环体;

循环变量变化;}`

do---while 循环

` 语法:var 循环变量=几

do{

循环体;

循环体的变化;

} while(循环条件)` 、

两者之间的区别: 除了写法上有区别,还有一个点,就是只看第一次 如果第一次都满足,两者没区别,如果第一次都不满足,while一次都不会执行,而do--while至少会执行一次

终止循环语句:

continue;退出本次循环,还会继续做下—次

break;退出整个循环

2:数组的基础

创建:2种

1:直接量:var arr=[值1,值2...];

2:构造函数方式:var arr=new Array(值1,...) /缺陷:面试/笔试中:ar arr= new Array(3);这是什么意思–创建了一个长度为3的空数组

访问:数组名[下标]---某个元素 特殊:1:读取元素,下标越界返回un

添加元素,下标越界-在新位置添加元素,结果:是不好的,下标不在连续,--稀疏数组,拿去遍历一下,会得到很多的un

数组三大不限制:不限制数组的长度,不限制数组的类型,不限制数组下标越界-

length的三个固定套路

想末尾添加元素:arr[arr.length]=新值

获取倒数第n个元素:arr[arr.length-n]

缩容:删除倒数n个元素:arr.length-n

遍历数组

for(var i=0;i<arr.length;i++){

arr[i];}

释放一个引用类型: 释放一个应用类型的对象,切记一定要看清楚这几个对象有几个变量关联着;每个变量都要释放后才能真正的释放,最好的方式就是封装一个函数,因为函数中的东西,调用完毕都会自动释放。

索引数组:下标为数字组成的,默认

关联(hash)数组:下标是可以自定义的数组

如何关联数组创建:2步

1:先创建一个空数组:var arr=[]; 2:添加自定义下标并进行赋值:arr["自定义下标"]=新值

arr[自定义下标"];

访问:arr[自定义下标]

遍历: 把数组中的每一个元素取出来执行相同或相似的操作

不能使用for循环去遍历关联数组,因为length失效了,关联数组的length永远为0,而且我们下标也不再是一个数字。

解决: for in循环

语法: for(var i in数组名){
i://自动得到每一个下标
数组名[i];//当前hash数组中的元素了
}

既然可以遍历hash数组,也可以遍历索引数组,

为什么自定义下标:索引数的下标无具体的意义,不便于我们查找+

js中除了un和nu不是一个对象,其他万物皆对象,而【一切对象的底层都是hash数组】

面试:hash数组的原理

hash算法:将字符串交始hash算法,会的到一个尽量不重复的数字,但是字符串的内容相同,那么得到的数字也一定是相同

添加元素:将自定义下标交给hash算法,得到一个数字(地址值),要把保存的数据放进去

读取元素:将指定的自定义下标交给hash算法,得到一个和添加时完全相同的数字(地址值),通过这个地址值可以拿到当初保存的东西

3:数组的AP

其实就是前辈们提前定义好的一些函数,我们程序员直接拿来使用这些函数只有数组可用:

1:数组转字符串

var str=arr.join(“自定义链接符”)

特殊:

1:如果乜有传入实参,则和toString效果一致,默认都是用,隔开.

面试笔记中完成无缝衔接 var str=arr.join(“ ”)

2:将数组元素拼接为页面元素(数据渲染)

步骤:

a:获取数据 var arr=[“--请选择--”,“北京”,“西京”,“东京”,“重庆”]

b:将数组转为字符串,并拼接上标签、 var str=""+arr.join("")+"";

c:让字符串上DOM树,innerHTML是识别标签;

sel.innerHTML=str

二级联动

3个关键点:

1:必须使用二维数组,细分每一个城市,并且二维数组的顺序要和之前的一维数组对应

2:select.onchange=funtion(){} 状态改变事件:只有选中发生变化时,才会触发

3:select可以直接获取当前选中项的下标,而不需要自定义下标:select.selectedIndex

4:其实绑定事件,等号左边部分就是你的函数名

2:拼接数组:添加元素到末尾的新方式

var newArr=arr.concat(值1...)

特殊:

1:次方法不会修改原数组,必须那一个变量去接住结果(返回的是一个新数组)

2:哪怕拼接的是一个数组,悄悄打散数组,单个添加

3截取子数组

var subArr=arr。slice(starti,endi+1)

特殊

1:此方法不会修改原数组,必须拿一个变量去接住结果(返回的一个新数组)

2:含头不含尾

3:如果只传入一个实参,则为从starti开始,到末尾

4:如果两个实参都省略,则复制了一份--深拷贝,两者互不影响

5:支持负数参数,-1 代表倒数第一个,

4删插替

splice 删除 :arr.splice(stlarti,n)//从starti位置开始删除N个元素

特殊:返回的是你删除的元素组成的数组--有可能你删除的正好是你需要的

插入:var dels=arr.splice(starti,0,新值1,...)

特殊:

1:原来starti位置的元素以及后续都会被向后移动

2:没有删除元素,也有返回值,返回的是一个空数组而已

替换:var dels=arr.splice(starti,n,新值..)

特殊:删除的个数和插入的个数不必相同

day5

数组的排序API

笔试中:手写冒泡排序:从第一个元素开始,依次比较两个相邻的元素,如果前一个>后一个,两者就要交换位置

`var arr=[7,8,9,2,5,4,5,6,74,7,8,,98,18,3,5]

for ( var j=1;j<arr.length;j++){

for(var i=0;i<arr.length-j;j++){

    if(arr[i]>arr[i+1]){

       var middle=arr[i];

        arr[i]=arr[i+1]

        arr[i+1]=middle;
                           }
                             }
                               }`

`提供一个排序api

语法:arr:sort()

特殊:

1:默认转为字符串,按位pk每个字符的un和as

2:希望按照数字排序-升序

arr.sort(function(a,b){ return a-b;})

3:希望按照数字排序-降序

arr.sort(function(a,b){ return b-a;})

切记:以后网页中见到任何带有排序功能的特效,说明它的底层一定是数组,因为JS中只有数组可以排序,先排序再数据渲染\

2:栈和队列:添加元素和删除元素的新方式

一端封闭,只能从另外一段进出---合适使用:希望使用到最新扥数据的时候

开始:arr.unshift(新值,...)

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

结尾 结尾入:arr.push(新值...)

结尾出:var last=arr.pop()一次只能删除一个,而且一定是删除的最后一个元素

队列:只能一端进入,另外一端出

队列:以上4个API是可以混搭的
开头入: arr.unshift(新值.....)
结尾出: var last=arr.pop();
结尾入: *arr.push(新值,...);
开头出: var first=arr.shift(); `

`二维数组

数组的元素,又—次引用了—个数组

何时使用:你希望再一个数组内再次细分分类

如何使用:var peoples=[
["姓名a","年龄a“,"身高a"],
["姓名b","年龄b“,"身高b"],
["姓名c","年龄c“,"身高c"], ]

访问: arr[r][c] --- r代表行下标,c代表列下标

特殊: 1、列下标越界,返回undefined
2,行下标越界,返回报错,因为行下标越界已经得到undefined再加]则报错

如何遍历:

固定公式:外层循环遍历行,内层循环遍历列

固定公式:

for(var r=0;r<peoples.length;r++){

for(var c=0; c>peoples[r].length;c++){ console.log(peoples[r][c]) } }

3:String的基础概念

什么是字符串: 多个字符组成的【只读】字符【数组】

1、【只读】∶字符串所有的API都不会修改原字符串,只会返回新的字符串。

2【数组】︰跟数组有相同点:

1、字符串可以使用下标获取某个字符

2、字符串可以使用length获取字符的长度

3、字符串可以遍历得到每个字符

4、字符串可以使用数组不修改原数组的API(concat slice)

差异:所有数组直接修改原数组的APl,宁符串都不可以使用

JS内产对象(引用类型) : 11个

String Number Boolean
Array Function Date(日期)Math(数学) RegExp(正则:验证)
Error(错误)
Object(面向对象)
Global(全局对象)

String Number Boolean :具有包装类型
包装类型:专门封装原始类型的值,将原始类型悄悄的变成了引用类型的对象〔属性和方法)
为什么:前辈们觉得比如字符串经常会被我们拿来做一些操作,为了方便我们程序员,提供了包装类型,把字符串变成了一个对象,提供了我们一些操作字符串的属性和方法。
本身原始类型的值,不带有任何属性和方法,意味着不能使用.去做操作的

何时使用:只要你试图使用.去操作原始类型的值的时候,包装类型就会悄悄出现
何时释放:方法—旦调用结束,包装类型就会白动释放
为什么undefined和null不能使用.,他们俩没有提供过包装类型(没有任何属性和方法) Global(全局对象):
a、保存着全局变晕和全局函数,只不过浏览器端/客户端/前端global被window代替了
b、唯独window对象可以省略不写

扩展:

周期性定时器

开启: setlnterval(function(){操作;},间隔毫秒数)

停止:clearlnterval(timer):

鼠标的移入onmouseover和移出事件onmouseout