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=;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等)的更多相关文章
- 【2017-03-28】JS基础、DOM操作
一.JS基础 1.javascript功能 ⑴进行数据运算 ⑵控制浏览器功能 ⑶控制元素的属性.样式.内容 2.javascript位置和格式 可以放在html页的任意位置,也可以创建一个以js结尾的 ...
- jquer 基础篇 dom操作
DOM操作: 1.新增元素:创建元素:$("HTML")返回的创建成功的新元素新增子元素:元素.append(obj) 在匹配元素的里面新增一个子元素 追加方式 新元素作为最后一个 ...
- 【JS基础】DOM操作
appendChild() //向节点添加最后一个子节点 createElement() //创建元素节点 createTextNode() //创建文本节点,字符串值
- js基础总结01 --操作DOM
1.选择对象 通过id来选择绑定一个dom节点 :document.getElementById('p1'): 通过类名来绑定一个类数组的对象集合,:document.getElementsByCla ...
- 前端面试题目汇总摘录(JS 基础篇)
JS 基础 JavaScript 的 typeof 返回那些数据类型 object number function boolean undefined string typeof null; // o ...
- JS基础篇--sort()方法的用法,参数以及排序原理
JS基础篇--sort()方法的用法,参数以及排序原理 sort() 方法用于对数组的元素进行排序,并返回数组.默认排序顺序是根据字符串Unicode码点.语法:arrayObject.sort( ...
- python基础篇(文件操作)
Python基础篇(文件操作) 一.初始文件操作 使用python来读写文件是非常简单的操作. 我们使用open()函数来打开一个文件, 获取到文件句柄. 然后通过文件句柄就可以进行各种各样的操作了. ...
- js中的DOM操作汇总
一.DOM创建 DOM节点(Node)通常对应于一个标签,一个文本,或者一个HTML属性.DOM节点有一个nodeType属性用来表示当前元素的类型,它是一个整数: Element,元素 Attrib ...
- GSAP JS基础教程--TweenLite操作元素的相关属性
今天来学习用TweenLite操作元素的各种属性,以Div为例,其他元素的操作也是一样的,只是可能一些元素有它们的特殊属性,就可能不同罢了. 代码里用详细注释,我就不再重复啦,大家看代码就可以啦! ...
随机推荐
- 试着用React写项目-利用Webpack搭环境
转载请注明出处:王亟亟的大牛之路 最近都蛋疼,然后前些天开了个会就是关于"不加班就得死"的死命令,作为抵制加班的先头兵,我感觉我时日无多是时候加快武装自己的速度不然吃土都不配了,就 ...
- vue中实现中,自动补全功能
知识点:利用vue的基本语法实现,自动补全功能 参考博客:https://www.jb51.net/article/136282.htm 效果:在文本框中,输入相关名称,调用后台接口,将数据填充到下拉 ...
- java虚拟机类加载
java虚拟机中类的加载 (JVM的大致结构图) 从发class文件到内存中的类,按先后顺序,需要经过加载,链接以及初始化三大步骤. java语言的类型可分为两大类:基本类型(primitive ty ...
- python 随机整数
# Program to generate a random number between and # import the random module import random print(ran ...
- 100W数据,测试复合索引
复合索引不是那么容易被catch到的. 两个查询条件都是等于的时候,才会被catch到. mysql> select count(*) from tf_user_index where sex ...
- 解决本地项目推送到码云(github),上提示:failed to push some refs to ...
本地项目上传github 命令如下: 1.git init 2.git add . 3.git commit -m "init" 4.git remote add origin ...
- 两个值相等的Integer的==比较问题
@Test public void testIntegerEqual() { /** -128~127 之外的数**/ Integer tem = 129; ...
- ExtJS 6 如何引入Dashboard模版
最近很多人问我在ext js 6+的版本中怎么引入官方的dashboard模版,正好我好久没写博客了,这里我写一篇博客来说明一下. 在这里以ext js 6.2.1版本为例(注:需要安装Sencha ...
- Git观察和比较
log git log 时间是从下到上,从远到近 whatchanged git whatchanged 时间是从下到上,从远到近 diff --staged 比较工作区和缓存区之间的差异 g ...
- PLSQL 触发器
触发器权限 数据库创建用户时想要在本用户下使用触发器,需要给用户触发器的权限 使用DBA用户执行 GRANT CREATE TRIGGER TO user_name; 如果想在当前用户下创建其他用户 ...