写在前面

知识点:

  • 字符串
    • 常用方法
      • 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地址问号后面传递的参数信息

https://www.bilibili.com/video/BV1b4411y7Uq?p=35

https://www.bilibili.com/video/BV1b4411y7Uq?p=34

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'));
    }
}