首先我们来看这样一道题

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

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

var re = /a{}/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:};
var b=a;
a.c = a = {x:};
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=;
o={
x:,
getVal:function(){
alert(x);
var x = ;
(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=;
o={
x:,
getVal:function(){
alert(x);//undefined
var x = ;
(function(){
alert(this.x++);//
})();
alert(++this.x);//
}
};
o.getVal();

js基础篇(dom操作,字符串,this等)的更多相关文章

  1. 【2017-03-28】JS基础、DOM操作

    一.JS基础 1.javascript功能 ⑴进行数据运算 ⑵控制浏览器功能 ⑶控制元素的属性.样式.内容 2.javascript位置和格式 可以放在html页的任意位置,也可以创建一个以js结尾的 ...

  2. jquer 基础篇 dom操作

    DOM操作: 1.新增元素:创建元素:$("HTML")返回的创建成功的新元素新增子元素:元素.append(obj) 在匹配元素的里面新增一个子元素 追加方式 新元素作为最后一个 ...

  3. 【JS基础】DOM操作

    appendChild() //向节点添加最后一个子节点 createElement() //创建元素节点 createTextNode() //创建文本节点,字符串值

  4. js基础总结01 --操作DOM

    1.选择对象 通过id来选择绑定一个dom节点 :document.getElementById('p1'): 通过类名来绑定一个类数组的对象集合,:document.getElementsByCla ...

  5. 前端面试题目汇总摘录(JS 基础篇)

    JS 基础 JavaScript 的 typeof 返回那些数据类型 object number function boolean undefined string typeof null; // o ...

  6. JS基础篇--sort()方法的用法,参数以及排序原理

    JS基础篇--sort()方法的用法,参数以及排序原理   sort() 方法用于对数组的元素进行排序,并返回数组.默认排序顺序是根据字符串Unicode码点.语法:arrayObject.sort( ...

  7. python基础篇(文件操作)

    Python基础篇(文件操作) 一.初始文件操作 使用python来读写文件是非常简单的操作. 我们使用open()函数来打开一个文件, 获取到文件句柄. 然后通过文件句柄就可以进行各种各样的操作了. ...

  8. js中的DOM操作汇总

    一.DOM创建 DOM节点(Node)通常对应于一个标签,一个文本,或者一个HTML属性.DOM节点有一个nodeType属性用来表示当前元素的类型,它是一个整数: Element,元素 Attrib ...

  9. GSAP JS基础教程--TweenLite操作元素的相关属性

    今天来学习用TweenLite操作元素的各种属性,以Div为例,其他元素的操作也是一样的,只是可能一些元素有它们的特殊属性,就可能不同罢了.   代码里用详细注释,我就不再重复啦,大家看代码就可以啦! ...

随机推荐

  1. 试着用React写项目-利用Webpack搭环境

    转载请注明出处:王亟亟的大牛之路 最近都蛋疼,然后前些天开了个会就是关于"不加班就得死"的死命令,作为抵制加班的先头兵,我感觉我时日无多是时候加快武装自己的速度不然吃土都不配了,就 ...

  2. vue中实现中,自动补全功能

    知识点:利用vue的基本语法实现,自动补全功能 参考博客:https://www.jb51.net/article/136282.htm 效果:在文本框中,输入相关名称,调用后台接口,将数据填充到下拉 ...

  3. java虚拟机类加载

    java虚拟机中类的加载 (JVM的大致结构图) 从发class文件到内存中的类,按先后顺序,需要经过加载,链接以及初始化三大步骤. java语言的类型可分为两大类:基本类型(primitive ty ...

  4. python 随机整数

    # Program to generate a random number between and # import the random module import random print(ran ...

  5. 100W数据,测试复合索引

    复合索引不是那么容易被catch到的. 两个查询条件都是等于的时候,才会被catch到. mysql> select count(*) from tf_user_index where sex ...

  6. 解决本地项目推送到码云(github),上提示:failed to push some refs to ...

    本地项目上传github 命令如下: 1.git init 2.git add . 3.git commit  -m "init" 4.git remote add origin ...

  7. 两个值相等的Integer的==比较问题

    @Test    public void testIntegerEqual() {        /** -128~127 之外的数**/        Integer tem = 129;      ...

  8. ExtJS 6 如何引入Dashboard模版

    最近很多人问我在ext js 6+的版本中怎么引入官方的dashboard模版,正好我好久没写博客了,这里我写一篇博客来说明一下. 在这里以ext js 6.2.1版本为例(注:需要安装Sencha ...

  9. Git观察和比较

    log git log 时间是从下到上,从远到近   whatchanged git whatchanged 时间是从下到上,从远到近   diff --staged 比较工作区和缓存区之间的差异 g ...

  10. PLSQL 触发器

    触发器权限 数据库创建用户时想要在本用户下使用触发器,需要给用户触发器的权限 使用DBA用户执行  GRANT CREATE TRIGGER TO user_name; 如果想在当前用户下创建其他用户 ...