2周
隐式转换:一般出现在运算符和表达式中
运算符和表达式
1算术运算符:+-*/%
隐式转换:默认转为数字,在运算
特殊点:
1.+运算,只要碰上字符串,两边都会转为字符串,在拼接
2.-*/%只要是纯数字组成的字符串,也可以转为数字
转字符串:
1:xx.tostring();//xx不能是undefined和null,两者不能使用
2:string(xx);等效与隐式转换
但是一般来说两个都不会用,页面上获取到的都是字符串
复制代码
转数字:
1:字符串to数字:parseint/Float(str);
从左向右一次读取每个字符,碰到非数字字符就停止转换,如果一开始就不认识,则为NaN
2:Number(xx);
只有六个为false: 0," ",undefined,null,NaN,false,其余的都为true
某些地方自带:1.分支条件
2.循环条件
2.比较/关系运算符: < > <= >= == != === !==
返回的结果:布尔值:true false
隐式转换:默认一切都是数字,在比较大小
特殊点:
1.如果参与比较的两个都是字符串,按W位pk每个字符的十六进制unicode号
0-9<A-Z<a-z<汉字
汉字第一个字: 一 :4e00(ASCII码:19968)
汉字最后一个字: 龥 :(ASCII码:40968)
2.NaN参与热河比较运算结果都为false,解决:!isNaN(x);
x是一个数字,结果为true
想是一个NaN,结果为false
3.undefined==null
问题:null==undefined结果为true,区分不开undefined和null
解决:全等===:数值相同并且数据类型也要相同
!==:不带隐式转换的不等比较
//String()的执行原理:任何东西都可以转为字符串
function String(x){
if(x===null){
console.log("null");
}else if(x===undefined){
console.log("undefined");
}else{
console.log(x.toString());
}
}
#### 逻辑运算符
&&:全部条件都为true,结果才为true 只要有一个为false,结果就位false ||:全部条件都为false,结果才为false 只要有一个为true,结果就位true !:颠倒布尔值 特殊点: 短路逻辑:只要前一个条件已经可以得出最终结论,则后续条件不会在执行 &&:如果前一个条件满足,则后一个操作才执行,如果前一个条件不满足,则后一个操作不执行 实现了一个简单的分支结构:简化if(){}.但操作只能是一句话 语法:条件&&(操作); 举例: if(total>=500){total*=0.8} total>=500&&(total*=0.8) ||:两个值中二选一,不用
位运算
1.右移:m>>n,读作m右移了n位,m/2的n次方-缺点:底数只能是2
2.左移:m<<n,读作m左移了n位,m*2的n次方-缺点:底数只能是2
赋值运算: += -= *= /= %= ++ --
一句话完成了两个操作,先运算在赋值回去
例:i++ => i+=1 => i=i+1;
递增:i++,每次只能加1 累加:i+=n,每次加几由我们自己决定 ++i 和 i++ 的区别? 1、单独使用时,放前放后无所谓都一样 2、如果参与了别的表达式,变量中的值都会+1 前++,返回的是加了之后的新值 后++,返回的是加了之前的旧值
三目运算 -简化if...else if...else if...else
使用:1.条件?操作1:默认操作;
2.条件1?操作1:条件2?操作2:条件3:操作3:默认操作;
特殊点:
1、只能完成【简单】的分支 - 操作只能有一句话,其实以后很多分支里面可能真的就只有一句话
2、默认操作不能省略 - 会报错
##### 拓展:
1.计算时会带有摄入误差:解决:var str=num.toFixed(保留小数位数); - 按小数位四舍五入,但是返回的会是一个字符串
2.、获取第一个字的ascii码:var ascii=str.charCodeAt(0);
### 自定义函数 :
方法:一段被提前定义好的,可以反复舒勇的代码段
return返回值;
}
函数名其实也是一个变量名.
2.形参
解码:var 原文=decodeURIComponent(code);
switch...case结构
switch(变量/表达式){
case值1:操作1;break;
case值2:操作2;break;
default:默认操作;
}
注意:
1.默认只要满足一条路,会把后面的所有操作全部做完,可以加break解决,放在操作后面,但最后的default不需要加break,如果连续的多个操作是一样的效果,可以省略中间部分
2.不带有隐式转换
3.default可以省略
switch:
优点:效率相对较高,不需要做任何范围判断
缺点:不能范围判断,必须要知道用户有可能输入的结果是什么才能使用
if:
优点:实现范围判断
缺点:效率相对较低
建议:js优化,尽量将if优化为:三目,短路,switch
#### 1.while循环
语法:var 循环变量=几;
while(循环条件)={
循环体;
变量变化;
}
2.do...while循环
语法:var 循环变量=几;
do{
循环体;
变量变化;
}while(循环条件)
while和do...while的区别
①:只看第一次,如果大家都满足条件,没有区别
②:如果第一次都不满足条件,while一次都不执行,而do...while至少会执行一次
#### 3.for循环
for(var 循环变量=几;循环条件;变量变化){
循环体;
}
#### 4.循环终止语句
break-退出整个循环
continue-退出本次循环
### 数组的基础:一个变量可以保存多个数据
#### 1.创建
①:直接量方式:var arr=[值1,...]
②:构造函数:var arr=newArray(值1,..)
2.访问
获取:arr[i]; 特殊:下标越界得到undefined
添加/替换:arr[i]=新值; 特殊:下标越界得到稀疏数组
3.三大不限制
1:不限制长度
2:不限制元素类型
3:不限制下标越界
#### 4.length的三个固定套路
1:获取倒数第n个元素:arr[arr.length-n];
2:向末尾添加元素:arr[arr.length]=新值;
3:缩容:arr.length-=n;
5.遍历数组
for(var i0;i<arr.length;i++){
arr[i];
}
新知识点
关联(hash)数组:下标是可以自定义的数组
创建
一 创建
1.创建一个空数组: var arr=[];
2.添加自定义下标并且赋值:arr["自定义"]=值;
二 访问
arr["自定义下标"];
for in循环
语法:for (var i in数组名){
数组名[i];
}
hash算法:将字符串交给hash算法,会得到一个尽量不重复的数字,但是字符串内容相同的,那么得到的数字一定也是相同的
添加元素:将自定义的下标交给hash算法,得到一个数字(地址值),把要保存的数据放到那个地址之中
获取元素:将指定的下标交给hash算法,得到一个和添加时完全相同的数字(地址值),得到这个地址值之中保存这的数据了
### 数组的API:函数:前辈们定义好的,但是只有数组可以使用的方法
#### 1.数组转为字符串
语法
var str=arr.join("自定义连接符");
特殊:
1.如果没有传入实参,则和string/tostring完全一样,默认由,分割
2.固定套路:两个
①:笔试题:提供一个数组,无缝拼接数组里面的内容变为一个字符串
var arr=["h","e","l","l","o"," ","w","o","r","l","d"];
var str=arr.join("")
console.log(str);//"hello world";
②:开发:将数组中的数据拼接为页面上的元素,初级版数据渲染
var cities=["北京","南京","西京","东京","重庆"];
var str="<option>"+cities.join("</option><option>")+"</option>";
sel.innerHTML=str;//innerHTML可以识别标签
二级联动
1、必须使用二维数组,而且二维数组的数据顺序一定要和一级的对应上
2、select专属事件:select.onchange:状态改变事件:选中项发生改变才会触发
3、select具有一个属性:this.selectedIndex;获取选中项的下标 - 只有select不需要自定义下标
4、其实绑定事件的部分就是函数名,也可以拿来调用
拼接数组:添加元素到末尾的新方式
var newarr=arr.concat(值1,arr1...);
特殊:
1.此方法不会修改原数组,只会返回一个新数组
2.此方法传参支持数组参数,并且会悄悄地打散这个数组,单独传入
截取子数组:从starti位置截取到endi+1位置的元素,组成一个新数组
var subarr=arr.slice(starti,endi+1)
特殊:
1.此方法不修改原数组,只会返回一个新数组
2.含头不含尾
3.第二实参可以省略:从starti截取到末尾
第一实参省略:从头截取到末尾
4.支持副参数
删除,插入,替换
删除:var dels=arr.splice(starti,n); 从starti卡死删除n个
特殊:此方法也有返回值,所有删除的元素组成一个新数组
插入:arr.splice(starti,0,值1,...);
特殊:原来starti位置的元素以及后续元素都会被向后移动
替换:var dels=arr.aplice(starti,n,值1,..);
特殊:插入的个数和删除的个数可以随意
翻转数组:arr.aeverse();
Array API
排序:两种方式
1.冒泡排序:把数组中的每一个数字取出来,前一个和后一个进行比较,如果前一个>后一个,两者就要交换位置
公式
var arr=[13,25,4,3675,12,23,3,215,2,1,42,4,65,473,2431,123];
for(var j=0;j<arr.length-1;j++){
for(var i=0;i<arr.length-(j+1);i++){
if(arr[i]>arr[i+1]){
var m=arr[i];
arr[i]=arr[i+1];
arr[i+1]=m;
}
}
}
console.log(arr);
2.正式开发:数组API提供的排序
arr.sort();
特殊:
1.默认按照字符串按位pk每个字符的unicode号
2.按照数字排序:arr.sort(function(a,b){
return a-b;
}
return a-b: 如果a>b,返回的是一个正数
如果a<b,返回的是一个负数
如果a=b,返回的是一个0.
sort根据你反复的结果,来判断两者要不要交换位置
3.降序排列:arr.sort(function(a,b){
return b-a;
}
栈和队列:添加元素和删除元素的新方式
栈:一端封闭,只能从另一端进出额操作
1.开头进:arr.unshift(值1,...);
开头出:var first=arr.shift();//一次只能删掉一个,并且会返回删除的元素
缺点"每一次进出都会修改其他人的下标
2.结尾进:arr.push(值1,...);
结尾出:var last=arr.pop();//一次只能删掉一个,并且会返回删除的元素
优点:不会影响到其他元素的下标
队列:只能从一端进入.另一端出
1.开头进:arr.unshift(值1,...);
结尾出:var last=arr.pop(): 一次只能删除一个,并且会返回删除的元素
2.结尾进:arr.push(值1,...);
开头出:var first=arr.shift(); 一次只能删除一个,并且会返回删除的元素
拓展
1.定时器
开启定时器:
timer=setInterval(function(){
操作
},间隔毫秒数)
关闭定时器:
clearInterval(timer);
2.鼠标移入:onmouseover
3.鼠标移出:onmouseout
二维数组:数组中的值再次引用了一个数组
1.创建
var arr=[
[数组1],
[数组2],
[数组3],
];
2.访问:arr[r][c];
特殊:面试中:
列下标越界:返回undefined
行下标越界:报错:undefined不能使用[]
3.遍历二维数组:须要两个循环嵌套:外层循环控制行,内层循环控制列
for(var r=0;r<arr.length;r++){
for(var c=0;c<arr[r].length;c++){
console.log(arr[r][c]);
}
}
string的概念
string:字符串:多个字符组成的只读字符数组
为什么字符串也可以叫数组
1.和数组的共同点
①:支持下标-获取某个字符
②:支持length-字符的长度
③:遍历
④:数组不修改原数组的API,字符串也可以使用concat,slice
2.不同点:数组修改原数组的API,字符串都不可以使用,但字符串有很多属于自己的API
只读:字符串中的所有的API都不会修改原字符串,只会返回新字符串
引用类型的对象:11个
String(字符串),Number(数字),Boolean(布尔)--具有包装类型:将原始类型的值变为一个引用类型的对象
Array(数组),Function(函数),Math(数学),Date(日期),RegExp(正则),Error(错误),Object(面向对象)
Global(全局对象)
String API
1.转字符串:\
作用:
1.字符串中如果出现了和字符串冲突的符号,可以用\将其转义为原文
2.特殊功能:
换行:\n
制表符:\t
3.可以书写unicode号,表示一个字
\uxxxx
2.转换大小写:统一的转换为大写或小写,在比较,忽略大小写
大写:var newstr=str.toUpperCase();
小写:var newStr=str.toLowerCase();
3.获取字符串中指定位置的字符的ASCII码
var ascii=str.charCodeAt(i);
转为原文:
var 原文=String.fromCharCode(ascii);
检索字符串:检查索引下标:从starti位置开始找右侧的第一个关键字的下标
作用:判断有没有
var i=str/arr.indexOf("关键字",starti);
特殊:
1.starti可以省略,如果省略则从0开始
2.返回值:找到了,返回第一个字符的下标
没找到,返回-1
3.数组也可以使用此方法
4.笔试题:找到所有关键字的位置
var str="no zuo no die no can no bibi";
var i=-1;
while((i=str.indexOf("no",i+1))!=-1){
console.log("找到了:"+i);
}
拼接字符串:var newStr=str.oncat(str1.str2...)
截取字符串
1.var subStr=str/arr.slice(starti,endi+1);
2.var subStr=str.substring(starti,endi+1); 不支持负数参数
3.var subSTr=str.subStr(starti,n); 截取的个数,不考虑含头不含尾
替换字符串
var newStr=str.replace("关键字"/正则表达式."新内容");
切割/分割字符串
作用:str<=>arr
var arr=str.split("自定义切割福");
特殊:
1.切割符可以自定义,切割后返回一个数组,数组中不包含切割符
2.如果传入的切割符是一个"",每一个字符都会被切开
拓展:创建元素并渲染页面
1.创建空标签
var elem=document.creaElement("标签名");
2.设置必要的属性或事件
elem.属性名="属性值";
elem.on事件名=function(){
函数体;
}
3.创建好的元素渲染到DOM树上
父元素.appendChild(elem);