第二周学习复习
数据类型转换
转字符串
1、x.tostring(); undefined和null不能使用,不可用‘.’调用
2、string();万能的方法
页面拿到的所有元素都是字符串
转数字
1、paseInt(); 专门用于将字符串转为整数 不认识小数点
2、faseFloat();专门用于将字符串转为浮点数(小数) 认识第一个小数点
3、number();万能的
建议用前两种方法
转布尔
1、Boolean();
转为false的6个:0、‘’、undefined、null、NaN、false
其余的都转为true
此方法多用于循环或者分支的条件判断中
例如:
if(boolean(条件1)){}、、、、、、、
while(boolean(条件)){}
算术运算符
算术运算符
+ - * % /
隐式转换:默认转为数字再做运算
特殊:+运算只要碰上字符串则会转为拼接;
- * % / 运算,纯数字组成的字符串也可以转为数字,非纯数字则为NaN,
NaN参与任何计算结果都为NaN。
比较运算符
>,<,<=,>=,==,!=,===,!==
结果都为布尔值
隐式转换:两边都会转为数字在做比较。
特殊:
如果时字符串之间作比较,则按照每个字符的十六进制的unicode号进行比较0-9<A-Z<a-z<汉字
具体见下图:
逻辑运算符
&&(并且):全部条件满足则为true,一个条件不满足则为false
||(或者):满足一个条件则为true,全部条件均不满足则为false
!(非):颠倒布尔值
短路逻辑
作业:简化if分支
语法:条件&&(操作)
特殊:
只能用于简单的一操作的简化,多个条件操作还是用if
||短路
使用场景:两个值二选一,多用于做流浪器的兼容问题
例如:e=e||window.event
位运算
左移:m<<n,读作m左移了n位,相当于m*2的n次方
右移:m>>n,读作右移了n位,相当于m/2的n次方
缺点:底数运算只能是2
赋值运算
+=、-=、==、*=、/=、%=、++、--
使用场景:需要取出变量中的值,在做运算,之后还要保存回去
特殊:
++分为++i和i++
1、单独使用时,没有什么区别
2、如果参与别的表达式
++i,返回的是递增后的新值
i++,返回的是递增前的旧值
三目运算
目的:简化多个条件的if分支
语法:条件1?操作1:条件2?操作2:默认操作;
注意:默认操作是不可省略的
自定义函数
创建函数
1、声明方式创建函数:
function 函数名(形参1,、、){函数体;return 返回值;}
2、直接量方式创建函数:
var 函数名=function(形参1,、、){函数体;return 返回值;}
return的本意是退出函数,若后面跟了一个数据则表示把此数据返回到函数作用域的外部,但是return只负
责返回,不负责接收,所以需要在函数外部创建一个变量来保存
作用域
全局作用域
全局变量和全局函数
特点:在页面的任何位置都可以使用
函数/局部作用域
局部变量和局部函数
特点:在当前函数调用时内部可用
变量的使用规则
优先使用自己的,自己没有找全局,全局没找到就报错
特殊:1、前往不要在函数中对未声明的变量直接赋值,不然会导致全局污染 2、局部可用全局,但全局不可用局部,可使用return方法将函数局部的数据返回到外部使用
声明提前
在程序执行之前会将var声明的变量(轻)和function声明的函数(重)都会悄悄集中定义在当前作用域的顶部 但赋值会留在原地。
特殊:声明方式创建的函数会整个提前,
直接量方式创建的函数不会完整的提前,只是变量部分会提前。
按值传递
两个变量之间进行赋值
特殊:
1、如果传递的是原始类型的值,修改一个变量,另一个变量是不会受到任何影响的,相当于复制一个给对方。
2、如果传递的是引用类型的对象,修改一个变量另一个变。量也会收到影响,两者使用的是同一个地址值(浅拷贝)
预定义全局函数
编码和解码
编码:var code=encodeURIComponent(str);
解码:var 原文=decodeURIComponent(code);
switch分支结构
switch(变量/表达式){
case 值1:
操作1;
break;
case 值2:
操作2;
break;
default:
默认操作;
}
特殊:
1、case的比较不带隐式转换,可使用pasint解决
2、最后一个default可以省略break
3、如果中间多个条件做一个操作也可以省略break
4、default可以省略,如果条件都不满足则什么都不会做
面试题
if和switch有什么不同? swith必须知道结果才可以使用,不能做范围判断,但执行效率高,if可以做范围判断,但执行效率相对较低。
循环结构
while循环
while(循环条件){循环体;循环变量;}
do while循环
do{循环体;变量变化;}while(循环条件)
while 和 do while的区别
若第一个条件满足,二者无区别若第一个条件不满足,while什么都不会执行,而do while会执行一次
for循环
for(循环变量;循环条件;变量变化){
循环体
}
退出循环:break(退出整个循环)
continue(仅退出当前次循环)
数组的基础
创建数组
1、直接量:var 数组名=[值1,值2,、、、];
2、构造函数:var 数组名=newArray(值1,值2,、、);
方法二有一个缺陷:若var arr2=new Array(5);表示创建了一个长度为5的空数组
访问数组
数组名[下标];
添加修改
数组名[下标]=新值;
特殊:读取元素,下标越界,返回的是undefined,添加元素,下标越界会导致下标不连续,导致变成一个稀疏数组
数组的三大不限制
1、不限制长度 2、不限制类型 3、不限制下标越界
遍历数组
for(var i=0;i<数组名.length;i++){数组名[i];}
数组的唯一属性
数组名.length
1.末尾添加:数组名[数组名.length]=新值;
2.获取倒数第n个元素:数组名[数组名.length-=n];
3.删除倒数第n个:数组名.length-=n;
如何释放一个引用类型
线看清楚这个引用类型的数据有几个变量引用这着,每个变量都要释放后才可以释放干净。
索引数组
下标都是数字组成
关联(hash)数组
下标可以自定义
使用关联数组
创建
1、先创建一个空数组:var arr=[];
2、为数组添加自定义下边,并添加元素值:arr[‘自定义下标’]=新值;
访问
arr [‘自定义’]
强调
hash数组的length会永远失效,永远为0。
遍历hash数组 (for in 循环)
for(var i in arr){
arr[i]
}
JS里面的一切东西都是对象,除了undefined和null,一切对象的底层都是hash数组。
Arrayd API
自定义连接符
var arr1=arr.join(‘自定义连接符’);
数组拼接
var arr1=arr.concat(新值1,、、、、);
特殊:1、concat支持传入数组参数。
2、不会改变原数组,返回的是一个新数组
截取数组
var arr1=slice(starti,endi+1);
根据你传入的开始下标截取到结束下标。
特殊:1、不会更改原数组,返回的是一个新数组
2、endi可以不写,表示从开始小标一直截取到末尾
3、两个值都可以不写,表示从头截取到尾
删除、插入、替换数组
删除:var arr1=arr.splice(starti,n);
n表示删除个数
特殊:splice也有返回值,返回的是你删除的元素组成的新数组
插入:var splice(starti,0,值1,、、);
特殊:1、插入的元素会将原来的元素往后推
2、插入数组业余返回值,只不过是一个没有删除元素的空数组
3、千万不要直接插入一个数组,会变成一个一本分二维数组
替换:arr.splice(stari,n,值1,、、);
特殊:删除元素个数和插入元素个数不必一致
翻转数组
arr.reverse(); - 不会使用
二级联动
1、select的专属事件:onchange;//状态改变事件:只有选中项发生变化才会触发
2、select的专属属性:selectedIndex;//直接获取到当前选中项的下标
3、必须用到二维数组(再次细分)