JavaScript学习(二)
文章目录
知识梳理
new关键字执行过程
1.在内存中创建一个新的空对象。
2.让this指向这个新的空对象
3.执行构造函数里面的代码,给这个新对象添加属性和方法。
4.返回这个新对象(所以构造函数里面不需要return)
遍历对象
1.遍历对象属性
for…in语句用于对数组或者对象的属性进行循环操作
for(var k in obj) {
console.log(k); // 得到属性名
console.log(obj[k]); // 得到属性值
}
内置对象
指JS语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的或最基本而必要的功能(属性和方法)
常用内置对象
Math数学对象
不是构造函数,所以我们不需要new来调用而是直接使用里面的属性和方法即可
例如:
console.log(Math.PI); //圆周率
console.log(Math.max(1,10,-1)); //10
console.log(Math.abs(-1)); //1
console.log(Math.abs('-1'));//1 隐式转换 会把字符型转化为数字型
console.log(Math.round(1.1)); //1
console.log(Math.round(1.9)); //2
//随机数 得到两个数之间的随机整数
function getRandomArbitrary(min, max) {
return Math.random() * (max - min) + min;
}
日期对象(Date)
注意Date为一个构造函数,必须使用new 来调用创建我们的日期对象
var date=new Date(); //如果没有参数 返回当前系统的当前时间
var date=new Date('2022-1-1 8:8:8');
console.log(date.getMonth); // 比实际月份小1月 需手动加1
var date = +new Date(); //返回总毫秒数
console.log(date.now()); //也可以返回总的毫秒数(h5新增)
实例
倒计时(使用时间戳)
function countDown(time) {
var nowTime = +new Date();
var inputTime = +new Date(time);
var times = (inputTime - nowTime) / 1000;
var d = parseInt(times / 60 / 60 / 24);
d = d < 10 ? '0' + d : d;
var h = parseInt(times / 60 / 60 % 24);
h = h < 10 ? '0' + h : h;
var m = parseInt(times / 60 % 60);
m = m < 10 ? '0' + m : m;
var s = parseInt(times % 60);
s = s < 10 ? '0' + s : s;
return d + '天' + h + '时' + m + '分' + s + '秒';
}
数组对象
一 、添加删除数组元素的方法
push
(1) push可以给数组追加新的元素
(2) push()直接写数组元素就可以了
(3) push完毕之后,返回的结果是 新数组长度
(4) 原数组会放生变化
unshift
(1)unshift 可以给数组前面追加新的元素
(2)其他和push相同
pop
(1) pop可以删除数组的最后一个元素 注:一次只能删除一个元素
(2) pop()没有参数
(3) pop完毕之后,返回的结果是 删除的那个元素
(4) 原数组会放生变化
shift
(1) pop可以删除数组的最后一个元素 注:一次只能删除一个元素
(2)其他和pop相同
二、数组排序
1.反转数组
reverse()
2.数组排序sort
使用方法:
arr.sort(function(a, b) {
return a - b; //升序排序
//return b-a; 降序排序
})
三、数组索引
indexOf (数组元素)
(1) 作用是返回数组元素的第一个满足条件的索引号
(2)如果在该数组没有找到这个元素则返回-1
lastindexOf
(1) 从后面开始查找
(2) 其他同indexOf
实例
数组去重
function unique(arr) {
for (var i = 0; i < arr.length; i++) {
if (newArr.indexOf(arr[i]) == -1) {
newArr.push(arr[i]);
}
}
return newArr;
}
四、数组转化为字符串
1.toString
var arr[1,2,3];
console.log(arr.toString());//1,2,3
2.join(分隔符)
console.log(arr.join());
console.log(arr.join('-')); // 1-2-3
字符串对象
1.indexOf
2.charAt(index)
返回指定位置的字符
3.charCodeAt(index)
获取指定位置字符的ASCII码值
4.str[indedx]
HTML5,IE8+ 支持和charAt等效
5.concat
用于连接两个或多个字符串 拼接字符串
6.substr(start,length)
(1)作用截取字符串
(2)从start位置开始(索引号) , length 取得个数
7.slice(start,end)
(1)作用截取字符串
(2)从start位置开始,截取到end位置,end取不到 (都为索引号)
8.substring(start,end)
(1) 基本和slice相同 但是不接受负值
9.replace(‘被替换字符’ , ‘替换为的字符’)
(1) 作用替换字符
(2)只会替换第一个字符
10.split(‘分隔符’)
(1)作用字符转换为数组
11.toUpperCase()
(1)作用转化为大写
12.toLowerperCase()
(1)作用转化为小写
实例
1.求某个字符出现的位置以及次数
var str = 'asdovnsodjodcovodso';
var index = str.indexOf('o');
var num = 0;
while (index != -1) {
console.log(index);
num++;
index = str.indexOf('o', index + 1);
}
console.log('o出现了' + num + '次');
2.统计出现次数最多的字符
var str = 'abcoefoxyozzop';
var obj = {};
for (var i = 0; i < str.length; i++) {
chars = str.charAt(i);
if (obj[chars]) {
obj[chars]++;
} else {
obj[chars] = 1;
}
}
var max = 0;
var maxCh = '';
for (var k in obj) {
if (obj[k] > max) {
max = obj[k];
maxCh = k;
}
}
console.log('最多的字符是' + maxCh + '出现了' + max + '次');
DOM
DOM简介
1.什么是DOM
文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本动态地访问、更新文档的内容、结构和样式。”
DOM树
- 文档 :一个页面就是一个文档,DOM中使用document表示
- 元素 :页面中的所有标签都是元素 ,DOM中使用 elements 表示
- 节点 :网页中的所有内容都是节点(标签、属性、文本、注释等) ,DOM中使用node表示
获得元素方法
1.document.getElementById()
getElementById是Document上的一个方法,用元素Id把单个元素整块抠出来(包括其孩子)
2.**document.getElementsByTagName() element.getElementsByTagName()
**
通过标签名把元素及其孩子抠出来(包括其孩子)
3.document.getElementsByClassName() element.getElementsByClassName()
通过元素类名把元素整块抠出(包括其孩子)
4.document.querySelector() element.querySelector()
通过类名,id名,标签名把单个元素整块抠出来
5.document.querySelectorAll() element.querySelectorAll()
通过类名,id名,标签名把多个元素整块抠出来
html,body的获取方法
console.log(document.body);
console.log(document.documentElement);
元素节点操作
父节点
node.parentNode
(1)parentNode属性返回当前节点的最近父节点
(2) 如果没有父节点,返回null
子节点
1.node.childNodes
- 返回元素的所有子节点(包括元素节点,文本节点)
2.body.children 只返回元素的子节点中的元素节点不是文本节点,也不是属性节点
(常用)
获得第一个子节点和最后一个子节点
1.firstChild lastChild
元素节点和***文本节点***
2.firstElementChild lastElementChild
元素节点(不兼容旧浏览器
3.node.children[0] node.children[node.children.length - 1]
元素节点 (常用)
兄弟节点
1.node.nextSibling node.previousSibling
下一个兄弟节点/上一个兄弟节点 包含元素节点或者 文本节点等等
2.node.nextElementSibling node.previousElementSibling
元素节点(不兼容旧浏览器)
创建、追加、删除节点
1.document.createElement(“tagName”)
创建节点(标签)
2.node.appendChild(child)
把child追加到node子节点列表末尾
3.node.insertBefore(newNode, referenceNode)
- insertedNode 被插入节点(newNode)
- parentNode 新插入节点的父节点
- newNode 用于插入的节点
- referenceNode newNode 将要插在这个节点之前
如果 referenceNode 为 null 则 newNode 将被插入到子节点的末尾。、
4.node.removeChild(child)
删除child,返回值为被删除的child节点
复制节点
node.cloneNode()
括号内可传入false, true,不传默认为浅拷贝,false为浅拷贝,true为深拷贝,浅拷贝就是只克隆标签,抛弃内容,深拷贝就是克隆标签以及内层的所有东西。返回值就是克隆出来的节点。
注册事件两种方法
1.传统方式注册事件
- on+事件名=“fuctionName()”
- 注:一个元素只能绑定一个事件,多写相当于最后注册的事件绑定覆盖掉前面的,前面的注册事件全部失效
btns.onclick = function() {
alert('hi');
}
btns.onclick = function() {
alert('hao a u');
}
结果为hao a u
2.addEventListener() 事件侦听注册事件
(1) 里面的事件类型是字符串 必定加引号 而且不带on
(2) 同一个元素 同一个事件可以添加多个侦听器(事件处理程序)
btn.addEventListener('click', function() {
alert(22);
})
btn.addEventListener('click', function() {
alert(33);
})
结果先弹出22再弹出33
删除事件
- 传统方式删除事件
div.onclick = null;
2.- eventTarget.removeEventListener(type, listener[, useCapture])
div.addEventListener('click', fn) // 里面的fn 不需要调用加小括号
function fn() {
alert(22);
div.removeEventListener('click', fn);
}
3.- eventTarget.detachEvent(eventNameWithOn, callback)
div.attachEvent('onclick', fn1);
function fn1() {
alert(33);
div.detachEvent('onclick', fn1);
}
事件对象
- event 就是一个事件对象 写到我们侦听函数的 小括号里面 当形参来看
- 事件对象只有有了事件才会存在,它是系统给我们自动创建的,不需要我们传递参数
- 事件对象 是 我们事件的一系列相关数据的集合 跟事件相关的 比如鼠标点击里面就包含了鼠标的相关信息,鼠标坐标啊,如果是键盘事件里面就包含的键盘事件的信息 比如 判断用户按下了那个键
- 这个事件对象我们可以自己命名 比如 event 、 evt、 e
- 事件对象也有兼容性问题 ie678 通过 window.event 兼容性的写法 e = e || window.event;
DOM事件流(冒泡、捕获)
DOM事件流有三个阶段:
- 事件捕获阶段:捕获阶段是从外到内传播即从根节点向最内侧节点传播,与我们上面例子中讲到的刚好相反
- 事件目标阶段:目标阶段就是事件到达我们具体点击的那个元素时的阶段,在上面的案例中就是粉圆
- 事件冒泡阶段:冒泡阶段就是我们上面案例中将的一样,从内向外传播直到根节点结束
捕获阶段
冒泡阶段
总示意图
阻止默认行为(事件)
让链接不跳转 或者让提交按钮不提交
a.onclick = function(e) {
// 普通浏览器 e.preventDefault(); 方法
e.preventDefault();
// 低版本浏览器 ie678 returnValue 属性
e.returnValue;
// 我们可以利用return false 也能阻止默认行为 没有兼容性问题 特点: return 后面的代码不执行了, 而且只限于传统的注册方式
return false;
}
阻止事件冒泡
阻止冒泡 dom 推荐的标准 stopPropagation()
son.addEventListener('click', function(e) {
alert('son');
e.stopPropagation();
);
事件委托(事件代理,事件委派)
事件委托的核心原理:给父节点添加侦听器, 利用事件冒泡影响每一个子节点
正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
- new RegExp("规则", "匹配模式")
匹配模式 传入i为忽略字母大小写,传入g为全局匹配,就是从头到尾找一遍
简便的字面量写法: var reg = /规则/匹配模式;
- 限定符(限定字符的出现次数):
? 0次或1次 /a?/
* 0次或多次 /a*/
+ >= 1次 /a+/
{ } 限定次数 /a{0,9}/ /a{9,}/ /a{,9}/
| [ ] 或 /a|b/ /(ab)|(bc)/ /[abc]/ /[a-z]/ /[0-9]/
^ 除了(方括号里的^) /[^0-9]/
元字符
\d 数字字符 /\d/
\w 英文字符下划线
\s Tab字符和换行符
. 除了换行符的任意字符 ( \. 用转义字符表示. \\用转义字符表示\ )
^a 以a开头 /^ac$/
a$ 以a结尾
\bword\b 匹配单词word /\bwhat\b/
BOM
BOM(Browser Object Model) 即浏览器对象模型,他提供独立于内容而与浏览器窗口进行交互的对象,其核心对象是window。
BOM由一系列相关的对象构成,并且每个对象都提供了很多方法和属性。
BOM缺乏标准,JavaScript语法的标准化组织是ECMA,DOM的标准化组织是W3C,BOM最初是Netscape浏览器标准的一部分
重点问题梳理
注册事件兼容性处理方法
function addEventListener(element, eventName, fn) {
//判断浏览器是否支持 addEventListener 方法
if(element.addEventListener) {
element.addEventListener(eventName, fn);
} else if(element.attachEvent) {
element.attachEvent('on'+eventName, fn);
} else {
//相当于element.onclick = fn;
element['on' + eventName] = fn;
}
}
删除事件兼容性处理方法
function removeEventListener(element, eventName, fn) {
//判断浏览器是否支持 removeEventListener 方法
if(element.removeEventListener) {
element.removeEventListener(eventName, fn);
} else if(element.detachEvent) {
element.detachEvent('on'+eventName, fn);
} else {
element['on' + eventName] = null;
}
}
获取兄弟节点的兼容性处理方法
function getNextElementSibling(element) {
var el = element;
while (el =el.nextSibling) {
if (el.nodeType === 1) {
return e1;
}
}
return null;
}
this问题
解析器在调用函数,每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是this
this指向的是一个对象。
一般情况下this的最终指向的是那个调用它的对象
1.全局作用域或者普通函数中this指向全局变量window
2.方法调用中谁调用this指向谁
3.构造函数中this指向构造函数的实例
this和e.target区别
e.target 返回的是触发事件的对象(元素) this 返回的是绑定事件的对象(元素)
区别 : e.target 点击了那个元素,就返回那个元素, this 那个元素绑定了这个点击事件,那么就返回谁