zoukankan      html  css  js  c++  java
  • js基础篇(dom操作,字符串,this等)

    首先我们来看这样一道题

    <div id='foo' class='aa bb cc'></div>写出如何判断此div中是否含有aa(注:aa成立,aaa不成立)

    首先,我们一定是取出class里面的这个字符串,然后我们想办法判断出这个字符串里面是否存在aa,并且只有aa。

    我给大家提供了三种方法,第一种利用getAttribute方法,第二种利用getElementByClassName,第三种就是正则匹配了。

    代码如下:

            /*
            ***用getAttribute方法实现
             */
            var oFoo = document.getElementById('foo');
            var str = oFoo.getAttribute('class');
            var arr = str.split(' ');
            for(var i=0;i<arr.length;i++){
                if(arr[i]=='aa'){
                    alert('yes');
                    break;
                }else if(i==arr.length-1&&arr[i]!='aa'){
                    alert('no');
                }
            }
            /*
            ***用getElementByClassName实现
             */
             var oEle = document.getElementsByClassName('aa');
             console.log(oEle[0]);
             if(oEle[0]!=undefined){
                 alert('yes');
             }else{
                 alert(' no');
             }
             /*
             **正则匹配
              */ 
              var str = document.getElementById('foo').getAttribute('class');
              console.log(str);
              var re = /(sa{2}s)|(^a{2}s)|(sa{2}$)/g;
              alert(re.test(str));

    正则这一定要注意了,这里有一个小坑就是可能会有人这么用:

    var re = /a{2}/g;

    这么用的问题就是的确是只匹配2个a,但是三个a其实也是成立的,因为整个字符串中三个a也是满足两个a的条件。而且我们需要满足存在aa条件就必须要有存在空格的情况。所以三种开情况必须都要考虑全面(正则的坑还是蛮多的,主要的坑不是语法,而是我们的逻辑)。

    下面我们来看第二道比较坑的题目(关于js连等复制的指针指向问题)

    题目是这样子的:

    var a = {x:1};
    var b=a;
    a.c = a = {x:2};

    a.c的值是多少?

    首先看到了肯定是a指向{x:1}

    然后b指向{x:1},之后a又指向{x:2}

    然后a中添加属性c为{x:2}

    那么a的值就变成了{x:2,c:{x:2}}

    所以结果应该是:{x:2}

    其实这个逻辑是错误的,我们忽略了b指针的赋值,所以往下所有的结果都是错误的

    我们来看下面代码

        var a = {x:1};
        var b=a;
        a.c = a = {x:2};
        console.log(a.c);//undefined
        console.log(b);//{x:1,c:{x:2}}
        console.log(a);//{x:2}

    没错a.c的运行结果是undefined,没错就是你看到的,其实在最后一步的时候

    1.先执行的是把a的指针指向了{x:1}

    2.然后把b的指针指向了a指针的指向,也就是{x:1}

    3.然后在把a的指针指向{x:2},这个时候b的指针是{x:1}

    4.所以连等中a.c中的a其实并不是上面指针指向啊a,因为连等操作还没有做完,所以a的指针指向的是{x:1},然后给{x:1}添加c属性赋值为{x:2}

    所以现在的结果就是b--->{x:1,c:{x:2}}   a--->{x:2}

    相信你看到这里就明白了,你在输出的a中是没有c属性的,所以a.c的值为undefined

    如果到这里你真的明白了,那么在js底层数据指针的问题,我想你就应该算是了解透彻了!

    下面我们来看一下最后一道题:

        var x=1;
        o={
            x:10,
            getVal:function(){
                alert(x);
                var x = 15;
                (function(){
                    alert(this.x++);
                })();
           alert(++this.x); } }; o.getVal();

    请问三次alert分别是输出什么?

    首先我们看第一个alert,这个alert输出的一定是一个undefined,因为alert后面有一句var x,这个就相当于是定义了局部的变量,然后我们的x就相当于预定义了一个

    var x = undefined;所以输出的一定是undefined;

    然后第二个alert因为在一个闭包里面,所以里面的this指向的是window,所以x就是1,因为后运行的++,所以是先alert出1之后,x的值就变成了2;

    关于第三个this,指向的一定是调用它方法的那个对象也就是o,this.x指向的也就是o.x,因为前置++,所以alert出来的结果是11。

    这样子看来,this是不是很好辨认呢?

        var x=1;
        o={
            x:10,
            getVal:function(){
                alert(x);//undefined
                var x = 15;
                (function(){
                    alert(this.x++);//1
                })();
                alert(++this.x);//11
            }
        };
        o.getVal();
  • 相关阅读:
    Kotlin泛型与协变及逆变原理剖析
    struts2中action的class属性值意义
    重新设置Eclipse的workspace路径
    windows下将mysql加入环境变量
    Eclipse插件安装4种方法
    Maven常用命令
    IntelliJ IDEA光标变粗 backspace无法删除内容解决方法
    Weblogic Exception in AppMerge flows' progression
    Oracle的dual
    lgp20151222 解决-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.
  • 原文地址:https://www.cnblogs.com/jcscript/p/5655803.html
Copyright © 2011-2022 走看看