JS第二周小结

179 阅读6分钟

一、数据类型转换

强制转换

转字符串

elem.to string()

undefined和unll不能调用此方法

string(elem)

万能的,但是没有什么用,相当于隐式转换,可用+代替

转数字

1、parseInt(str/num)

用于将字符串或者数字转为整数,从左到右一次读取每一个字符,遇到非数字就停止,如果一开始就是非数字,则结果为NaN;

2、parseFloat(str)

用于将字符串转为浮点数,从左到右依次读取每个字符,能识别第一个小数点; ####/3、Number() 万能的,相当于隐式转换,可用-0、*1、/1代替

转布尔

Boolean() 相当于隐式转换,可用!!x代替, 只有 0,null,undefined,NaN,false这6个转布尔结果为false,可用于条件判断中;

隐式转换

出现在运算符之中

二、运算符和表达式

算数运算

1、+运算

+运算只要碰上字符串,就会变成连接符

2、-*/%运算

纯数字组成的字符串也可以转为数字,但是非纯数字字符串则为NaN NaN参与任何算术运算结果都为NaN

比较运算

比较运算左右两边会默认转为数字,再比较,结果为布尔值 1、如果左右【两边】参与比较的都是字符串,则是按位PK每个字符的十六进制的unicode号(十进制ascii码); 0-9<A-Z<a-z<汉字 2、NaN参与任何比较运算结果都为false,甚至不认识自己; 解决: !isNaN(x); true->有效数字 false->NaN 3、==是等于,带有隐式转换,不能区分出undefined和null; ===是全等,要求数值和数据类型都相同,不具有隐式转换,可以区分出undefined和null;

逻辑运算

&&、||、!

短路逻辑

1、&&短路

语法:条件&&(操作) 如果前一个条件为true,则后一个操作才执行; 如果前一个条件为false,则后一个操作不执行; 能够简化【简单的】分支:if(条件){操作};

2、||短路

如果前一个条件为true,则后一个不看; 如果前一个条件为false,则后一个才看; 使用场景:两个值二选一 - 后期做浏览器的兼容性问题的;

位运算

左移:m<<n,读作m左移了n位,相当于m*2的n次方 右移:m>>n,读作m右移了n位,相当于m/2的n次方 缺点:底数永远只能是2

赋值运算

+=、-=、*=、/=、%=、++、-- 注意区分++i和i++

三目运算

语法:条件?操作1:默认操作; 条件?操作1:条件2?操作2:默认操作; 可以简化简单的分支结构

舍入误差

num.toFixed(n); n代表保留的小数位数,根据你放入的小数位数自动四舍五入,结果会变成一个字符串,需要搭配上parseFloat使用;

获取字符的ascii码

var ascii=str.charCodeAt(0);

三、自定义function

创建

1、声明方式

function 函数名(形参....){ 函数体; return 返回值; }

2、直接量方式

var 函数名(形参....){ 函数体; return 返回值; }

调用

var x=函数名(实参...); return的本意是退出函数,但如果return后面跟着一个数据,return负责将数据返回到函数作用域的外部,需要重新声明一个变量来保存返回值;

作用域

全局作用域

全局变量 和 全局函数,特点:在页面的任何位置都可以使用;

局部作用域

局部变量 和 局部函数,特点:在【当前函数调用时内部可用】; 局部变量优先使用自己的,自己没有就找全局,全局没有就报错; 如果在函数中对未声明的变量直接赋值,该变量是全局变量,而不是局部变量,会导致全局污染,eg: var a=10; function fn(){ a=20; console.log(a); //输出20 } console.log(a); //输出20,函数fn的a=20为全局变量,导致了全局污染

声明提前(笔试题)

在程序正式执行之前,将var声明的变量(轻)和function【声明的】函数(重),都会悄悄的集中定义在当前作用域的顶部,但是赋值留在原地; 规则: 1.变量名和函数名尽量不要重复; 2.先创建后使用; 3.如果笔试时,遇到先使用后创建,考查声明提前;

按值传递

两个变量之间进行赋值

1.原始类型

如果传递的是【原始类型】的值: 修改一个变量,另一个变量是不会受到影响的,其实是复制了一个副本给对方

2.引用类型

如果传递的是【引用类型】的对象: 修改一个变量,另一个变量就会收到影响了,两者使用的是同一个地址值(浅拷贝)

四、预定义全局函数

编码、解码

编码:var code=encodeURIComponent(str); 解码:var 原文=decodeURIComponent(code);

isFinite(num)

判断num是不是无穷大:true->有效数字 false->无穷大 判断结果为false的有:NaN、Infinity、分母为0

parseInt/parseFloat/eval/isNaN

五、switch(){case}

语法: switch(变量/表达式){ case 值1: 操作1; break; case 值2: 操作2; break; default: 默认操作; } 1、case的比较不带隐式转换的; 2、默认只要一个case满足后,会将后面所有的操作全部做完,需搭配break;

六、关联(hash)数组

下标可以自定义的数组

1、创建

1.先创建一个空数组:var arr=[]; 2.为数组添加自定义下标并且添加元素值:arr["自定义"]=新值;

2、访问

arr["自定义"]

for in

hash数组length永久失效,永远为0! 遍历hash数组使用for in循环: for(var i in arr){ arr[i]; } for in不能定义从哪里开始,到哪里结束,专门用于遍历hash数组的;

七、数组的API

1、数组元素拼接:

var str=arr.join("自定义连接符"); 1.无缝拼接:var str=arr.join(""); 2.将数组的元素拼接为DOM页面元素,eg: //数据 var arr=["-请选择-","北京","南京","西京","东京","重庆"]; //转为字符串,并且拼接好了标签 var str="<option>"+arr.join("</option><option>")+"</option>"; //渲染到DOM树上 sel.innerHTML=str;

2、数组拼接:添加新元素的新方式:

var newArr=arr.concat(新值1,...); 根据你传入的实参全部拼接到arr的末尾 1.不修改原数组,只会返回一个新数组; 2.concat支持传入数组参数,悄悄的将你的传入的数组打散为单个元素后在拼接;

3、截取子数组:

var subArr=arr.slice(starti,endi+1); 根据你传入的开始下标截取到结束下标 1.不修改原数组,只会返回一个新数组 2.含头不含尾 3.endi可以省略不写,会从starti位置一直截取到末尾 4.两个实参都省略不写:从头截到尾,即深拷贝:和以前的按值传递的浅拷贝不同,是复制了一个副本给对方,两者互不影响了

4、删除、插入、替换:

1.删除:

var dels=arr.splice(starti,n);//n代表删除的个数; splice的返回值是删除的元素组成的一个新数组;

2.插入:

arr.splice(starti,0,值1,....); 1、在i位置依次插入新值,即新值永远在数列中的i位置; 2、返回值为一个空数组,因为没有删除; 3、不要直接插入一个数组,会变成一个部分二维数组;

3.替换:

arr.splice(starti,n,值1,...); 删除的元素个数不必和插入的元素个数一致;

八、二级联动

  1. onchange:状态改变事件:只有选中项发生变化才会触发,select的专属事件; 2.selectedIndex:直接获取到当前选中项的下标,select的专属属性;