第四周第二天笔记

1.数组去重的方法

  • 1)sort排序
    ary.sort(function (a,b) {
            return a-b;
    });//给ary数组进行升序排列;
    //注意:其中i的最大值为ary.length-1,因为存在i+1项;
    for(var i=0;i<ary.length-1; i++){
        if(ary[i]===ary[i+1]){
            ary.splice(i,1);
            i--;//防止数组塌陷问题;
        }
    }
    console.log(ary);
  • 2)新建一个空数组arr,然后放一个进去,然后遍历ary数组中的元素,用indexOf查找arr中是否存在ary中的元素,如果没有则放在里面;
var arr=ary.slice(0,1);
    for(var i=0; i<ary.length; i++){
        if(arr.indexOf(ary[i])==-1){
            arr.push(ary[i]);
        }
    }
    console.log(arr);
    console.log(ary);
  • 3)ary中第一项跟后面所有项比较,第二项跟后面所有项比较,相等的删除,注意数组塌陷问题;
console.log(ary);
    for(var i=0; i<ary.length; i++){
        for(var j=i+1; j<ary.length; j++){
            if(ary[i]===ary[j]){
                ary.splice(j,1);
                j--;//删除j项后,防止j的塌陷;
            }
        }
    }
    console.log(ary);
  • 4)对象去重,利用对象的不重名特性
var ary=[1,2,3,3,2,4,65,45,6,7,2,4,45,8,7,0,0];
//需求:把数组中重复的元素删除掉,利用对象的不重名特性;即改变原数组,最终获得的是原数组;
//思路:创建一个空的对象,将数组中元素作为对象的属性名,同时也作为该属性名的属性值,判断该属性是否已赋值,如果已赋值,则不是undefined,如果未赋值则为undefined;
var obj={};
    for(var i=0; i<ary.length; i++){
        var m=ary[i];
        if(obj[m]!=undefined){
        /!*判断obj对象中是否存在m属性名的属性值;通过判断属性名的存在与否来查重;此时判断条件不能为obj[m],因为如果m为0,则obj[m]值也为0;返回值均为假,所以如果数组元素为0,是不会被去掉的;*!/
            ary.splice(i,1);//在原数组中删除重复项,获得不重复的数组
            i--;//防止数组塌陷;
        }else{
            obj[m]=m;
           /*将属性名的值,作为属性值。此处最好方式是给obj[m]赋值为数字1,这样判断条件就可以使用if(obj[m]),如果属性名已被定义则为1,为真,进行删除步骤,如果属性未被定义,则返回undefined,为假,进行定义赋值;*/
        }
    }
    console.log(ary);
  • 5)对象去重,利用对象的不重名特性
var ary=[1,2,3,3,2,4,65,45,6,7,2,4,45,8,7,0,0];
//需求:获得一个由原数组中不重复的元素组成的新数组,并统计重复的次数;最终获得是一个新数组,这个新数组由obj对象中的属性名作为数组元素组成的;
//思路:创建一个空对象,利用对象的不重名特性进行排除,将数组中的元素作为对象属性名进行赋值,通过属性值来统计重复次数;最后再讲对象中的属性名作为数组元素,添加到一个新的数组中,获得该数组;
    var obj={};
    var arr=[];
    for(var i=0; i<ary.length; i++){
        var m=ary[i];
        //整体思路:将ary数组中的每一项作为属性名添加到obj对象中,重复判断条件,判断该属性的属性值是否存在,如果存在,即重复,不存在即不重复;给其添加属性值,即将属性定义到对象中;
        if(obj[m]){//判断obj[m]值是否存在,如果不存在,输出undefined,返回值false,则执行else语句,如果存在则为>=1的数值,数值返回值为true;
            obj[m]++;//当m属性名存在时,给属性值加一,用来获得重复次数;
        }else{
            obj[m]=1;//当属性名第一次添加时,给其赋值为1;
        }
    }
    //通过遍历obj对象,将属性名添加到arr空数组中;进而获取新数组;
    for(var att in obj){//for-in循环是一个一个进行循环的,每一次循环一个属性;
        console.log(att+":"+obj[att]);
        if(Number(att)){
             att=Number(att);//obj中的属性名为数字均以字符串形式作为数组元素;利用Number将其转化为数字;
         }
        arr.push(Number(att));
    }
    console.log(arr);
  • 6)获取对象中的每个属性名及以及每个属性值的方法,以及与数组的转换,NaN与isNaN的使用
<script>
    //考点1:获取对象中的属性名,放在数组中,获得对象中的属性值,放在数组中
    //考点2:NaN与isNaN的运用在if条件语句中
         //if(NaN){语句1}else{语句2}中,执行结果为语句2;if(isNaN(NaN)){语句1}else{语句2}中,执行结果为语句1;
        //NaN在正常情况下为假,只能执行else语句,若想让其执行if语句,给其添加isNaN()
    var obj={
        name:"guobin",
        age:18,
        sex:"nan",
        14:34,
        13:36,
        15:25,
    };//当定义普通对象时,乱序定义,但是当使用时,对象会重新排序,纯数字属性名以升序的形式排在前面,非纯数字在后面;即此时obj={13: 36, 14: 34, 15: 25, name: "guobin", age: 18, sex: "nan"};
    var arr=[];
    var arr2=[];
    for(var att in obj){//for-in循环是一个一个进行循环的,每一次循环一个属性;console.log(att+":"+obj[att]);
      /*  if(Number(att)){
            att=Number(att);
        }//此操作目的是将对象的属性中带有数字的字符串转化为数字;即"14"转化为14;*/
        arr.push(att);//将对象中的属性名作为数组元素,加入到arr数组最后一项;
        arr2.push(obj[att]);//将对象中的属性值作为数组元素,加入到arr2数组最后一项;
    }
    console.log(arr);//arr的结果为["13", "14", "15", "name", "age", "sex"];即对象属性名中的数字以字符串的形式添加到数组
    console.log(arr2);//arr2的结果为[36, 34, 25, "guobin", 18, "nan"];即对象属性值中的数字以数字的形式添加到数组
    //注意:在对象中,如果属性名为纯数字,那么他会默认按着升序的顺序排列,所以在用for-in循环遍历时,获取纯数字属性名以升序的形式排在前面,非纯数字在后面;
</script>
  • 7)实例:获取对象中的最高分数,并统计分数出现的次数;
var obj={
        xiaoming:83,
        xiaomei:45,
        xiaozhao:89,
        qi:98,
        tian:98,
        huai:89,
        mei:34,
        hao:45
    };
    var mass=[];
    for(var sort in obj){
        mass.push(obj[sort]);
    }
    mass.sort(function (a,b) {
        return b-a;
    });
    var n=mass[0];
    var mn=1;
    for(var i=1; i<mass.length; i++){
        if(mass[i]===n){
            mn++;
        }
    }
    document.write(n+":"+mn);
  • 7)实例:第二种代码
var obj={
        xiaoming:83,
        xiaomei:45,
        xiaozhao:89,
        qi:98,
        tian:98,
        huai:89,
        mei:34,
        hao:45
    };
    var max=0;
    var maxcount=0;
    for(var attr in obj){
        if(obj[attr]>max){
            max=obj[attr];
            maxcount=1;
        }else if(obj[attr]==max){
            maxcount++;
        }
    }
    console.log(max);
    console.log(maxcount);

2.Math属性及常用的方法

  • Math定义: Math无需定义,直接用Math作为对象;
  • Math属性:
    • Math.PI: 返回值为圆周率π;
  • Math常用的方法:九个
    • Math.random(): 随机数获取,0<=m<1区间的随机数;
      • 获得[n,m]之间的随机整数公式:Math.round(Math.random()*(m-n)+n);
    • Math.round(X):四舍五入,返回与X最接近的整数;
      • 若X与两侧整数同等接近,则结果接近正无穷的数值,即-4.5四舍五入为-4;4.5四舍五入为5;
    • Math.ceil():向上取整;
    • Math.floor():向下取整;
    • Math.abs():取绝对值;
    • Math.sqrt(X):开平方,
    • Math.pow(2,3):幂次方;2的3次方;
    • Math.max():取最大值;
    • Math.min():取最小值;

3.字符串常用的方法

  • 字符串常用的方法:七种;
    • 通过下标查找对应的字符
      • charAt(index):通过下标值(index)查找对应字符;
      • charCodeAt(index):通过下标值查找对应的字符编码;
    • 通过字符找下标值
      • indexOf(substring,startpos):从前往后查找;查找字符首次出现的位置,其中substring指的是查找的字符,startpos指的是从哪个位置开始查找,为可选值;
      • lastIndexOf(字符):从后往前查找;
    • 字符串的截取:
      • slice(n,m) 从索引n截取到索引m;不包含m;包前不包后;但是slice可以取负值;
      • substr(n,m) 从索引n开始,截取m长度个;m值可以省略,当省略后,从n开始一直截取到最后;
      • substring(n,m) 与slice相同,从索引n截取到索引m,不包含m;但是m,n均为非负整数;m值也可以省略,当省略后,从n开始一直截取到最后;
    • 字符串转换数组
      • split(separator,limit):字符串转换为新数组,原字符串不会发生改变;
        • separator: 分离器,用于分割字符串的字符;即将其转换为逗号;—可以取空字符“”;
        • limit:可选参数,即分割几次,数值等于数组元素的个数;
<script>
    //需求:将字符串转化为一个对象
    var str="name=美好&age=28&sex=男&爱好=音乐";
    function str2url(str1){
        var obj={};
        //1.将字符串切成数组;
        var ary=str1.split("&");
        //2.遍历数组
        for(var i=0; i<ary.length; i++){
            //3.数组每一项看做字符串,将其切割为数组;
            var ary1=ary[i].split("=");
            if(Number(ary1[1])){
                ary1[1]=Number(ary1[1]);
            }
            obj[ary1[0]]=ary1[1];//定义对象的属性名及属性值;
        }
        return obj;
    }
    var res=str2url(str);
    console.log(res);
</script>
  • 字符串转大小写:
    • toUpperCase():所有小写的英文字母转大写;
    • toLowerCase():所有大写的英文字母转小写;
<script>
    //需求1:"yuanmengyuan"变为"Yuanmengyuan"
    var str="yuanmengyuan";
    var ary=str.split("");
    ary[0]=ary[0].toUpperCase();
    var str1=ary.join("");
    console.log(str1);
    //第二种方法
    var str="yuanmengyuan";
    var str2=str.charAt(0).toUpperCase()+str.substring(1);
    console.log(str2);
</script>
  • 跟正则配合的字符串方法:
    • split();
    • match("在字符串中查找内容"): 使匹配,如果存在要查找的内容,则返回一个数组,数组元素有三项,其中第一项为查找到的内容,第二项为对应的索引值,第三项为原始字符串,如果不存在,则返回null;
    • replace("被替换的内容","替换的内容"): 不会改变原字符串,返回一个新的字符串;
    • search():搜索,找到返回其下标值,找不到返回-1;

4.隐式数据类型分类及比较

  1. 隐式数据类型分类
  • 提示种类
    • 如果一个元素存在某一属性,但是未设置,则使用的时候,就会报错: xxx is not defined;
    • 如果一个元素身上不存在此类属性,使用的时候,就会出现undefined,属性不存在不会报错;
    • 获取元素时,若未获取元素,则使用元素时,会报错:of null;
  • 数据类型
    • 基本数据类型(5种):字符串string,数字number,布尔值Boolean,null,undefined;
      • undefined出现的几种情况:1)函数变量找不到会报错,但是变量只声明未定义,则会返回undefined;2)函数定义中未设置返回值,此时函数为一个操作,而不是一个数值,所以使用函数的结果输出的值为undefined;3)对象身上的属性不存在的时候;4)定义了形参,但没有实参,拿到的参数是undefined;
  • 其他数据类型转化为number数据类型
    • 一个严格转换:Number();转换的字符串中只能存在数字,不能存在其他字符;即"123";可以保留小数;
    • 两个非严格转换:parseInt()-只能转化为整数,向下取整;parseFloat()-可以保留小数;
      • 如:var num="123.6666美好345";其中parseInt(num)转换结果为123;parseFloat(num)转换结果为123.6666;Number(num)转换结果为NaN;
    • 如果转换失败的话,返回的结果是NaN:not a number;不是数字;但NaN是number数据类型;
  • 关于NaN:
    • NaN是number数据类型;
      • 函数中在没有传实参时,两个变量相加,则值为NaN;
    function sum(m,n){
            alert(m+n);
            //当没有传实参的时候,拿到的n=undefined;m=undefined;
            //undefined+undefined=NaN;
        }
        sum();
    
    • isNaN()判断是否为非有效数字(即判断是否为NaN);非有效数字(为NaN时):true;有效数字:false;
  • 算术运算符:+,-,*,/,%
    • 加号"+":1)字符串拼接(只要不是数字间相加,其余的全部拼接);2)加法运算:全部是数字之间的加法;3)null+10的值为10;
    • 减号"-",乘号"*",除号"/",取余"%":全部进行数学运算,会默认进行数据转换(按照严格转换Number());
    • 比较:null在与数字进行运算时,会被严格转换为0;undefined参加运算时,会被严格转换成NaN,结果为NaN;
    • 例:("123px"+3)=123px3;("123px"*-/%3)=NaN;
  • 严格比较===:不仅在乎结果,而且在乎数据类型;非严格比较==:只在乎结果,不在乎数据类型;
    //==非严格比较,===严格比较 console.log(123=="123");//结果打印出true; console.log(123==="123");//结果打印出false;因两者数据类型不同;
  • 真假情况:
    • 假:共6个;空字符串“”,0,false,null,undefined,NaN;
      • 6个假中有两个为数据类型:0,NaN;
    • 真:除了假全是真;注:字符串中有空格的情况为真,即"空格";
  1. 隐式数据类型比较:
  • 转化基础:
    • 空数组[]默认通过toString()转化成空的字符串再通过Number转换成0;即[]—》""—》0;
    • null==undefined 为真;
    • null与数字比较为假,即:null==0为假;但是null+10==10为真;
    • undefined+10==NaN;
    • false默认转换为0;true默认转换为1;
  • 数字与其他类型比较
    • 数字==字符串 即:字符串非严格转为数字,如""==0,"123"==123;
    • 数字==布尔值 即:布尔值转为数字,其中(false默认为0,true默认为1)如0==false; 1==true;
    • 数字==undefined 即:结果为假;
    • 数字==对象 即:对象转为数字,[]默认转为0;[12]转为12;如[]==0,[12]==12;均为真;
      • 0==![]为真;即当[]添加!后,先执行!,即转换为数字与布尔值的比较,[]为真,![]则为假;变成数字与布尔值的比较,不再是数字与对象的比较;
    • 总结:数字与任何基本数据类型或引用数据类型非严格计较,其他类型全部转化为数字,再进行比较;
  • 字符串与其他类型比较
    • 字符串与布尔值 即:都转为数字,进行比较。如""==false;"1"==true;
    • 字符串与对象(数组) 即:都转化为字符串进行比较,如 ""==[];"12"==[12];"12"==["12"]均为真;
  • 布尔值与其他类型进行比较
    • 布尔值与对象(数组) 即:都转化为数字,再进行比较;如:false==[];false==[0];false==["0"];true==[1];true==["1"]均为真;
    • 布尔值与对象比较实例:[]==![],![]添加!后,就变成布尔值,即转化为对象与布尔值的比较,二者全部转化为数字,前者[]转化为数字0;后者![]中[]为对象,为真,加非后为假,false转化为数字为0;所以[]==![]为真;
  • null与undefined比较
    • null==undefined为真;
    • null与任何其他类型都不等;
    • null与数字比较为假,即:null==0为假;但是null+10==10为真;
    • undefined与任何其他类型都不等;
  • NaN与任何其他类型都不等,跟自身也不相等;
  • 对象与对象的比较:即[]==[]为假,因为引用数据是对地址的引用,不同的地址比较,不同;

5.定时器

  • setInterval(函数,延迟时间):每隔一段时间间隔就触发一次,触发多次,延迟时间为毫秒;函数是定义阶段;解决其在开始执行时,会出现延迟问题,在执行setInterval之前,让函数先执行一次;
  • clearInterval(返回值):返回值为setInterval()的返回值,用于停止;
  • setTimeout(函数,延迟时间):仅在指定延迟时间之后触发一次,只触发一次;
  • clearTimeout(返回值):返回值为setTimeout()的返回值,用于停止;
<script>
    //需求:请封装一个函数,从1弹到5,用setTimeout来实现setInterval的功能;
    //考点:1)定时器 2)递归:函数自己调用自己;
    var m=1;
    function fn() {
        alert(m);
        m++;
        var time=setTimeout(fn,1000);//递归思想,调用函数本身;
        if(m>=6){
            clearTimeout(time);
        }
    }
    fn();
</script>
  • return作用:1)函数返回值;2)阻断程序执行的作用;
    var m=1;
    function fn() {
        alert(m);
        m++;
        if(m>=6){
            clearTimeout(time);
            return ;//return作用:阻断程序执行的作用;
        }
        var time=setTimeout(fn,1000);
    }
    fn();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容