第二周复习

208 阅读7分钟

第二周学习复习

数据类型转换

转字符串

1、x.tostring();  undefinednull不能使用,不可用‘.’调用
2、string();万能的方法
页面拿到的所有元素都是字符串

转数字

1、paseInt(); 专门用于将字符串转为整数   不认识小数点
2、faseFloat();专门用于将字符串转为浮点数(小数)  认识第一个小数点
3、number();万能的
建议用前两种方法

转布尔

1Boolean();
转为false6个:0、‘’、undefinednullNaNfalse
其余的都转为true
此方法多用于循环或者分支的条件判断中
例如:
    if(boolean(条件1)){}、、、、、、、
    while(boolean(条件)){}

算术运算符

算术运算符

+  -  *  %  /   
隐式转换:默认转为数字再做运算
特殊:+运算只要碰上字符串则会转为拼接;
      -  *  %  /  运算,纯数字组成的字符串也可以转为数字,非纯数字则为NaNNaN参与任何计算结果都为NaN

比较运算符

>,<,<=,>=,==,!=,===,!==
结果都为布尔值
隐式转换:两边都会转为数字在做比较。
特殊:
    如果时字符串之间作比较,则按照每个字符的十六进制的unicode号进行比较0-9<A-Z<a-z<汉字
    具体见下图:

ASCII.jpg

逻辑运算符

&&(并且):全部条件满足则为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(变量/表达式){
		case1:
		操作1;
		break;
		case2:
		操作2;
		break;
		default:
		默认操作;
	  }
   特殊:
   1case的比较不带隐式转换,可使用pasint解决
   2、最后一个default可以省略break
   3、如果中间多个条件做一个操作也可以省略break
   4default可以省略,如果条件都不满足则什么都不会做

面试题

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、不限制下标越界

遍历数组

forvar 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 循环)

forvar 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、必须用到二维数组(再次细分)