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为例,其他元素的操作也是一样的,只是可能一些元素有它们的特殊属性,就可能不同罢了. 代码里用详细注释,我就不再重复啦,大家看代码就可以啦! ...
随机推荐
- 《Java程序设计》第四章-认识对象
20145221<Java程序设计>第四章-认识对象 总结 教材学习内容总结 类与对象 定义:对象是Java语言中重要的组成部分,之前学过的C语言是面向过程的,而Java主要是面向对象的. ...
- openwrt编译系统制作ubi镜像时会使用系统自带的ubinize还是openwrt编译系统中编译的ubinize
答:使用openwrt编译系统中编译的ubinize,那么这个工具在哪个目录下?在staging_dir/host/bin目录下
- windows10如何安装cpu版本tensorflow
1.获取anaconda https://repo.continuum.io/archive/Anaconda3-2018.12-Windows-x86_64.exe (这个版本内置python3.7 ...
- 什么是OPTEE-OS
1. 为什么会出现这种技术? 为了安全,例如:保护指纹虹膜的生物特征数据 2. 为了确保数据安全各家公司都做了些什么? Arm公司提出的了trustzone技术,用一根安全总线(称为NS位)来判断当前 ...
- git am PATCH_FILE_NAME自动打patch失败后的操作方法
1.找到打入patch不成功的patch 从打入patch的失败信息可以找到 2.根据patch的index重新打入 patch,将可以合并的内容合并,冲突的部分单独生成文件 比如出问题patch的i ...
- HYSBZ 1036 树的统计Count(树链剖分)题解
思路: 树链剖分,不知道说什么...我连模板都不会用 代码: #include<map> #include<ctime> #include<cmath> #incl ...
- 2018-2019 Russia Open High School Programming Contest (Unrated, Online Mirror, ICPC Rules, Teams Preferred)
前言 有一场下午的cf,很滋磁啊,然后又和dalao(见右面链接)组队打了,dalao直接带飞我啊. 这是一篇题解,也是一篇总结,当然,让我把所有的题目都写个题解是不可能的了. 按照开题顺序讲吧. 在 ...
- java 23种设计模式,一般情况下,常用的有哪些? 转载
原址:http://wangle.iteye.com/blog/196972 工厂模式, 工厂方法模式,单例模式, 外观(Facade)模式, 观察者(Observer)模式,桥接(Bridge)模式 ...
- 2016"百度之星" - 资格赛(Astar Round1) A 逆元
Problem A Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem ...
- CSS 再学习,基础篇
语法 h1 {color:red; font-size:14px;} 共享声明 h1,h2,h3,h4,h5,h6 { color: green; } 继承 通过 CSS 继承,子元素将继承最高级元素 ...