转成原生时间对象: moment().toDate();
得到时间戳: moment().valueOf();
单独时间的获取和设置: 加前导0
var date = moment(); console.log(date); // 读取 console.log(date.year()); // 设置 date.year(2022); date.set('year', 2023); date.set({'year': 2024}); // 设置月 date.month(3); // 0-11 date.set('month', 4); date.set({'month': 5}); // 获取 console.log(date.month()); // 0-11表示1-12 // 类似 console.log(date.day()); // 星期几 console.log(date.date()); // 日, 这个月的第几天 console.log(date.hour()); // 小时 console.log(date.minute()); // 分钟 console.log(date.second()); // 秒 console.log(date.week()); // 一年中的第几周 console.log(date.dayOfYear()); // 一年中的第几天 console.log(date.quarter()); // 一年中的第几个季度 console.log(date.daysInMonth()); // 日期所在的月份有多少天 console.log(date);判断时间方法
早于 moment(时间1).isBefore(时间2字符串); 判断时间1是否早于时间2, 返回true/false console.log(moment().isBefore('2020-05-08')); // true console.log(moment('2020-05-08').isBefore('2020-05-07')); // false console.log(moment('2020-06-22').isBefore('2020-07-30', 'year')); // false console.log(moment('2019-06-22').isBefore('2020-07-30', 'year')); // true console.log(moment('2019-06-22').isBefore('2020-06-30', 'month')); // true 晚于 moment(时间1).isAfter(时间2); 判断时间1是否晚于时间2 console.log(moment('2020-05-08').isAfter('2020-05-07')); // true console.log(moment('2020-06-22').isAfter('2020-07-30', 'year')); // false console.log(moment('2019-06-22').isAfter('2020-07-30', 'year')); // false console.log(moment('2019-06-22').isAfter('2020-06-30', 'month')); // false 相等 moment(时间1).isSame(时间2); 判断时间是否相等 console.log(moment().isSame('2020-05-07')); // false console.log(moment().isSame('2020-06-07', 'year')); // true console.log(moment().isSame('2019-05-07', 'month')); // false, 判断月份是否相等, 年份必须相同; 是否是同一个年份、月份、日期、小时。。。。 两者之间 moment(时间1).isBetween(时间2, 时间3); 判断时间1是否在时间2与时间3之间 console.log(moment().isBetween('2019-12-01', '2020-12-01')); // true console.log(moment().isBetween('2019-12-01', '2020-12-01', 'year')); // false console.log(moment().isBetween('2019-12-01', '2021-12-01', 'year')); // true console.log(moment().isBetween('2020-05-07 14:00:00', '2020-05-07 23:59:59', 'hour')); // true 判断是否是闰年 console.log(moment().isLeapYear()); // true console.log(moment('2021-12-31').isLeapYear()); // false 当前时间的毫秒数 console.log(Date.now()); console.log(moment().format('X')); // 当前时间的秒数单双引号包裹的就是字符串
长度: .length
charAt(): 指定下标的字符
强制转换: String() .toString()
查找字符
indexOf: 字符串.indexOf(要查找的字符, [从哪里开始查找]);
如果找到第一个, 结束查找并返回其第一个的下标
如果找不到, 返回-1
var str = 'abcdefghijklmnf'; // 字符串.indexOf(要查找的字符, [从哪里开始查找]); // 如果找到第一个, 结束查找并返回其第一个的下标 // 如果找不到, 返回-1 console.log(str.indexOf('f')); // 5 表示从左到右, 从0开始查找 console.log(str.indexOf('f', 6)); // 14 表示从左到右, 从下标6的位置开始查找 console.log(str.indexOf('z')); lastIndexOf: 字符串.lastIndexOf(要查找的字符, [从哪里开始查找]); 从右向左查找 // 字符串.lastIndexOf(要查找的字符, [从哪里开始查找]); 从右向左查找 console.log(str.lastIndexOf('f')); // 14 表示从右向左查找,从最后一个下标开始往前查找 console.log(str.lastIndexOf('f', 10)); // 5 console.log(str.lastIndexOf('z')); // -1截取
substring: 字符串.substring([起始位置, 结束位置]);
如果没有参数, 返回整个字符串
传一个参数, 表示从开始位置截取到整个字符串的结束为止
传2个参数, 表示从开始位置截取到结束位置的前一个
如果第一个参数大于第二个参数, 将两个参数位置互换再截取
如果参数为负数, 将负数转成0之后, 在按照上面的规则进行截取
// 包含起始位置, 不包含结束位置 var str = 'abcdefghijklmnopqrst'; console.log(str.substring()); // 如果没有参数, 返回整个字符串 console.log(str.substring(2)); // 传一个参数, 表示从开始位置截取到整个字符串的结束为止 console.log(str.substring(30)); // 空字符 console.log(str.substring(2, 4)); // cd 传2个参数, 表示从开始位置截取到结束位置的前一个 console.log(str.substring(8, 2)); // cdefgh 如果第一个参数大于第二个参数, 将两个参数位置互换再截取 console.log(str.substring(8, -1)); // abcdefgh 如果参数为负数, 将负数转成0之后, 在按照上面的规则进行截取slice: 字符串.slice([起始下标, 结束下标]);
没有参数, 返回整个字符串
一个参数, 返回起始下标的字符到整个字符串的结束字符为止
两个参数, 返回起始下标的字符到结束下标的前一位字符为止(包含起始下标, 不包含结束下标);
起始下标大于结束下标, 返回空字符
如果参数为负数, 表示从后往前数几位,然后做截取
// 字符串.slice([起始下标, 结束下标]); // []--->表示其中的参数可选项 console.log(str.slice()); // 没有参数, 返回整个字符串 console.log(str.slice(2)); // 一个参数, 返回起始下标的字符到整个字符串的结束字符为止 console.log(str.slice(2,4)); // 两个参数, 返回起始下标的字符到结束下标的前一位字符为止(包含起始下标, 不包含结束下标); console.log(str.slice(8, 2)); // 起始下标大于结束下标, 返回空字符 console.log(str.slice(8, -3)); // 如果参数为负数, 表示从后往前数几位,然后做截取 console.log(str.slice(-1, -10)); // 起始下标大于结束下标, 返回空字符 console.log(str.slice(-10, -1)); // klmnopqrssubstr: 字符串.substr([要截取的起始下标, 截取字符串的长度])
没有参数, 返回整个字符串
从起始下标位置开始, 截取到整个字符串的结束为止
从起始下标开始, 截取长度为几的字符
截取字符长度为负数, 返回空字符串
起始下标为负数,从右往左数几位开始截取
// 字符串.substr(要截取的起始下标, 截取字符串的长度) console.log(str.substr(5,3)); // 从起始下标开始, 截取长度为几的字符 console.log(str.substr(5)); // 从起始下标位置开始, 截取到整个字符串的结束为止 console.log(str.substr()); // 没有参数, 返回整个字符串 console.log(str.substr(10, 20)); console.log(str.substr(5, -1)); // 空字符 console.log(str.substr(-10, 3)); // 起始下标为负数,从右往左数几位开始截取转大小写:
转小写: 字符串.toLowerCase();
转大写: 字符串.toUpperCase();
var str = 'FGFHAahhsjaSDgwADF'; // 转小写: 字符串.toLowerCase(); console.log(str.toLowerCase()); // fgfhaahhsjasdgwadf // 转大写: 字符串.toUpperCase(); console.log(str.toUpperCase()); // FGFHAAHHSJASDGWADF // 用于验证码、验证字符正确与否、封装函数将字符串分割成数组
字符串.split(‘分割符’); 可以是一切字符
var str = '优学习字符串分割成数组'; console.log(str.split(',')); console.log(str.split('一')); console.log(str.split('')); // 每个字符会被拆成一项 console.log(str.split('优')); // 2项将数组拼接成字符串
数组.join(‘连接符’); 可以是一切字符
var arr = [1,2,3,4,5]; console.log(arr.join(',')); // 1,2,3,4,5 console.log(arr.join('123')); // 11232123312341235 console.log(arr.join('')); // 12345替换: 字符串.replace(要替换掉的字符, 要替换进来的字符);
注意: 一次只能替换一个位置的字符
var str = '今天是个好日子, 今天是个周四, 今天之后在上两天课就放假了'; // 替换字符: 字符串.replace(要替换掉的字符, 要替换进来的字符); // 一次只能替换一个位置的字符 console.log(str.replace('今天', '5月7号'));概念: 数组是值得有序的集合, 每一个值叫元素, 下标叫做索引
作用: 可以用来存储不定数量不定类型的数据
创建方式:
字面量创建: 将数组的项放在[]中, 可以直观地看到
构造函数创建
注意: 如果构造函数中传一个参数并且这个参数是数字时, 表示的是创建出来的数组的长度, 每一项存储为empty, 获取得到的undefined
// 1. 字面量创建 var arr = [2,3,4,5]; var arr1 = []; // 2. 构造函数创建 var arr2 = new Array(); console.log(arr2); var arr3 = new Array(1,2,3,4); console.log(arr3); var arr4 = new Array(5); console.log(arr4); console.log(arr4[2]);万能的splice: 添加、删除、替换
数组.splice(起始下标, 删除的个数, 项1, 项2, 项3…);
注意: 返回删除掉的项组成的数组, 如果没有删除, 返回一个空数组
var arr = ['小乔', '大乔', '亚瑟', '吕布', '貂蝉']; // 删除 var a2 = arr.splice(3, 2); console.log(arr); console.log(a2); // 添加: 不需要删除, 删除个数为0 // 如果起始位置大于数组长度, 直接添加在数组的末尾 arr.splice(1, 0, '亚索', '女枪', '李白'); console.log(arr); // 替换: 添加几个就删除几个 arr.splice(1, 2, '米莱迪', '韩信'); console.log(arr);sort方法
数组.sort([参数]); 直接对原数组进行排序
没有参数: 默认按照从小到大的顺序排序, 默认按照字符串的顺序排序
有参数:参数是一个函数, 函数有2个形参,
设置返回值时:
第一个形参-第二个形参, 按照从小到大
第二个形参-第一个形参, 按照从大到小
var arr = [1, 3, 2, 4, 2, 5, 6, 11, 12, 22]; console.log(arr.sort()); arr.sort(function(x, y){ return y - x; // return x - y; }); console.log(arr);join: 数组.join(‘拼接符’);
reverse: 数组.reverse(); 将数组翻转
注意: 改变原数组
arr.reverse(); console.log(arr);concat: 数组a.concat(b, c, d, 项1, …, 项2);
将数组b拼接到数组a上, 返回拼接以后的新数组, 原数组不会改变
var arr = [1, 2, 3]; var b = [4, 5, 6]; var m = arr.concat(b, '猜一猜', b); console.log(m); console.log(arr, b);indexOf: 数组.indexOf(要查找的项, [起始下标]); 从左往右查找, 找得到的时候返回第一个找到的下标, 找不到返回-1
注意: 查找的项与数组中的项必须完全一致(全等)
ie8及以下不支持
lastIndexOf: 数组.lastIndexOf(要查找的项, [起始下标]); 从右向左查找, 找得到的时候返回第一个找到的下标, 找不到返回-1
// [1, 2, 3, 4, 5, 6, "猜一猜", 4, 5, 6] console.log(m.indexOf(1)); // 0 console.log(m.indexOf('4')); // -1 // lastIndexOf: 数组.lastIndexOf(要查找的项, [起始下标]); 从右向左查找, 找得到的时候返回第一个找到的下标, 找不到返回-1 console.log(m.lastIndexOf(4)); // 7 console.log(m.lastIndexOf(4, 6)); // 3every: 针对数组的每一项做一些判断, 如果所有的项判断的结果都为true, 返回的结果就是true, 如果有一个为false, 返回结果就为false
语法: 数组.every(function(value, index, array){ value: 数组的每一项 index:索引 array: 数组本身 });
var s = arr.every(function(value, index, array){ console.log(value, index, array); return value >= 1; }); console.log(s);some: 针对数组的每一项做一些判断, 如果所有的项判断的结果都为false, 返回的结果就是false, 如果有一个为true, 返回结果就为true
语法: 数组.some(function(value, index, array){
value: 数组的每一项 index:索引 array: 数组本身
});
var m = arr.some(function(value, index, array){ console.log(value, index, array); return value >= 15; }); console.log(m);filter: 针对数组中的元素去做一些判断, 满足条件的元素挑选出来, 组成一个新数组并且返回回来
数组.filter(function(value, index){
value: 数组的每一项 index:索引
});
arr = [3,4,5,6,2,1,3,4,5]; var s = arr.filter(function(value, index){ console.log(value, index); return value >=3; }); console.log(s);map: 对数组中的每一项运行给定的函数, 返回每次函数调用的结果组成的一个新数组
数组.map(function(value, index, array){});
var mn = arr.map(function(value, index, array){ console.log(value, index, array); return value * value + index; }); console.log(mn);forEach: 对数组中的每一项运行给定的函数,没有返回值, 就是一个循环
数组.forEach(function(value, index, array){});
var sn = arr.forEach(function(value, index, array){ console.log(value, index, array); array[index] = 1; // return value * value + index; }); console.log(sn); // undefined console.log(arr);要排序的项.localCompare(对比的排序项, [语言]);
不传语言, 默认按照本地环境语言对比
zh–中文 en—英文
var arr = [ { name: '张三', num: 78 }, { name: '李四', num: 38 }, { name: '王五', num: 58 }, ]; // 要排序的项.localCompare(对比的排序项, [语言]); // 不传语言, 默认按照本地环境语言对比 // zh--中文 en---英文 arr.sort(function(a, b){ // console.log(a, b); return a.name.localeCompare(b.name, 'zh'); }); console.log(arr);文档对象模型, 是W3C推荐的处理可拓展标志性语言的标准编程接口
浏览器生成页面时形成的树状结构, 用来表示页面的内部结构, 成为DOM树
类型: nodeType, 1-12数字, 标签-1, 属性-2, 文本-3, 注释-8, 文档-9
名字: nodeName, 所有标签名字都是大写
节点的内容: nodeValue, 只有文本节点才有内容
节点获取语法获取子节点节点.children \节点.childNodes获取父节点节点.parentNode \节点.offsetParent获取首节点父元素.firstChild \父元素.firstElementChild获取尾结点父元素.lastChild\父元素.lastElementChild获取上一个兄弟节点节点.previousSibling\节点.previousElementSibling获取下一个兄弟节点节点.nextSibling\节点.nextElementSibling 节点操作语法创建标签节点document.createElement(‘标签名’)创建文本节点document.createTextNode(‘要显示的内容’)添加节点父节点.appendChild(子节点)在某个节点之前添加节点父节点.insertBefore(要追加的节点, 参考节点)删除自身及子元素父节点.remove()删除某个子节点父节点.removeChild(要移除的节点)替换节点父节点.replaceChild(新节点, 参考节点)克隆节点参考节点.cloneNode(boolean)节点.children: 非标准属性, 获取的标签子节点(ie8及以下含注释节点)
节点.childNodes: 标准属性, 获取到文本节点(ie8及以下只返回标签节点)
var a = document.getElementsByTagName('a')[0]; console.log(a.children); // HTMLCollection console.log(a.childNodes); // NodeList for(var i = 0; i< a.children.length; i++){ var s = a.children[i]; console.log(s, s.nodeType, s.nodeName, s.nodeValue); if(s.nodeType == 1){ // 标签---span console.log(s.childNodes, s.childNodes[0].nodeValue, '1----'); } }节点.parentNode: 直接父元素
节点.offsetParent: 获取距离节点最近的定位父元素, 如果没有, 会找到body
var span1 = document.getElementsByClassName('span1')[0]; console.log(span1.parentNode); console.log(span1.offsetParent);获取首节点
父元素.firstChild: 标准浏览器中会获取到文本节点, 在ie678获取到标签节点
父元素.firstElementChild: 获取到标签节点, ie678不支持
兼容: 父元素.firstElementChild || 父元素.firstChild
var ul = document.getElementsByTagName('ul')[0]; console.log(ul.firstChild); console.log(ul.firstElementChild); // 处理兼容 || 从左到右, 第一个条件为真,直接返回第一个条件的结果, 当第一个条件为假的时候, 判断第二个条件, 返回第二个条件的结果 console.log(ul.firstElementChild || ul.firstChild);获取尾结点
父元素.lastChild: 标准浏览器中会获取到文本节点, 在ie678获取到标签节点
父元素.lastElementChild: 获取到标签节点, ie678不支持
兼容: 父元素.lastElementChild || 父元素.lastChild
console.log(ul.lastChild); console.log(ul.lastElementChild); console.log(ul.lastElementChild || ul.lastChild);获取上一个兄弟节点
节点.previousSibling: 标准中得到文本节点,在ie678获取到标签节点
节点.previousElementSibling: 获取到标签节点, ie678不支持
var box = document.getElementsByTagName('li')[2]; console.log(box); console.log(box.previousSibling); console.log(box.previousElementSibling); console.log(box.previousElementSibling || box.previousSibling);获取下一个兄弟节点
节点.nextSibling: 标准中得到文本节点, 在ie678获取到标签节点
节点.nextElementSibling: 获取到标签节点, ie678不支持
console.log(box.nextSibling); console.log(box.nextElementSibling); console.log(box.nextElementSibling || box.nextSibling);创建标签节点: document.createElement(‘标签名’);
创建文本节点: document.createTextNode(‘要显示的内容’);
var li = document.createElement('li'); var text = document.createTextNode('这是一个新的li'); console.log(li); console.log(text); // 将文本节点添加到标签节点中 li.appendChild(text); console.log(li);注意: 如果追加一个已经存在的元素, 而是发生物理位移
追加节点 : 父节点.appendChild(子节点);
在某个节点之前追加节点 : 父节点.insertBefore(要追加的节点|新节点, 参考节点);
ul.appendChild(li); // ul1.appendChild(li); var lis = document.getElementsByTagName('li'); // ul1.appendChild(lis[0]); ul.insertBefore(li, lis[2]);删除自身及子元素 : 父节点.remove();
删除某个子节点 : 父节点.removeChild(要移除的节点);
ul1.remove(); ul.removeChild(lis[0]);父节点.replaceChild(新节点, 参考节点);
ul.replaceChild(li, lis[0]);参考节点.cloneNode(boolean);
true: 克隆标签和内容, 克隆其中的所有子节点
false: 默认false, 只克隆标签, 不克隆其中的内容
注意: 克隆出来的节点是一个新节点, 变量接收, 不会直接显示在页面中
var newLi = li.cloneNode(true); console.log(newLi); ul.appendChild(newLi); var newUl = ul1.cloneNode(true); console.log(newUl); document.body.appendChild(newUl);获取符合选择器的条件的第一个标签:
document.querySelector(‘选择器’);
选择器写法与css的一致
获取符合选择器的条件的元素的集合:
document.querySelecorAll(‘选择器’);
var li = document.querySelector('.b.a'); console.log(li); console.log(document.querySelector('#one')); // <li id="one"></li> console.log(document.querySelector('li')); // <li id="one"></li> console.log(document.querySelector('.a')); // <span class="a">这是第1个span</span> console.log(document.querySelector('.box,.a')); // <span class="a">这是第1个span</span> console.log(document.querySelector('.box .a')); // <span class="a b">这是第4个span</span> console.log(document.querySelector('.a.b')); // <span class="a b">这是第4个span</span> console.log(document.querySelector('li:nth-child(3)')); console.log(document.querySelector('li[class]')); console.log(document.querySelector('li[class=box]')); console.log(document.querySelector('li:first-child')); console.log(document.querySelectorAll('li')); // 拿到所有li的标签 console.log(document.querySelectorAll('.a')); // 拿到所有类名为a的标签 console.log(document.querySelectorAll('.box .a')); // 拿到所有类名为box的子元素类名为a的标签 var lis = document.getElementsByTagName('li'); var lis1 = document.querySelectorAll('li'); var ul = document.getElementsByTagName('ul')[0]; // 动态性, className与tagName获取的标签具有动态性 // querySelectorAll不具有动态性, 获取的时候存在就能拿到, 不存在就拿不到 ul.innerHTML += '<li>111111111111</li>'; console.log(lis); console.log(lis1);获取: 元素.属性名
设置: 元素.属性名 = 属性值;
box.id box.className = ‘a’;
问题: 1.2不能去操作自定义属性
3.4.5既可以操作固有属性也可以操作自定义属性, 并且html上可见
var div = document.querySelector('div'); console.log(div.className); console.log(div['className']); console.log(div.tag); // undefined console.log(div['tag']); // undefined console.log(div.getAttribute('class')); console.log(div.getAttribute('tag')); // 123 console.log(div.setAttribute('id', 'b')); console.log(div.setAttribute('n', 'ttt')); div.id = ''; div.removeAttribute('id');