写在前面
知识点:
- 字符串
- 常用方法
- charAt/charCodeAt
- slice / substr / substring
- indexOf / lastIndexOf
- split / replace
- 日期对象基本操作
2.1.17 字符串常用方法
所有用单引号,双引号、反引号包起来的都是字符串
let str='zasfsafsdfsdf' //字符串由0到多个字符组成 str.length str[0] str[str.length-1] console.log(str[20000000]) //=>undefined //for循环输出字符串 略
charAt / charCodeAt
charAt:根据索引获取指定位置字符
charCodeAt:获取指定字符的ASCII码值
@params
n [number] 获取字符指定索引
@return
返回查到字符
找不到返回空字符串/对应编码值,不是undefined
console.log(str[20000000]) //=>undefined console.log(str.charAt(20000000)) =>''
console.log(str.charCodeAt(0) //=>122 console.log(string.fromCharCode(122)) //=>z
substr / substring / slice 字符串截取
都是为了实现截取
substr(n,m) n开始截取m个字符(不写到末尾)
substring(n,m) n开始到m处(不含m)
slice(n,m) 同substr(n,m),但支持负索引
console.log(str.substr(2,3) //=>'sfs' console.log(str.substr(2,1000000) //=>'sfsafsdfsdf'超过截取全部 console.log(str.substr(-2,-3) //=>'' console.log(str.slice(-3,-2)) //=>'s' 快捷查找,负数索引,按照str.length+负数索引
indexOf/lastIndexOf
indexOf(x,y) x查找,y起始位置
lastIndexOf(x,y) x查找,y起始位置
let str='abcnn'
console.log(str.indexOf('n',2) //=>3
console.log(str.lastIndexOf('n') //=>4
if (str.indexOf('@')===-1){
//不存在返回-1
//验证不包含
}
console.log(str.indexOf('abc')) //=>0 返回第一个字符所在索引
if(!str.includes('@')){
console.log('不存在')
} toUpperCase / toLowerCase 转大写/小写
str='luanxiaoxiang'; console.log(str.toUpperCase()); //实现首字母大写 str=str.substr(0,1).toUpperCase()+str.substr(1); console.log(str);
split 指定一个分隔符,把字符串按照指定分隔符拆成数组(和数组中join对应)
let str='a|b|c|d';
let ary=str.split('|').join(',');
console.log(ary);
//split支持正则表达式 replace(老字符,新字符) 字符串替换
let str ='重庆@背景@上海';
str=str.replace('@','-');//=>"重庆-背景@上海"
//不使用正则每执行一次只替换一个
str=str.replace(/@/g,'-');//=>"重庆-背景-上海"
2.1.17.2 常用需求
时间字符串处理
let time = '2019-7-24 12:6:23';
//=>改变格式
//"2019年07月24日 12日06分23秒"
//"2019年07月24日"
//"07/24 12:06"
//方案1:replace替换
//字符串截取-略
////方案2:indexOf和substring
let n = time.indexOf('-')
let m = time.lastIndexOf('-')
let x = time.indexOf(' ')
let y = time.indexOf(':')
let z = time.lastIndexOf(':')
let year=time.substring(0,n);
let month=time.substring(n+1,m);
let day=time.substring(m+1,x);
console.log(year,month,day)
//方案3:基于split
let n=time.split(' ');
let m=n[0].split('-');
let x=n[1].split(':');
console.log(m,x)
//基于正则
let addZero=val=>val.length<2?'0'+val:val;
let ary=time.split(/(?: |-|:)/g);
time=ary[0]+'年'+addZero(ary[1])+'月'+addZero(ary[2])+'日';
实现一个方法queryURLParameter获取一个URL地址问号后面传递的参数信息
let url='http://www.zhufengpeixun.cn/index.html?1x=1&name=zhufeng&teacher=aaa#box';
/*
结果{
1x:1,
name:'zhufeng',
teacher:'aaa',
HASH:'box'
}
*/
let urlSplit=url.split('?');
let askParamsSplit=urlSplit[1].split(/(?:&|#)/g);
// console.log(askParamsSplit)
let obj={};
askParamsSplit.forEach(item=>includeEqual(item,obj));
let includeEqual=(str,obj)=>{
if(str.includes('=')){
let n = str.split('=')
// console.log(n)
key=n[0];
// console.log(key)
value=n[1];
// console.log(value)
obj[key]=value;
}else{
obj['HASH']=str;
}
} /*
queryURLParams: 获取url地址中问号传参信息和哈希值
@params
url[string]要解析的URL字符串
@return
[object]包含参数和哈希值信息对象
*/
function queryURLParams(url) {
//获取?和#后面的信息
let askIn = url.indexOf('?'),
wellIn = url.indexOf('#'),
askText = '',
wellText = '';
wellIn === -1 ? wellIn = url.length : null;
askIn >= 0 ? askText = url.substring(askIn + 1, wellIn) : null;
wellText = url.substring(wellIn + 1);
//获取每一部分信息
let result = {};
wellText !== '' ? result['HASH'] = wellText : null;
if (askText !== '') {
let ary = askText.split('&');
ary.forEach(item => {
let itemAry = item.split('=');
result[itemAry[0]] = itemAry[1];
})
}
return result;
}
let url = 'http://www.zhufengpeixun.cn/index.html?1x=1&name=zhufeng&teacher=aaa#box';
let paramsObj = queryURLParams(url);
console.log(paramsObj);
//正则表达式
let url = 'http://www.zhufengpeixun.cn/index.html?1x=1&name=zhufeng&teacher=aaa#box';
function queryURLParams(url) {
//获取每一部分信息
let result = {},
reg1 = /([^?#=&]+)=([^?#=&]+)/g,
reg2 = /#([^?#=&]+)/g;
url.replace(reg1,(n,x,y)=>result[x]=y);
url.replace(reg2,(n,x)=>result['HASH']=x);
return result;
}
let paramsObj = queryURLParams(url);
console.log(paramsObj); low验证码.html
见VSCode
2.1.18 日期对象的基本操作
let time =new Data();
/*
获取当前客户端(本机电脑)本地时间、用户可以修改,不能作为重要参考项
Fri Jul 26 2019 10:02:17 GMT+0800
获取日期对象
/
标准日期方法/属性:
- getFullYear()
- getFullMonth() 获取0-11,代表1-12月
- getDate() 获取日
- getDay() 获取星期 获取0-6,代表周日-周六
- getHours()
- getMinutes()
- getSeconds()
- getMilliseconds()
- getTime() 获取1970/1/1 00:00:00这个日期之间毫秒差
- toLocaleDateString() //=>2020/11/6
- toLocaleString() //=>2020/11/6 上午9:30:31
//小时钟 //定时器控制运动:设置一个setInterval定时器,每隔1000ms执行一次 setInterval(queryDate,1000);
new Date('2019/7/27');
//Sat Jul 27 2019 00:00:00 GMT+0800 (中国标准时间)
/*
支持格式
yyyy/mm/dd
yyyy/mm/dd hh:mm:ss
yyyy-mm-dd (在IE下不支持)
*/
function addZero(val) {
val = Number(val);
return val < 10 ? '0' + val : val;
}
function formatTime(time) {
let ary = time.split(' ');
console.log(ary);
let aryLeft = ary[0].split('-'),
aryRight = ary[1].split(':');
ary = aryLeft.concat(aryRight);
let result = ary[0] + '年' + addZero(ary[1]) + '月' + addZero(ary[2]) + '日' + ' ' + addZero(ary[3]) + ':' + addZero(ary[4]) + ':' + addZero(ary[5]);
return result;
}
let time = '2020-11-8 12:0:0';
console.log(formatTime(time)); //=>2020年11月08日 12:00:00 //封装一套公共的时间字符串格式化处理方式
String.prototype.formatTime = function formatTime(template) {
typeof template === 'undefined' ? template = '{0}年{1}月{2}日 {3}:{4}:{5}' : null;
let matchAry = this.match(/\d+/g);
template = template.replace(/{(\d+)}/g, (x, y) => {
let val = matchAry[y] || '00';
val.length < 2 ? val = '0' + val : null;
return val;
})
return template;
}
let time = '2020-11-8 12:0:0';
console.log(time.formatTime('{1}-{2} {3}-{4}')); DOM:document object model 文档对象模型,提供一些属性和方法供我们操作页面元素
获取DOM元素方法
- document.getElementById()指定在文档中,基于元素ID或者这个元素对象
- [context].getElementByTagName() 在指定容器中通过标签名获取一组元素集合
- [context].getElementByClassName() 在指定容器中通过样式类名获取一组元素集合(不兼容IE6-8)
- document.getElementByName() 在整个文档中,通过标签的Name属性值获取一组元素集合(在IE中只要表单元素Name才能识别)
- document.head / document.body / document.documentElement获取页面中 HEAD / BODY / HTML三个元素
- [context].querySelector([selector]) 在指定上下文(容器)中,通过选择器获取到指定的元素集合
//=> querySelector / querySelectorAll不兼容IE6-8
let box =document.querySelector('#box');
let links =document.querySelectorAll('a');
let links2 =document.querySelectorAll('#box a');
let aas =document.querySelectorAll('.aa'); //基于getElementByTagName / getElementByClassName获取到的是元素集合,想要操作某个元素需要在集合中根据索引取出 //querySelector获取的是一个元素对象,哪怕页面有多个符合也只获取第一个 //querySelectorAll获取到是一个集合,哪怕只有一个符合,也是一个集合
JS中的节点和描述节点间关系的数学
节点:Node,页面中所有东西都是节点
节点集合:NodeList(getElementsByName / querySelectorAll获取的都是节点集合)
元素节点(元素标签)
- nodeType:1
- nodeName:大写的标签名
- nodeValue:null
文本节点
- nodeType:2
- nodeName:‘#text’
- nodeValue:文本内容
注释节点
- nodeType:8
- nodeName:‘#commen’
- nodeValue:注释内容
文档节点document
- nodeType:9
- nodeName:‘#document’
- nodeValue:null
......
描述这些节点之间关系的属性
childNodes:获得所有子节点
children:获取所有的元素子节点(子元素标签)
parent:获取父节点
firstChild:第一个子节点
lastChild:最后一个子节点
firstElementChild / lastElementChild:第一个元素子节点 / 最后一个元素子节点(不兼容IE6-8)
previousSibling:获取上一个哥哥节点
nextSibling:获取上一个弟弟节点
previousElementSibling / nextElementSibling:获取上一个哥哥元素节点 / 获取上一个弟弟元素节点(不兼容IE6-8)
......
JS中动态增删改查
createElement 创建元素对象
createTextNode 创建文本对象
appendChild 把元素添加到容器末尾
insertBefore 把元素添加到指定容器中指定元素前面
let box = document.createElement('div');
box.id = 'boxActive';
box.style.width = '200px';
box.style.height = '200px';
box.className = 'red'
let text = document.createTextNode('珠峰培训');
//添加:容器.appendChild(元素)
box.appendChild(text);
// document.body.appendChild(box);
//放到指定元素前面:容器.insertBefore([指定元素],[新增元素])
let haha = document.getElementById('hah');
haha.parentNode.insertBefore(box, haha); cloneNode(true / false) 克隆元素或节点
removeChild 移除容器中某个元素
let box1 = document.querySelector('.box');
//深克隆(克隆子元素)
let box2 = box1.cloneNode(true);
box2.querySelector('span').innerText = 'x2'
//浅克隆(不克隆子元素)
let box3 = box1.cloneNode(false);
box3.innerHTML = '<span>x3</span>';
document.body.appendChild(box2);
document.body.appendChild(box3);
//
document.body.removeChild(box3); 自定义属性另一种方式(这种方式是把自定义熟悉放到元素结构上)
.setAttribute('data-index',i);
.getAttribute('data-index'); var btnList = document.querySelectorAll('button');
for (let index = 0; index < btnList.length; index++) {
// btnList[index].myIndex = index;
//设置自定义属性:基于Set-ATTRIBUTE是吧属性信息写到了元素标签结构上,没有放到元素对象对应堆内存
btnList[index].setAttribute('data-index', index);
btnList[index].onclick = function () {
//获取自定义属性:元素对象,属性名(原理是从堆内存中获取到对应属性值
// alert(this.myIndex);
//给予Get-ATTRIBUTE可以吧结构上存储的自定义属性值获取
alert(this.getAttribute('data-index'));
}
} 
京公网安备 11010502036488号