1.前言
我们在前面的章节,学习了基本类型和引用类型(Object对象/数组Array/正则表达式),本节课我们讲一下基本包装类型。为了便于操作基本类型值,js 提供了 3 个特殊的引用类型(基本包装类型):Boolean、Number和 String。这些类型与其他引用类型相似,但同时也具有与各自的基本类型相应的特殊行为。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而能够调用一些方法来操作这些数据。
2.理解基本包装类型let text = '丽迪热巴'; console.log(typeof text);//返回:string,基本类型,字符串 //截掉字符串前两位 let new_text = text.substring(2);//对象.方法(参数),这种写法明显是引用类型的写法 //substring(2),括号里面写索引,索引是从0开始,当前2表示从第三个字符(或者第二个位置)截取到字符串末尾输出 console.log(new_text);//返回:'热巴'变量 text 是一个字符串类型,而 text.substring(2)又说明它是一个对象(因为只有对象才会调用方法),最后把处理结果赋值给 new_text。'迪丽热巴'是一个字符串类型的值,按道理它不 应该是对象,不应该会有自己的方法
console.log('迪丽热巴'.substring(2));//直接通过值来调用方法,返回:'热巴'我们发现可以直接用值调用这个方法,印证了上面的“每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而能够调用一些方法来操作这些数据。”这句话。
3.基本包装类型进一步解读
我们以普通声明(字面量声明)和 以new运算符声明字符串 【章节2.javascript基础_4、数据类型_Object 类型_new 操作符来创 建其他类型的对象提到过】做进一步探讨① 字面量写法
let text = '迪丽热巴'; //字面量,基本类型 text.name = '木拉提'; //给基本类型加属性,无效属性 text.age = function () { //给基本类型加方法,无效方法 return 30; }; console.log(text); //'迪丽热巴' console.log(text.substring(2)); //'热巴' console.log(typeof text); //string console.log(text.name); //undefined console.log(text.age()); //错误② new 运算符写法
let text = new String('迪丽热巴'); //new运算符变成了引用类型,String的引用类型,字符串对象 text.name = '木拉提'; //自定义属性,有效属性 text.age = function () { //自定义方法,有效方法 return 30; }; console.log(text); //字符串对象 String {'迪丽热巴', name: '木拉提', age: ƒ} console.log(text.substring(2)); //'热巴' console.log(typeof text); //object console.log(text.name); //'木拉提' console.log(text.age()); //30以上字面量声明和 new 运算符声明很好的展示了他们之间的区别。但有一定还是可以肯定的,那就是不管字面量形式还是 new 运算符形式,都可以使用它的内置方法(如上面的:.substring())。并且Boolean 和 Number 特性与 String 相同,三种类型可以成为基本包装类型。(注意:在使用 new 运算符创建以上三种类型的对象时,可以给自己添加属性和方法,但我们建议不要这样使用,因为这样会导致根本分不清到底是基本类型值还是引用类型值。)
在了解完基本包装类型后,大家现在应该想迫切知道,这三种类型有哪些内置的属性和方法
# 1、 Boolean 类型
# Boolean 类型没有特定的属性或者方法
# 2、 Number 类型
# ① Number类型静态属性:MAX_VALUE、MIN_VALUE、NaN、NEGATIVE_INFINITY、POSITIVE_INFINITY、prototype
Number 类型有一些静态属性(直接通过 Number 调用的属性,而无须 new 运算符)。
Number 静态属性 说 明 MAX_VALUE 表示最大数 MIN_VALUE 表示最小值 NaN 非数值 NEGATIVE_INFINITY 负无穷大,溢出返回该值 POSITIVE_INFINITY 无穷大,溢出返回该值 prototype 原型,用于增加新属性和方法 //理解一下静态属性 let text = 100; console.log(text.MAX_VALUE);//undefined ,这种写法叫做属性 //类型.属性,叫做静态属性 console.log(Number.MAX_VALUE);//1.7976931348623157e+308 console.log(Number.MIN_VALUE);//5e-324 console.log(Number.NaN);//NaN console.log(Number.NEGATIVE_INFINITY);//-Infinity console.log(Number.POSITIVE_INFINITY);//Infinity
# ② toString()方法-将数值转化为字符串,并且可以转换进制
let text = 1501.123; console.log(text.toString());//'1501.123' console.log(typeof text.toString());//string //转换成2进制 console.log(text.toString(2));//111110101.00011111011111001110110110010001011010000111
# ③ toLocaleString()方法-根据本地数字格式转换为字符串
let text = 1501.123; console.log(text.toLocaleString());//'1,501.123' console.log(typeof text.toLocaleString());//string
# ④ toFixed()方法-将数字保留小数点后指定位数并转化为字符串
let text = 1501.123;//小数点保留两位,四舍五入 console.log(text.toFixed(2));//'1501.12' console.log(typeof text.toFixed(2));//string let text1 = 1501.125;//小数点保留两位,四舍五入 console.log(text1.toFixed(2));//1501.13
# ⑤ toExponential()方法-将数字以指数形式表示,保留小数点后指定位数并转化为字符串
let text = 1501.123; console.log(text.toExponential());//'1.501123e+3' 指数形式 console.log(text.toExponential(2));//'1.50e+3' console.log(typeof text.toExponential());//string
# ⑥ toPrecision()方法-指数形式或点形式表述数,保留小数点后面指定位数并转化为字符串
let text = 1501.123; console.log(text.toPrecision());//'1501.123' 点数形式 //根据传参来决定是指数形式还是点数形式 console.log(text.toPrecision(8));//'1501.1230' console.log(text.toPrecision(2));//'1.5e+3' 指数形式 console.log(typeof text.toPrecision());//string
# 3、String类型
- String类型属性
# ① 属性:length - 返回字符串的字符长度
let text = '迪丽热巴'; console.log(text.length);// 4# ② 属性:constructor - 返回创建 String 对象的函数
let text = '迪丽热巴'; console.log(text.constructor);//String() { [native code] }# ③ 属性:prototype - 通过添加属性和方法扩展字符串定义
面向对象再讲解
- String类型通用方法
# ④ 通用方法:valueOf()、toLocaleString()和 toString()方法,返回字符串的基本值,写不写都一样
- String类型字符方法
# ⑤ 字符方法:charAt(n) - 返回指定索引位置的字符
let text = '迪丽热巴'; console.log(text.charAt(0));// '迪' console.log(text.charAt(1));// '丽' console.log(text.charAt(2));// '热' console.log(text.charAt(3));// '巴'# ⑥ 字符方法:charCodeAt(n) - 以 Unicode 编码形式返回指定索引位置的字符
let text = '迪丽热巴s'; console.log(text.charCodeAt(0));// 36842, 返回的是 '迪'字的acssii码 console.log(text.charCodeAt(1));// 20029 console.log(text.charCodeAt(2));// 28909 console.log(text.charCodeAt(3));// 24052 console.log(text.charCodeAt(4));// 115 , 返回的是 's'字符的acssii码# ⑦ 字符方法:数组方式截取字符串
let text = '迪丽热巴s'; console.log(text[0]);//'迪' console.log(text[1]);//'丽' console.log(text[2]);//'热' console.log(text[3]);//'巴' console.log(text[4]);//'s'
- String类型字符串操作方法
# ⑧ 字符串操作方法:concat(str1...str2) - 将字符串参数串联到调用该方法的字符串(拼装字符串)
let text = '迪丽热巴'; console.log(text.concat('s','是美女','!'));//'迪丽热巴s是美女!'# ⑨ 字符串操作方法:slice(n,m) - 返回字符串 n 到 m 之间位置的字符串(截取字符串)
let text = '迪丽热巴s是美女'; console.log(text.slice(1)); //'丽热巴s是美女' 从第1个位置全部取到 console.log(text.slice(1,3)); //'丽热' 从第1个位置取到第3个位置 console.log(text.slice(-2)); //'美女' 总长度8,8+(-2)=6,从第6个位置开始 console.log(text.slice(3,-2)); //'巴s是' 总长度8,8+(-2)=6,就是(3,6) 从第3个位置取到第6个位置 console.log(text.slice(-3,-2));//'是' 总长度8,8+(-3)=5,8+(-2)=6,就是(5,6)从第5个位置取到第6个位置# ⑩ 字符串操作方法:substring(n,m) - 返回字符串 n 到 m 之间位置的字符串(截取字符串)
let text = '迪丽热巴s是美女'; console.log(text.substring(1)); // '丽热巴s是美女' 从第1个位置全部取到 console.log(text.substring(1,3));// '丽热' 从第1个位置取到第3个位置 console.log(text.substring(-2)); // '迪丽热巴s是美女' 负数返回全部字符串 console.log(text.substring(3,-2));// '迪丽热' 参数是负,直接返回0,就是(3,0), // 如果第二个参数比第一个参数小,那么第二个参数提前,就是(0,3)# ⑪ 字符串操作方法:substr(n,m) - 返回字符串 n 开始的 m 个字符串(截取字符串)
let text = '迪丽热巴s是美女'; console.log(text.substr(1)); // '丽热巴s是美女' 从第1个位置全部取到 console.log(text.substr(1,3)); // '丽热巴' 从第1个位置开始,取3个 console.log(text.substr(1,10));// '丽热巴s是美女' 从第1个位置开始,取10个,没那么多,取到末尾 console.log(text.substr(-2)); // '美女' 总长度8,8+(-2)=6,从第6个位置开始 console.log(text.substr(3,-2));// 空 第二个参数负,直接为0,就是(3,0),就是从第3个位置取0个字符,所以没有为空
- String类型字符串位置方法
# ⑫ 字符串位置方法:indexOf(str, n) - 从 n 开始搜索的第一个 str,并将搜索的索引值返回
let text = '迪丽热巴是不是美女'; console.log(text.indexOf('是')); //4 返回'是'的索引,从左往右正向搜索,索引从0开始,正向搜索'是'第一次出现的位置索引 console.log(text.indexOf('是',5));//6 返回'是'的索引,从左往右正向搜索,索引从0开始,当前从索引5开始搜索'是'第一次出现的位置,就是索引6了 console.log(text.indexOf(',')); // -1 找不到则返回 -1# ⑬ 字符串位置方法:lastIndexOf(str, n) - 从 n 开始搜索的最后一个 str,并将搜索的索引值返回
let text = '迪丽热巴是不是美女'; console.log(text.lastIndexOf('是'));//6 返回搜索'是'的索引,从右往左反向搜索,索引从0开始,反向数第一个出现的'是'位置索引 console.log(text.lastIndexOf('是',5));//4 返回搜索'是'的索引,从右往左反向搜索,从索引5往前搜索,第一次出现'是'的位置是索引4 console.log(text.lastIndexOf(','));// -1 找不到则返回 -1# ⑭ 将字符串中的某个字符索引位置全部找出放在数组中
写个函数,将下面字符串中的'是'的位置全部找出来,放在数组中
let text = '迪丽热巴是不是美女,你说是就是'; let arr = []; let firstPos = text.indexOf('是'); console.log(firstPos);//4 //说明找到了,如果第一个都找不到,数组就是空数组 //可以使用while循环,一个一个找 while(firstPos > -1){ //说明找到了一个,把这个先放进数组里面去 arr.push(firstPos); //然后接着当前找到的位置firstPos,接着往后每次加一个位置进行查找firstPos+1 firstPos = text.indexOf('是',firstPos+1); } console.log(arr);//[4, 6, 12, 14]涉及的知识点:
while循环查看:章节4.流程控制语句_3、循环语句_② while 循环语句
数组push查看:章节7.javascript数组_3、数组中的方法_② push()方法
- String类型字符串大小写转换方法
# ⑮ 大小写转换:toLowerCase(str) - 将字符串全部转换为小写
let text = 'I LOVE yOU'; console.log(text.toLowerCase());// 'i love you'# ⑯ 大小写转换:toUpperCase(str) - 将字符串全部转换为大写
let text = 'nice to Meet you'; console.log(text.toUpperCase());// 'NICE TO MEET YOU'# ⑰ 小写转换并且本地化:toLocaleLowerCase(str)、大写转换并且本地化:toLocaleUpperCase(str)
let text = 'I LOVE YOU'; console.log(text.toLocaleLowerCase());//'i love you' text = 'i Love you'; console.log(text.toLocaleUpperCase());//'I LOVE YOU'说明:只有几种语言(如土耳其语)具有地方特有的大小写本地性,一般来说,是否本地化效果都是一致的。
- String类型字符串模式匹配方法
# ⑱ match(pattern) -- 主要用于正则表达式方法
match(pattern)方法主要用于匹配正则表达式,具体我们在正则表达式的章节再讲,讲一下match()方法的简单匹配
let text = '迪丽热巴是不是美女'; console.log(text.match('是')); alert(text.match('是'));//返回: '是' alert(text.match(','));//返回: null 没有找到返回null# ⑲ search(pattern) -- 主要用于正则表达式方法
search(pattern)方法主要用于匹配正则表达式,具体我们在正则表达式的章节再讲,讲一下search()方法的简单匹配
// 跟indexOf()方法类似 let text = '迪丽热巴是不是美女'; console.log(text.search('是'));//返回:4 console.log(text.search(','));//返回: -1 没有找到返回 -1# ⑳ replace(pattern, replacement) -- 用 replacement 替换 pattern 第一次出现的字符
第二个参数字符替换第一个参数字符一次
let text = '迪丽热巴是不是美女'; console.log(text.replace('是','确定'));// '迪丽热巴确定不是美女'# ㉑ replaceAll(pattern, replacement) -- 用 replacement 替换 pattern 所有出现的字符
第二个参数字符替换第一个参数字符出现的所有字符
let text = '迪丽热巴是不是美女'; console.log(text.replaceAll('是','确定'));// '迪丽热巴确定不确定美女'# ㉒ split(pattern) - 返回字符串按指定 pattern 拆分的数组
let text = '迪丽热巴是不是美女'; console.log(text.split('是'));// ['迪丽热巴', '不', '美女'] //按照 '是'这个字符拆分成了数组# ㉓ fromCharCode(ascii) - 静态方法,输出 Ascii 码对应值
参数里面放一个Ascii 码
//静态方法:类型.方法(参数) console.log(String.fromCharCode(77));//'M'# ㉔ localeCompare(str1,str2) - 比较两个字符串,并返回相应的值
let text = 'Reba'; console.log(text.localeCompare('Reba'));//0 两个一样返回0 console.log(text.localeCompare('Raba'));//1 字母相同往后比较,比较两个字母的前后顺序,前面的是1 console.log(text.localeCompare('Peba'));//1 比较两个字母的前后顺序,前面的是1 console.log(text.localeCompare('Seba'));//-1 比较两个字母的前后顺序,后面的是-1
- 判断方法
# ㉕ startsWith(pattern) - 判断字符串是否按 pattern 开头,返回布尔值
let text = '迪丽热巴是不是美女'; console.log(text.startsWith('迪丽'));//true 判断是否以'迪丽'开头 console.log(text.startsWith('热巴'));//false# ㉖ endsWith(pattern) - 判断字符串是否按 pattern 结尾,返回布尔值
let text = '迪丽热巴是不是美女'; console.log(text.endsWith('美女'));//true 判断是否以'美女'结尾 console.log(text.endsWith('热巴'));//false# ㉗ includes(pattern) - 判断字符串是否包含pattern字符,返回布尔值
let text = '迪丽热巴是不是美女'; console.log(text.includes('美女'));//true 判断是否包含'美女'字符 console.log(text.includes('明星'));//false
- 去除空白(空格)方法
# ㉘ trimStart() - 去除字符串开头的空格,返回字符串
let text = ' 迪丽热巴是不是美女 '; console.log(text.trimStart());// '迪丽热巴是不是美女 '# ㉙ trimEnd() - 去除字符串结尾的空格,返回字符串
let text = ' 迪丽热巴是不是美女 '; console.log(text.trimEnd());// ' 迪丽热巴是不是美女'# ㉚ trim() - 去除字符串开头和结尾的空格,返回字符串
let text = ' 迪丽热巴是不是美女 '; console.log(text.trim());// '迪丽热巴是不是美女'
- 其他方法
# ㉛ repeat(n) - 重复字符串n次,返回字符串
let text = '迪丽热巴'; console.log(text.repeat(3));// '迪丽热巴迪丽热巴迪丽热巴'# ㉜ 模板字面量(魔法字符串)
let text = '迪丽热巴'; let str = `你好,${text}`; console.log(str);// '你好,迪丽热巴'关于魔法字符串怎么敲出来,在 章节5.javascript函数_1、函数声明_② 带参数的函数提到过
# 为了方便大家查阅,方法写在一起比较查看
//属性 let text = '迪丽热巴'; console.log(text.length);// 4 返回字符串长度 console.log(text.constructor);//String() { [native code] } 返回字符串构造方法 //通用方法 text = '迪丽热巴'; console.log(text.valueOf());//'迪丽热巴' 返回字符串的基本值,写不写都一样 console.log(text.toLocaleString());//'迪丽热巴' 返回字符串的基本值,写不写都一样 console.log(text.toString());//'迪丽热巴' 返回字符串的基本值,写不写都一样 //字符方法 text = '迪丽热巴'; console.log(text.charAt(0));// '迪' console.log(text.charAt(1));// '丽' console.log(text.charAt(2));// '热' console.log(text.charAt(3));// '巴' text = '迪丽热巴s'; console.log(text.charCodeAt(0));// 36842, 返回的是 '迪'字的acssii码 console.log(text.charCodeAt(1));// 20029 console.log(text.charCodeAt(2));// 28909 console.log(text.charCodeAt(3));// 24052 console.log(text.charCodeAt(4));// 115 , 返回的是 's'字符的acssii码 text = '迪丽热巴s'; console.log(text[0]);//'迪' console.log(text[1]);//'丽' console.log(text[2]);//'热' console.log(text[3]);//'巴' console.log(text[4]);//'s' //操作方法 text = '迪丽热巴'; console.log(text.concat('s','是美女','!'));//'迪丽热巴s是美女!' text = '迪丽热巴s是美女'; console.log(text.slice(1)); //'丽热巴s是美女' 从第1个位置全部取到 console.log(text.slice(1,3)); //'丽热' 从第1个位置取到第3个位置 console.log(text.slice(-2)); //'美女' 总长度8,8+(-2)=6,从第6个位置开始 console.log(text.slice(3,-2)); //'巴s是' 总长度8,8+(-2)=6,就是(3,6) 从第3个位置取到第6个位置 console.log(text.slice(-3,-2));//'是' 总长度8,8+(-3)=5,8+(-2)=6,就是(5,6)从第5个位置取到第6个位置 text = '迪丽热巴s是美女'; console.log(text.substring(1)); // '丽热巴s是美女' 从第1个位置全部取到 console.log(text.substring(1,3));// '丽热' 从第1个位置取到第3个位置 console.log(text.substring(-2)); // '迪丽热巴s是美女' 负数返回全部字符串 console.log(text.substring(3,-2));// '迪丽热' 参数是负,直接返回0,就是(3,0), // 如果第二个参数比第一个参数小,那么第二个参数提前,就是(0,3) text = '迪丽热巴s是美女'; console.log(text.substr(1)); // '丽热巴s是美女' 从第1个位置全部取到 console.log(text.substr(1,3)); // '丽热巴' 从第1个位置开始,取3个 console.log(text.substr(1,10));// '丽热巴s是美女' 从第1个位置开始,取10个,没那么多,取到末尾 console.log(text.substr(-2)); // '美女' 总长度8,8+(-2)=6,从第6个位置开始 console.log(text.substr(3,-2));// 空 第二个参数负,直接为0,就是(3,0),就是从第3个位置取0个字符,所以没有为空 //位置方法 text = '迪丽热巴是不是美女'; console.log(text.indexOf('是')); //4 返回'美'的索引,索引从0开始,正向搜索'美'第一次出现的位置索引 console.log(text.indexOf('是',5));//6 返回'美'的索引,索引从0开始,当前从索引5开始搜索'美'第一次出现的位置,就是索引6了 console.log(text.indexOf(',')); // -1 找不到则返回 -1 text = '迪丽热巴是不是美女'; console.log(text.lastIndexOf('是'));//6 返回搜索'美'的索引,索引从0开始,反向数第一个出现的位置索引 console.log(text.lastIndexOf('是',5));//4 反向搜索,从索引5往前搜索,第一次出现'美'的位置是索引4 console.log(text.lastIndexOf(','));// -1 找不到则返回 -1 //大小写转换方法 text = 'I LOVE yOU'; console.log(text.toLowerCase());// 'i love you' text = 'nice to Meet you'; console.log(text.toUpperCase());// 'NICE TO MEET YOU' text = 'I LOVE YOU'; console.log(text.toLocaleLowerCase());//'i love you' text = 'i Love you'; console.log(text.toLocaleUpperCase());//'I LOVE YOU' //字符串模式匹配方法 text = '迪丽热巴是不是美女'; console.log(text.match('是')); alert(text.match('是'));//返回: '是' alert(text.match(','));//返回: null 没有找到返回null text = '迪丽热巴是不是美女'; console.log(text.search('是'));//返回:4 console.log(text.search(','));//返回: -1 没有找到返回 -1 text = '迪丽热巴是不是美女'; console.log(text.replace('是','确定'));// '迪丽热巴确定不是美女' text = '迪丽热巴是不是美女'; console.log(text.replaceAll('是','确定'));// '迪丽热巴确定不确定美女' text = '迪丽热巴是不是美女'; console.log(text.split('是'));// ['迪丽热巴', '不', '美女'] 按照 '是'这个字符拆分成了数组 //静态方法:类型.方法(参数)-参数里面放一个Ascii 码 console.log(String.fromCharCode(77));//'M' text = 'Reba'; console.log(text.localeCompare('Reba'));//0 两个一样返回0 console.log(text.localeCompare('Raba'));//1 字母相同往后比较,比较两个字母的前后顺序,前面的是1 console.log(text.localeCompare('Peba'));//1 比较两个字母的前后顺序,前面的是1 console.log(text.localeCompare('Seba'));//-1 比较两个字母的前后顺序,后面的是-1 //判断方法 text = '迪丽热巴是不是美女'; console.log(text.startsWith('迪丽'));//true 判断是否以'迪丽'开头 console.log(text.startsWith('热巴'));//false console.log(text.endsWith('美女'));//true 判断是否以'美女'结尾 console.log(text.endsWith('热巴'));//false console.log(text.includes('美女'));//true 判断是否包含'美女'字符 console.log(text.includes('明星'));//false //去除空白(空格)方法 text = ' 迪丽热巴是不是美女 '; console.log(text.trimStart());// '迪丽热巴是不是美女 ' console.log(text.trimEnd()); // ' 迪丽热巴是不是美女' console.log(text.trim()); // '迪丽热巴是不是美女' //其他方法 text = '迪丽热巴'; console.log(text.repeat(3));// '迪丽热巴迪丽热巴迪丽热巴' text = '迪丽热巴'; let str = `你好,${text}`; console.log(str);// '你好,迪丽热巴'
# 4、Array数组的常用方法
# ① join()方法 -- 见章节7:数组
用不同的分隔符将数组分割成字符串 [详见:章节7:数组]
# ② push()方法 -- 见章节7:数组
向数组末尾添加元素,返回修改后数组的长度 [详见:章节7:数组]
# ③ pop()方法 -- 见章节7:数组
移除数组末尾元素,并返回移除的元素 [详见:章节7:数组]
# ④ shift()方法 -- 见章节7:数组
移除数组开头元素,并返回移除的元素 [详见:章节7:数组]
# ⑤ unshift()方法 -- 见章节7:数组
向数组开头添加元素,返回修改后数组的长度 [详见:章节7:数组]
# ⑥ reverse()方法 -- 见章节7:数组
反向排序,返回排序后的数组 [详见:章节7:数组]
# ⑦ sort()方法 -- 见章节7:数组
从小到大排序,返回排序后的数组 [详见:章节7:数组]
# ⑧ concat()方法 -- 见章节7:数组
创建新数组,并添加新元素,原数组没有变化 [详见:章节7:数组]
# ⑨ slice()方法 -- 见章节7:数组
指定数组部分元素组建新数组,原数组没有变化 [详见:章节7:数组]
# ⑩ splice()方法 -- 见章节7:数组
有删除、插入、替换数组元素的功能,原数组发生变化 [详见:章节7:数组]
# ⑪ 数组includes(searchElement,fromIndex)方法 -- 判断数组是否包含一个指定的元素,返回布尔值
第一个参数是要查找的元素值,必填。第二个参数是非必填,从该索引处开始查找你要查找的元素。如果为负值,则按升序从 array.length + fromIndex 的索引开始搜索。默认为 0。
let arr = [10,20,30,40,50]; console.log(arr.includes(10)); //true console.log(arr.includes(10,0)); //true 从索引0往后查找,是否包含10这个元素 console.log(arr.includes(10,1)); //false 从索引1往后查找,是否包含10这个元素 //当第二个参数是负数的时候,则按升序从 array.length(数组长度) + fromIndex 的索引开始 搜索 console.log(arr.includes(20,-1));//false 数组长度5+(-1)=4,相当于(20,4) console.log(arr.includes(20,-4));//true 数组长度5+(-4)=1,相当于(20,1)
# ⑫ 数组reduce()方法 -- 有求和、数组去重、求数组的最大值、扁平化数组的功能
# 1.求和
根据提示,我们可以看到reduce()方法括号里面第一个参数:callbackfn提示表示接收一个回调函数,函数里面的参数是:上一个值,当前值,当前值的下标(索引),数组,第二个参数给一个初始值(数值或者数组等你需要初始化的值),第二个参数也可以省略,省略的话,就是数组中的第一个元素,然后回调函数需要返回一个值
let arr = [1,2,3,4,5,6,7,8,9]; arr.reduce(function(previousValue,currentValue,currentIndex,array){ console.log('上一个值:'+ previousValue); console.log('当前值:'+ currentValue); console.log('当前值下标:'+ currentIndex); console.log('数组:'+ array); //重点理解上一个值,可以理解成是return返回的一个 我们经过一系列操作之后返回的一个值 //return 10; // return preValue + curValue; },0); //求和 let res = arr.reduce(function(previousValue,currentValue,currentIndex,array){ return previousValue + currentValue; },0); console.log(res);//45 //箭头函数改写,用不上的参数可以不写 let $res = arr.reduce((previousValue,currentValue)=>{ return previousValue + currentValue; },0); console.log($res);//45 //箭头函数一行代码的可以省略花括号和return,直接返回 //let _res = arr.reduce((preValue,curValue) => (preValue + curValue),0); let _res = arr.reduce((preValue,curValue) => preValue + curValue); console.log(_res);//45涉及基础知识: 1.变量声明,详见:章节2.javascript基础_3、语法构成_标识符
# 2.数组去重
let arr = [1,2,3,4,5,6,7,8,9,1,2.3,4,5]; let res = arr.reduce(function(previousValue,currentValue){ if(!previousValue.includes(currentValue)){ previousValue.push(currentValue); } return previousValue; },[]); console.log(res);// [1, 2, 3, 4, 5, 6, 7, 8, 9, 2.3] //改成箭头函数 let arr = [1,2,3,4,5,6,7,8,9,1,2.3,4,5]; let res = arr.reduce((previousValue,currentValue)=>{ !previousValue.includes(currentValue) && previousValue.push(currentValue); return previousValue; },[]); console.log(res);// [1, 2, 3, 4, 5, 6, 7, 8, 9, 2.3]涉及基础知识:
# 3.求数组的最大值
let arr = [1,2,3,4,5,6,7,8,9]; let res = arr.reduce(function(previousValue,currentValue){ let i = 0; if(previousValue > currentValue){ i = previousValue; }else{ i = currentValue; } return i; }); console.log(res);//9 //改写成箭头函数、三元运算 let res = arr.reduce((previousValue,currentValue)=>{ // let i = 0; // i = (previousValue > currentValue) ? previousValue : currentValue; // return i; return previousValue > currentValue ? previousValue : currentValue; }); console.log(res);//9涉及基础知识:
# 4.扁平化数组
//将二维数组转成一维数组 let arr = [[1,2],[3,4],[5,6],[7,8],[9,10]]; let res = arr.reduce((previousValue,currentValue)=>{ //解构用法 return [...previousValue,...currentValue]; }); console.log(res);//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# ⑬ 数组find()方法 -- 为数组中的每个元素都调用一次函数执行,返回通过测试(函数内判断)的数组的第一个元素的值
当数组中的元素在测试条件返回 true 时, 返回符合条件的元素,之后的值不会再调用执行函数。如果没有符合条件的元素返回 undefined,对于空数组,函数是不会执行的,find()方法并没有改变数组的原始值。
//深入分析一下这个方法 //array.find(function(currentValue, index, arr), thisValue) //第一个参数:函数,必填。第二个参数:可选。 传递给函数的值一般用 "this" 值。如果这个参数为空, "undefined" 会传递给 "this" 值 //重点看第一个参数:函数里面的参数:currentValue:必填,当前数组元素。index,可选,当前元素的索引。arr:可选。当前元素所属的数组对象 let arr = [3, 10, 19, 20, 35, 50,15,18 ]; arr.find(function(currentValue, index, arr){ console.log('当前数组元素:' + currentValue); console.log('当前数组元素索引:' + index); console.log('当前元素所属的数组对象:' + arr); }); //获取数组中年龄大于 18 的第一个元素 let _arr = arr.find(function(age){ return age > 18; }); console.log(_arr);//19 //分离写法 function text(age){ return age > 18; } let new_arr = arr.find(text); console.log(new_arr);//19 //箭头函数写法 let $arr = arr.find((age)=>{ return age > 18; }); console.log($arr);//19 //箭头函数简写,参数只有一个的可以不写括号,然后代码只有一行的,省略大括号和return let $arr1 = arr.find(age => age > 18); console.log($arr1);//19 //没有符合条件的元素返回 undefined console.log(arr.find(age=> age > 50));//undefined //对于空数组,函数是不会执行的 console.log([].find(age=> age > 50));//undefined //原数组没有变化 console.log(arr);//[3, 10, 19, 20, 35, 50,15,18 ]
# ⑭ 数组findIndex()方法 -- 为数组中的每个元素都调用一次函数执行,返回传入一个测试条件(函数)符合条件的数组第一个元素位置
当数组中的元素在测试条件时返回 true 时, findIndex() 返回符合条件的元素的索引位置,之后的值不会再调用执行函数。如果没有符合条件的元素返回 -1。findIndex() 对于空数组,函数是不会执行的。findIndex() 并没有改变数组的原始值。
//深入分析一下这个方法 //array.findIndex(function(currentValue, index, arr), thisValue) //第一个参数:函数,必填。第二个参数:可选。 传递给函数的值一般用 "this" 值。如果这个参数为空, "undefined" 会传递给 "this" 值 //重点看第一个参数:函数里面的参数:currentValue:必填,当前数组元素。index,可选,当前元素的索引。arr:可选。当前元素所属的数组对象 let arr = [3, 10, 19, 20, 35, 50,15,18 ]; arr.findIndex(function(currentValue, index, arr){ console.log('当前数组元素:' + currentValue); console.log('当前数组元素索引:' + index); console.log('当前元素所属的数组对象:' + arr); },this); //获取数组中年龄大于 18 的第一个元素索引位置 let _arr = arr.findIndex(function(age){ return age > 18; }); console.log(_arr);//2 19对应的索引下标是2 //分离写法 function text(age){ return age > 18; } let new_arr = arr.findIndex(text); console.log(new_arr);//2 //箭头函数写法 let $arr = arr.findIndex((age)=>{ return age > 18; }); console.log($arr);//2 //箭头函数简写,参数只有一个的可以不写括号,然后代码只有一行的,省略大括号和return let $arr1 = arr.findIndex(age => age > 18); console.log($arr1);//2 //没有符合条件的元素返回 -1 let $arr2 = arr.findIndex(age => age > 50); console.log($arr2);//-1 //对于空数组,函数是不会执行的 返回 -1 let $arr3 = [].findIndex(age => age > 50); console.log($arr3);//-1 //原数组没有变化 console.log(arr);//[3, 10, 19, 20, 35, 50,15,18 ]
# ⑮ 数组filter() 方法 -- 为数组中的每个元素都调用一次函数执行, 创建一个新的数组,返回传入一个测试条件(函数)符合条件的数组的所有元素
当数组中的元素在测试条件时返回 true 时, 放入新的数组中,如果没有符合条件的元素则返回空数组。filter()方法对于空数组,函数是不会执行的。filter()方法并没有改变数组的原始值。
//深入分析一下这个方法 //array.filter(function(currentValue, index, arr), thisValue) //第一个参数:函数,必填。第二个参数:可选。 传递给函数的值一般用 "this" 值。如果这个参数为空, "undefined" 会传递给 "this" 值 //重点看第一个参数:函数里面的参数:currentValue:必填,当前数组元素。index,可选,当前元素的索引。arr:可选。当前元素所属的数组对象 let arr = [3, 10, 19, 20, 35, 50,15,18 ]; arr.filter(function(currentValue, index, arr){ console.log('当前数组元素:' + currentValue); console.log('当前数组元素索引:' + index); console.log('当前元素所属的数组对象:' + arr); },this); //获取数组中年龄大于 18 的所有元素放入到新数组中 let _arr = arr.filter(function(age){ return age > 18; }); console.log(_arr);//[19, 20, 35, 50] //分离写法 function text(age){ return age > 18; } let new_arr = arr.filter(text); console.log(new_arr);//[19, 20, 35, 50] //箭头函数写法 let $arr = arr.filter((age)=>{ return age > 18; }); console.log($arr);//[19, 20, 35, 50] //箭头函数简写,参数只有一个的可以不写括号,然后代码只有一行的,省略大括号和return let $arr1 = arr.filter(age => age > 18); console.log($arr1);//[19, 20, 35, 50] //没有符合条件的元素返回 [] let $arr2 = arr.filter(age => age > 50); console.log($arr2);//[] //对于空数组,filter()方法是不会执行的 [] let $arr3 = [].filter(age =>age > 18); console.log($arr3);//[] //原数组没有变化 console.log(arr);//[3, 10, 19, 20, 35, 50, 15, 18]我们在讲对象的时候,章节6.javascript对象_3、对象中的方法及应用_② 对象的应用 我们可以把我们的网站导航栏每一项看成一个对象。我们把这些对象放进数组里面去。
let menus = [ { name:'网站首页',en_name:'home',href:'index.html',type:'public' }, { name:'关于我们',en_name:'about',href:'about.html' ,type:'public' }, { name:'工程案例',en_name:'case',href:'case.html' ,type:'public' }, { name:'会员中心',en_name:'user',href:'user.html' ,type:'private' }, { name:'后台管理',en_name:'admin',href:'admin.html',type:'private' } ]; //问题:会员中心和后台管理不应该放在栏目中,请将数组中的前三个对象放在新数组中 let _menus = menus.filter((currentValue, index, arr)=>{ // console.log('当前数组元素:' + JSON.stringify(currentValue)); // console.log('当前数组元素索引:' + index); // console.log('当前元素所属的数组对象:' + arr); // console.log(currentValue.name); //console.log(currentValue.type); // if(currentValue.type === 'public'){ // return true; // }else{ // return false; // } console.log(currentValue.type === 'public'); return currentValue.type == 'public'; }); console.log(_menus); //简写 let $menus = menus.filter(item => item.type == 'public'); console.log($menus);
# ⑯ 数组map() 方法 -- 为数组中的每个元素都调用一次函数执行, 创建一个新的数组,返回原始数组元素调用函数处理后的值
此方法在数组映射方面用得比较多,map() 方法按照原始数组元素顺序依次处理元素, map() 不会对空数组进行检测,原数组根据处理情况会发生变化。
//深入分析一下这个方法 //array.map(function(currentValue, index, arr), thisValue) //第一个参数:函数,必填。第二个参数:可选。 传递给函数的值一般用 "this" 值。如果这个参数为空, "undefined" 会传递给 "this" 值 //重点看第一个参数:函数里面的参数:currentValue:必填,当前数组元素。index,可选,当前元素的索引。arr:可选。当前元素所属的数组对象 // let arr = [3, 10, 19, 20, 35, 50,15,18 ]; // arr.map(function(currentValue, index, arr){ // console.log('当前数组元素:' + currentValue); // console.log('当前数组元素索引:' + index); // console.log('当前元素所属的数组对象:' + arr); // },this); let menus = [ { name:'网站首页',en_name:'home',href:'index.html',type:'public' }, { name:'关于我们',en_name:'about',href:'about.html' ,type:'public' }, { name:'工程案例',en_name:'case',href:'case.html' ,type:'public' }, { name:'会员中心',en_name:'user',href:'user.html' ,type:'private' }, { name:'后台管理',en_name:'admin',href:'admin.html',type:'private' } ]; menus.map(function(currentValue, index, arr){ // console.log('当前数组对象元素:' + currentValue); // console.log('当前数组对象元素字符串:' + JSON.stringify(currentValue)); // console.log('当前数组对象元素索引:' + index); // console.log('当前元素所属的数组对象:' + arr); },this); //映射 let $_menus = menus.map(item =>{ return { menu_name:item.name, href:item.href } }); console.log($_menus); //此时原数组没有变化 console.log(menus); //要求给数组里面的每个元素,加一个属性site值是http://docs.51yrc.com let _menus = menus.map(function(currentValue, index, arr){ currentValue.site = 'http://docs.51yrc.com'; //console.log(JSON.stringify(currentValue)); return currentValue; //下面的写法仅仅返回每个元素对象里面site属性的值,我们需要返回每个对象 //return currentValue.site = 'http://docs.51yrc.com'; }); console.log(_menus); let $menus = menus.map(item => { item.site = 'http://docs.51yrc.com'; return item; }); console.log($menus); //对于空数组,map()方法是不会执行的 let $menus1 = [].map(item => { item.site = 'http://docs.51yrc.com'; return item; }); console.log($menus1);//返回空数组 //原数组根据处理情况发生了变化 console.log(menus);
# ⑰ 数组forEach() 方法 -- 为数组中的每个元素都调用一次函数执行,并将元素传递给回调函数,没有返回值
forEach()方法按照原始数组元素顺序依次处理元素, forEach()方法不会对空数组进行检测,根据处理的情况,会对原数组产生影响
//深入分析一下这个方法 //array.forEach(function(currentValue, index, arr), thisValue) //第一个参数:函数,必填。第二个参数:可选。 传递给函数的值一般用 "this" 值。如果这个参数为空, "undefined" 会传递给 "this" 值 //重点看第一个参数:函数里面的参数:currentValue:必填,当前数组元素。index,可选,当前元素的索引。arr:可选。当前元素所属的数组对象 let arr = [3, 10, 19, 20, 35, 50,15,18 ]; // arr.forEach(function(currentValue, index, arr){ // console.log('当前数组元素:' + currentValue); // console.log('当前数组元素索引:' + index); // console.log('当前元素所属的数组对象:' + arr); // },this); let menus = [ { name:'网站首页',en_name:'home',href:'index.html',type:'public' }, { name:'关于我们',en_name:'about',href:'about.html' ,type:'public' }, { name:'工程案例',en_name:'case',href:'case.html' ,type:'public' }, { name:'会员中心',en_name:'user',href:'user.html' ,type:'private' }, { name:'后台管理',en_name:'admin',href:'admin.html',type:'private' } ]; menus.forEach(function(currentValue, index, arr){ console.log('当前数组对象元素:' + currentValue); console.log('当前数组对象元素字符串:' + JSON.stringify(currentValue)); console.log('当前数组对象元素索引:' + index); console.log('当前元素所属的数组对象:' + arr); },this); //没有返回值,在回调函数(匿名函数)里面处理 let _menus = menus.forEach(function(currentValue, index, arr){ currentValue.site = 'http://docs.51yrc.com'; return currentValue; }); console.log(_menus);//undefined //根据处理的情况,会对原数组产生影响 menus.forEach(function(currentValue, index, arr){ currentValue.site = 'http://docs.51yrc.com'; }); console.log(menus); //简写 menus.forEach(item=>item.site = 'http://docs.51yrc.com'); console.log(menus); //对于空数组是不会执行回调函数的 let arr_empty = []; arr_empty.forEach(item=>item.site = 'http://docs.51yrc.com'); console.log(arr_empty);//返回:[]
# ⑱ 数组indexOf() 方法 -- 返回数组中某个指定的元素位置,从头到尾查找数组元素
方法将从头到尾地检索数组,看它是否含有对应的元素,如果在数组中没找到指定元素则返回 -1。
let text = ['迪丽热巴','古力娜扎',35,'华仔','梁咏琪',888,'梁咏琪']; console.log(text.indexOf('梁咏琪')); //4 返回元素'梁咏琪'的索引,索引从0开始,正向搜索'梁咏琪'第一次出现的位置索引 console.log(text.indexOf('梁咏琪',5));//6 返回元素'梁咏琪'的索引,索引从0开始,当前从索引5开始搜索'梁咏琪'第一次出现的位置,就是索引6了 console.log(text.indexOf(',')); // -1 找不到则返回 -1
# ⑲ 数组lastIndexOf() 方法 -- 返回一个指定的元素在数组中最后出现的位置,从后面向前查找数组元素
方法将从后面向前检索数组,看它是否含有对应的元素,如果在数组中没找到指定元素则返回 -1。
let text = ['迪丽热巴','古力娜扎',35,'华仔','梁咏琪',888,'梁咏琪']; console.log(text.lastIndexOf('梁咏琪')); //6 返回元素'梁咏琪'的索引,索引从0开始,反向搜索'梁咏琪'第一次出现的位置索引 console.log(text.lastIndexOf('梁咏琪',5));//4 返回元素'梁咏琪'的索引,索引从0开始,当前从索引5往前(左边)搜索'梁咏琪'第一次出现的位置,就是索引4了 console.log(text.lastIndexOf(',')); // -1 找不到则返回 -1
# ⑳ 数组at() 方法 -- 接收一个整数值并返回该索引对应的数组元素
允许正数和负数。负整数从数组中的最后一个元素开始倒数,如果找不到指定的索引,则返回 undefined。可以类比字符串的charAt()方法。
let text = ['迪丽热巴','古力娜扎',35,'华仔','梁咏琪',888,'梁咏琪']; console.log(text.at(0));//'迪丽热巴' console.log(text.at(4));//'梁咏琪' console.log(text[0]);//'迪丽热巴' console.log(text[4]);//'梁咏琪' console.log(text.at(-4));//'华仔' 总长度7+(-4)=3,相当于text.at(3) console.log(text[-4]);//undefined console.log(text.at(8));//undefined 超出了索引范围,找不到返回undefined
# ㉑ 数组fill() 方法 -- 用于将一个固定值替换数组的元素,返回原数组,原数组会发生变化
let text = ['迪丽热巴','古力娜扎',35,'华仔','梁咏琪',888,'梁咏琪']; //console.log(text.fill(520));//[520, 520, 520, 520, 520, 520, 520] //console.log(text);//数组已被改变 //语法:array.fill(value, start, end) //value:必需,填充的值 start:可选,开始填充位置。 end:可选。停止填充位置 (默认为 array.length数组长度) //console.log(text.fill(520,2));//['迪丽热巴', '古力娜扎', 520, 520, 520, 520, 520] //console.log(text.fill(520,2,4));//['迪丽热巴', '古力娜扎', 520, 520, '梁咏琪', 888, '梁咏琪']
# ㉒ 数组copyWithin() 方法 -- 将指定位置的元素复制到其他位置,返回原数组,原数组会发生变化
let text = ['迪丽热巴','古力娜扎',35,'华仔','梁咏琪',888,'梁咏琪']; //语法:array.copyWithin(target, start, end) //target:必填,从该位置开始替换数据 //start (可选):从该位置开始读取数据,默认为 0 。如果为负值,表示倒数。 //end (可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示倒数。 //这三个参数都应该是数值,如果不是,会自动转为数值 //console.log(text.copyWithin(0));//['迪丽热巴', '古力娜扎', 35, '华仔', '梁咏琪', 888, '梁咏琪'] //相当于text.copyWithin(1,0,7); //console.log(text.copyWithin(1));//['迪丽热巴', '迪丽热巴', '古力娜扎', 35, '华仔', '梁咏琪', 888] //console.log(text.copyWithin(0,6));// ['梁咏琪', '古力娜扎', 35, '华仔', '梁咏琪', 888, '梁咏琪'] //console.log(text.copyWithin(0,3,4));// ['华仔', '古力娜扎', 35, '华仔', '梁咏琪', 888, '梁咏琪'] //-3相当于7+(-3)= 4,-1相当于7+(-1)=6 即:text.copyWithin(0,4,6) //console.log(text.copyWithin(0,-3,-1));// ['梁咏琪', 888, 35, '华仔', '梁咏琪', 888, '梁咏琪'] //console.log(text.copyWithin(0,4,7));// ['梁咏琪', 888, '梁咏琪', '华仔', '梁咏琪', 888, '梁咏琪']
# ㉓ 数组isArray() 方法 -- 静态方法,判断一个对象是否为数组
如果对象是数组返回 true,否则返回 false。前面我们提到判断变量属性:章节10_3、变量_⑥ 检测变量类型:typeof()、instanceof()
//是否是数组 let text1 = [1,2,3]; console.log(text1 instanceof Array); //返回: true console.log(Array.isArray(text1));//返回: true
# ㉔ 合并数组:es6的扩展运算符
let arr1 = [1,2,3]; let arr2 = ['迪丽热巴', '古力娜扎', 35]; console.log(arr1.concat(arr2));//[1, 2, 3, '迪丽热巴', '古力娜扎', 35] console.log([...arr1,...arr2]);//[1, 2, 3, '迪丽热巴', '古力娜扎', 35]
# ㉕ 数组every() 方法 --检测数组所有元素是否全部符合指定条件(通过函数提供),返回布尔值
every() 方法使用指定函数检测数组中的所有元素:如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测,如果所有元素都满足条件,则返回 true。every() 不会对空数组进行检测。every() 不会改变原始数组。
//every的语法 //array.every(function(currentValue, index, arr), thisValue) //第一个参数:函数,必填。第二个参数:可选。 传递给函数的值一般用 "this" 值。如果这个参数为空, "undefined" 会传递给 "this" 值 //重点看第一个参数:函数里面的参数:currentValue:必填,当前数组元素。index,可选,当前元素的索引。arr:可选。当前元素所属的数组对象 let arr = [30, 20, 17, 19, 20, 35, 50,15,18 ]; arr.every(function(currentValue, index, arr){ console.log('当前数组元素:' + currentValue); console.log('当前数组元素索引:' + index); console.log('当前元素所属的数组对象:' + arr); },this); //检查数组中所有年龄是不是都大于18岁 let $arr = arr.every((currentValue)=>{ //console.log('当前数组元素:' + currentValue); return currentValue > 18; }); console.log($arr);//false let $arr1 = arr.every((currentValue)=>{ //console.log('当前数组元素:' + currentValue); return currentValue > 1; }); console.log($arr1);//true //简写 let $arr2 = arr.every(age=>age > 1); console.log($arr2);//true //不会对空数组进行检测 let $arr3 = [].every(age=>age > 1); console.log($arr3);//true //原数组不变 console.log(arr);//[30, 20, 17, 19, 20, 35, 50, 15, 18]
# ㉖ 数组some() 方法 -- 检测数组所有元素,只要有一个元素通过函数检测返回真,那么就返回真,且后面的元素不在检测,否则返回 假。
some()方法对数组中存在的每个元素执行一次函数,如果找到函数返回真值的数组元素,返回真(并且不检查剩余值),否则返回 false。对空数组元素不执行函数。不改变原始数组。
//some()方法的语法 //array.some(function(currentValue, index, arr), thisValue) //第一个参数:函数,必填。第二个参数:可选。 传递给函数的值一般用 "this" 值。如果这个参数为空, "undefined" 会传递给 "this" 值 //重点看第一个参数:函数里面的参数:currentValue:必填,当前数组元素。index,可选,当前元素的索引。arr:可选。当前元素所属的数组对象 let arr = [30, 20, 17, 19, 20, 35, 50,15,18 ]; arr.some(function(currentValue, index, arr){ console.log('当前数组元素:' + currentValue); console.log('当前数组元素索引:' + index); console.log('当前元素所属的数组对象:' + arr); },this); //检查数组中所有年龄有没有大于18岁的 let $arr = arr.some((currentValue)=>{ //console.log('当前数组元素:' + currentValue); return currentValue > 18; }); console.log($arr);//true let $arr1 = arr.some((currentValue)=>{ //console.log('当前数组元素:' + currentValue); return currentValue > 1; }); console.log($arr1);//true //简写 let $arr2 = arr.some(age=>age > 1); console.log($arr2);//true //不会对空数组进行检测 let $arr3 = [].some(age=>age > 1); console.log($arr3);//false //原数组不变 console.log(arr);//[30, 20, 17, 19, 20, 35, 50, 15, 18]
# ㉗ 数组 for...of遍历
//普通数组 let arr = [3, 10, 19, 20, 35, 50,15,18 ]; for(let x of arr){ console.log(x);//返回数组中的每个元素 } //对象数组 let menus = [ { name:'网站首页',en_name:'home',href:'index.html',type:'public' }, { name:'关于我们',en_name:'about',href:'about.html' ,type:'public' }, { name:'工程案例',en_name:'case',href:'case.html' ,type:'public' }, { name:'会员中心',en_name:'user',href:'user.html' ,type:'private' }, { name:'后台管理',en_name:'admin',href:'admin.html',type:'private' } ]; for(let y of menus){ console.log(y);//返回数组中的每个元素 } //希望如下格式 /* 索引: 0 ----3 索引: 1 ----10 ... 索引: 7 ----18 */ for(let i=0;i<arr.length;i++){ console.log('索引: '+ i + '----' + arr[i]); } console.log(i); for(let j=0;j<menus.length;j++){ console.log('索引: '+ j + '----' + menus[j]); } //还有没有其他的方法?
# ㉘ 数组keys(),数组values(),数组entries()方法 -- 用于遍历数组,都返回一个遍历器对象。
它们都返回一个遍历器对象,可以用for…of循环进行遍历,区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历.
let arr = [3, 10, 19, 20, 35, 50,15,18 ]; console.log(arr.keys());//Array Iterator {} 数组迭代器(遍历器)对象 console.log(arr.values());//Array Iterator {} 数组迭代器(遍历器)对象 console.log(arr.entries());//Array Iterator {} 数组迭代器(遍历器)对象 //对应迭代器,我们使用 for...of循环进行遍历 for (let index of arr.keys()) { console.log('数组的索引:' + index);//循环输出数组的索引:0到7 } for (let value of arr.values()) { console.log('数组的元素:' + value);//循环输出数组的每个元素 } /* 索引:0----3 索引:1----10 .... 索引:7----18 */ for (let [index, value] of arr.entries()) { console.log('索引:' + index + '----' + value); } //如果不使用for...of循环,可以手动调用遍历器对象的next方法,进行遍历 let _entries = arr.entries(); //console.log(_entries.next().value); // [0, 3] //console.log(_entries.next().value); // [1, 10] let [index, value] = _entries.next().value; console.log('索引:' + index + '----' + value); let [index1, value1] = _entries.next().value; console.log('索引:' + index1 + '----' + value1);
# ㉙ 数组reduceRight() 方法-- 和reduce方法刚好相反,reduce可以看成是数组元素(从左到右)依次处理,reduceRight是(从右往左处理)
let arr = [1,2,3,4,5,6,7,8,9]; arr.reduce(function(previousValue,currentValue,currentIndex,array){ //重点理解上一个值,可以理解成是return返回的一个 我们经过一系列操作之后返回的一个值 console.log('reduce上一个值经过一系列操作之后返回的一个值:'+ previousValue); console.log('reduce当前值:'+ currentValue); console.log('reduce当前值下标:'+ currentIndex); console.log('reduce数组:'+ array); //return 10; },0); arr.reduceRight(function(previousValue,currentValue,currentIndex,array){ //重点理解上一个值,可以理解成是return返回的一个 我们经过一系列操作之后返回的一个值 console.log('reduceRight上一个值经过一系列操作之后返回的一个值:'+ previousValue); console.log('reduceRight当前值:'+ currentValue); console.log('reduceRight当前值下标:'+ currentIndex); console.log('reduceRight数组:'+ array); //return 10; },0); //求和 let $res = arr.reduceRight((previousValue,currentValue)=>{ return previousValue + currentValue; },0); console.log($res);//45 //数组去重不合适了(返回的结果跟原数组比,元素排序相反,结果也有问题) let arr1 = [1,2,3,4,5,6,7,8,9,1,2.3,4,5]; let $res1 = arr1.reduceRight((previousValue,currentValue)=>{ !previousValue.includes(currentValue) && previousValue.push(currentValue); return previousValue; },[]); console.log($res1);//[5, 4, 2.3, 1, 9, 8, 7, 6, 3, 2] //求数组的最大值 let arr2 = [1,2,3,4,5,6,7,8,9]; let $res2 = arr.reduceRight((previousValue,currentValue)=>{ // let i = 0; // i = (previousValue > currentValue) ? previousValue : currentValue; // return i; return previousValue > currentValue ? previousValue : currentValue; }); console.log($res2);//9 //扁平化数组(不合适) //将二维数组转成一维数组 let arr3 = [[1,2],[3,4],[5,6],[7,8],[9,10]]; let $res3 = arr3.reduceRight((previousValue,currentValue)=>{ //解构用法 return [...previousValue,...currentValue]; }); console.log($res3);//[9, 10, 7, 8, 5, 6, 3, 4, 1, 2]
# ㉚ 数组flat() 方法 --按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回(将多维数组解构成一维数组)
返回一个包含将数组与子数组中所有元素的新数组
//语法 //array.flat() //array.flat(depth) 指定要提取嵌套数组的结构深度,默认值为 1 let arr1 = [1, 2, [3, 4]]; console.log(arr1.flat()); // [1, 2, 3, 4] let arr2 = [1, 2, [3, 4, [5, 6]]]; console.log(arr2.flat());// [1, 2, 3, 4, [5, 6]] let arr3 = [1, 2, [3, 4, [5, 6]]]; console.log(arr3.flat(2));// [1, 2, 3, 4, 5, 6] //使用 Infinity,可展开任意深度的嵌套数组 let arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]]; console.log(arr4.flat(Infinity));// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] //所以我们上面的reduce用法扁平化数组,也可以这么写 let arr5 = [[1,2],[3,4],[5,6],[7,8],[9,10]]; console.log(arr5.flat(Infinity));// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] //flat() 方法会移除数组中的空项: let arr6 = [1, 2, , 4, 5]; console.log(arr6.flat());// [1, 2, 4, 5]
# ㉛数组flatMap() 方法 --首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。创建一个新的数组,其中每个元素都是回调函数的结果,结构深度(depth)为 1 只有一层深度。
它与 map 连着深度值为 1 的 flat 几乎相同,但 flatMap 通常在合并成一种方法的效率稍微高一些。
//flatMap() 方法的语法: //flatMap(function(currentValue, index, array),thisArg) //currentValue:当前正在数组中处理的元素,index:可选的。数组中正在处理的当前元素的索引。array:可选的。被调用的数组. //thisArg:可选的。执行 callback 函数时 使用的this 值 let arr = [3, 10, 19, 20, 35, 50,15,18 ]; arr.flatMap(function(currentValue, index, arr){ console.log('当前数组元素:' + currentValue); console.log('当前数组元素索引:' + index); console.log('当前元素所属的数组对象:' + arr); }); //它与 map 连着深度值为 1 的 flat 几乎相同,但 flatMap 通常在合并成一种方法的效率稍微高一些 let arr1 = [1, 2, 3, 4]; //要求返回结果:[[2], [4], [6], [8]] //map()方法怎么写: // let arr1_map = arr1.map((currentValue, index, arr)=>{ // return [currentValue * 2]; // }); // console.log(arr1_map);//[[2], [4], [6], [8]] let $arr1_map = arr1.map(a=>[a*2]); console.log($arr1_map);//[[2], [4], [6], [8]] //flatMap()怎么写呢? let $arr1_flatmap = arr1.flatMap(a=>[a*2]); console.log($arr1_flatmap);//[2, 4, 6, 8] let $arr1_flatmap1 = arr1.flatMap(a=>[[a*2]]); console.log($arr1_flatmap1);//[[2], [4], [6], [8]] //虽然上面的代码使用 map 和 flatMap 好像都可以, 现在看一下区别 let arr2 = ['I LOVE YOU', '', 'china']; //将上面数组拆分成单个词组成的新数组 // let arr2_map = arr2.map((currentValue, index, arr)=>{ // return currentValue.split(' '); // }); // console.log(arr2_map);// [['I', 'LOVE', 'YOU'],[''],['china']] let $arr2_map = arr2.map(a=>a.split(' ')); console.log($arr2_map);// [['I', 'LOVE', 'YOU'],[''],['china']] let $arr2_flatmap = arr2.flatMap(a=>a.split(' ')); console.log($arr2_flatmap);//['I', 'LOVE', 'YOU', '', 'china'] let $arr3_flatmap = arr2.flatMap(a=>[a.split(' ')]); console.log($arr3_flatmap);//[['I', 'LOVE', 'YOU'],[''],['china']]
# ㉜ 数组from()方法 -- 静态方法,将一个类数组对象转为数组
类数组对象就是类似于数组的对象,如我们之前学习的arguments对象[详见:章节5.javascript函数_3、函数的arguments 对象] ,它是一个对象,但是它的取值可以arguments[0],就是说它能像数组一样取值操作,像这种类似数组的对象,我们称之为:类数组对象,但是它毕竟不是数组。所以,我们可以用from()方法,将一个类数组对象转为数组。
//语法:它是一个静态方法:类型.方法(参数) //Array.from(类数组对象); function text(){ //return arguments[0]; //return arguments[1]; //return arguments[0] + ',胸围:'+arguments[1]+',体重:'+arguments[2]+',升高:'+arguments[3]; //参数不够则是undefined //return arguments[0] + ',胸围:'+arguments[1]+',体重:'+arguments[2]+',升高:'+arguments[3]+arguments[4]; //return arguments; return Array.from(arguments);//['迪丽热巴', '85cm', '52kg', '172cm'] } console.log(text('迪丽热巴','85cm','52kg','172cm'));// '迪丽热巴,胸围:85cm,体重:52kg,升高:172cm'
# ㉝ 数组of()方法 -- 静态方法,将一组数据转为数组
这个方法主要是为了解决一个缺陷:使用 new Array()创建数组时,括号内传一个参数,默认会将该数据认为是数据长度的问题。[详见:章节7.javascript数组_1、创建及读取数组_使用 new 关键字创建 Array(数组)]
//静态方法,语法:Array.of(数据1,数据2,数据3...),如:Array.of(100,123,305) console.log(Array.of(100,123,305));// [100, 123, 305] //这个方法主要是为了解决一个缺陷:使用 new Array()创建数组时,括号内传一个参数,默认会将该数据认为是数据长度的问题。 console.log(new Array(1,2,3));//[1, 2, 3] let text = new Array(5);//let text = Array(5); alert(text);// ,,,, 4个逗号,需要赋值 //如果此时,我认为就是数组 [5],可以这么写 console.log(Array.of(5));//[5] 但一般我们用字面量声明: let arr = [5];
# 5、集合类型: Set()方法
Set()方法 : 是一组唯一值的集合(数组去重),每个值只能在 Set 中出现一次,可以容纳任何数据类型的值.
es6新增的 Set 是一种新集合类型(它可以用来处理数组,所以我们在数组用法这章也讲一下这个方法)。
# 1. 创建Set集合实例(使用new关键词,可以类比于之前学习的Date,时间日期对象,说明Set也是对象的一种)
使用 new 关键字和 Set 构造函数可以创建一个空集合:
let s = new Set(); console.log(typeof s);//'object'# 2. 如果想在创建的同时初始化实例,则可以给 Set 构造函数传入一个可迭代对象,其中需要包含插入到新集合实例中的元素(Set 可以包含任何js数据类型作为值):
let s1 = new Set(["val1", 1, true, {}, undefined, function fun() {}]); console.log(s1);# 3. Set集合实例转数组,Set结构不会添加重复的值(处理数组去重等问题)
// Set实例转数组 let _set = new Set([1, 2, 3]); console.log(Array.from(_set)); // [1, 2, 3] // Set集合结构不会添加重复的值 let s = new Set([1, 1, 2, 3, 4, 4, 5, 6, 7, 4, 2, 1]); console.log(Array.from(s)); // [1, 2, 3, 4, 5, 6, 7] //经常用Set集合解决数组去重问题 let arr = [1, 2, 3, 3, 4, 5, 4, 4, 2, 1, 3]; console.log(Array.from(new Set(arr))); // [1, 2, 3, 4, 5]# 4. Set集合size属性:获取Set集合实例的元素个数
let s = new Set([1, 2, 3]); console.log(s.size); // 3# 5. Set集合add()方法:添加元素
let s = new Set(); s.add(1).add(2).add(3); console.log(Array.from(s)); // [1, 2, 3]# 6. Set集合has()方法:查询Set实例是否存在某元素(返回布尔值)
let s = new Set(); s.add(1).add(2).add(3); console.log(s.has(1)); // true# 7. Set集合delete()方法:删除Set实例中某个元素(返回布尔值)
let s = new Set(); s.add(1).add(2); console.log(s.delete(1));//true console.log(Array.from(s)); // [2]# 8. Set集合clear()方法:清空Set实例
let s = new Set(); s.add(1).add(2).add(3); console.log(Array.from(s)); // [1, 2, 3] console.log(s.clear());//undefined 没有返回值,所以直接写:s.clear() console.log(Array.from(s)); // []# 9. Set集合迭代遍历数据:keys():返回键名,values(): 返回键值,entries(): 返回键值对, 注意它的键名=键值
let s = new Set(); s.add(1).add(2).add('迪丽热巴').add({age:31}); console.log(s); console.log(Array.from(s.keys())); console.log(Array.from(s.values())); console.log(Array.from(s.entries()));# 10.Set集合迭代遍历数据:for...of遍历,forEach遍历
let s = new Set(); s.add(1).add(2).add('迪丽热巴').add({age:31}); //for..of遍历 for (let i of s) { console.log('for..of遍历结果:' + i); } //forEach遍历 s.forEach(function(currentValue,index){ console.log('当前值:'+currentValue+'----索引键:'+index); }); s.forEach((value,key)=>console.log('当前值:'+value+'----索引键:'+key));
# 6、小结及拓展
# ① 求两个数组的并集、交集、差集,得到的结果是一个新数组
let arr1 = [10,21,35,54,10,35,3]; let arr2 = [21,35,77,61,14,77]; // 求并集(就是两个数组合并之后,不能有重复的元素) let $arr = [...arr1,...arr2]; console.log($arr);//[10, 21, 35, 54, 10, 35, 3, 21, 35, 77, 61, 14, 77] $arr = new Set($arr); console.log($arr);//Set集合,然后转成新数组 console.log(Array.from($arr));// [10, 21, 35, 54, 3, 77, 61, 14] //简写 let _$arr = Array.from(new Set([...arr1,...arr2])); console.log(_$arr);// [10, 21, 35, 54, 3, 77, 61, 14] //new Set集合可以用扩展运算符展开 console.log([...new Set([...arr1,...arr2])]);// [10, 21, 35, 54, 3, 77, 61, 14] //求交集(两个数组中都有的元素) let arr1 = [10,21,35,54,10,35,3]; let arr2 = [21,35,77,61,14,77]; let arr = arr1.filter((currentValue,index,array)=>{ return arr2.includes(currentValue); }); console.log(arr);//[21, 35, 35] 去重 let _arr = Array.from(new Set(arr)); console.log(_arr);//[21, 35] //简写 let $arr = [...new Set(arr1.filter(item => arr2.includes(item)))]; console.log($arr);//[21, 35] //求差集(就是两个数组合并之后,不能有重复的元素:并集 -- 去掉两个数组中都有的元素:交集) //即:并集里面去掉交集的元素 let arr1 = [10,21,35,54,10,35,3]; let arr2 = [21,35,77,61,14,77]; //并集 let union = [...new Set([...arr1,...arr2])];//[10, 21, 35, 54, 3, 77, 61, 14] //交集 let cross = [...new Set(arr1.filter(item => arr2.includes(item)))];//[21, 35] let arr = union.filter(a => !cross.includes(a)); console.log(arr);// [10, 54, 3, 77, 61, 14]
# ② 获取数组中的随机项(验证码参考)
let loves = ['黑丝空姐','性感车模','迪丽热巴','古力娜扎','梁咏琪','华仔','古巨基']; //console.log(loves[1]); //重点需要获取数组下标,随机下标 let i = Math.floor(Math.random() * loves.length); console.log(loves[i]); //获取四位验证码的简易模型 function getCode(codeLength){ let code = ''; let arr = new Array(0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R', 'S','T','U','V','W','X','Y','Z');//36个随机数 for(let i=0;i<codeLength;i++){ let index = Math.floor(Math.random() * arr.length); code += arr[index]; } return code; } console.log(getCode(4));
# 课程其它章节
# 章节1.课程介绍
# 章节2.javascript基础
# 1、变量
# 2、关键保留字
# 3、语法构成
# 4、数据类型
# 章节3.javascript运算符
# 1、一元运算符
# 2、算术运算符
# 3、赋值运算符
# 4、关系运算符
# 5、逻辑运算符
# 6、字符串、逗号、三元条件运算符
# 7、运算符优先级
# 章节4.流程控制语句
# 1、if语句
# 2、switch 语句
# 3、循环语句
# 4、for...in 语句 枚举对象的属性
# 5、break 和 continue 语句 退出循环语句
# 6、with语句
# 章节5.javascript函数
# 1、函数声明
# 2、函数 return 返回值
# 3、函数的arguments 对象
# 章节6.javascript对象
# 1、创建对象
# 2、对象属性输出、方法(函数)调用
# 3、对象中的方法及应用
# 章节7.javascript数组
# 1、创建及读取数组
# 2、数组中的属性和内置方法:toLocaleString()、valueOf()和 toString()
# 3、数组中的方法:join()、push()、pop()、shift()、unshift()、reverse()、sort()、concat()、slice()、splice()方法
# 4、数组更多操作方法
# 章节8.Date类型:时间和日期
# 1、Date 类型
# 2、格式化日期和时间
# 章节9.Function类型:函数进阶
# 1、函数的声明
# 2、作为值的函数
# 3、函数内部属性
# 4、函数的属性和方法
# 章节10.内置对象:Global、Math对象,变量、作用域和内存问题
# 1、内置对象: Global对象
# 2、内置对象: Math 对象
# 3、变量
# 4、作用域(执行环境)
# 5、 内存问题
# 章节11.匿名函数和闭包
# 1、匿名函数如何自动执行-()()方式
# 2、通过闭包实现局部变量的累加
# 3、循环里的匿名函数取值问题:任何变量都是最后一个值
# 4、闭包中的this对象问题
# 5、 匿名函数私有化:匿名函数自我执行模仿块级作用域,将变量私有化保护数据
# 章节12.javascript基本包装类型
# 1、Number 类型
# ① Number类型静态属性:MAX_VALUE、MIN_VALUE、NaN、NEGATIVE_INFINITY、POSITIVE_INFINITY、prototype
# ② Number类型方法:toString()、toLocaleString()、toFixed()、toExponential()、toPrecision()
# 2、String类型
# ① String类型属性:length、constructor、prototype
# ② String类型通用方法:valueOf()、toLocaleString()和 toString()方法
# ③ String类型方法:charAt(n)、charCodeAt(n)、数组方式截取字符串、concat(str1...str2)、slice(n,m)、substring、substr、indexOf、lastIndexOf、toLowerCase、toUpperCase、toLocaleLowerCase、toLocaleUpperCase、match、search、replace、replaceAll、split、fromCharCode、localeCompare、startsWith、endsWith、includes、trimStart、trimEnd、trim、repeat、魔法字符串
# 3、Array数组的常用方法
# ① 数组中的属性length,数组内置方法toLocaleString()、valueOf()和 toString()
# ② join、push、pop、shift、unshift、reverse、sort、concat、slice、splice
# ③ includes、reduce、find、findIndex、filter、map、forEach
# ④ indexOf、lastIndexOf、at、fill、copyWithin、isArray、es6的扩展运算符、every、some、for...of遍历、keys()、values()、entries()、reduceRight、flat、flatMap、from、of
# ⑤ 集合类型Set()属性方法:size属性、add、has、delete、clear方法,迭代遍历数据:keys()、values()、entries()、for...of遍历,forEach遍历
# ⑥ 小结拓展:获取两个数组交集、并集、差集,获取数组随机元素(验证码)
# 章节13.函数对象数组小结
# ① 对象的方法:for...in(遍历对象)、Object.assign()、Object.create()、Object.freeze()、Object.keys()、Object.values()、Object.entries()
# ② 数组解构:基础用法、省略元素、设置数组元素默认值、嵌套数组(多维数组)的结构赋值、不定元素的解构赋值
# ③ 对象解构:基础用法、重命名解构变量、对象解构时的默认值
# ④ var和let、const的区别
# ⑤ 函数参数默认值:对arguments的影响、对函数length的影响、函数默认表达式、参数默认值的暂时性死区
# ⑥ 函数剩余参数:剩余参数只能出现一个、剩余参数只能放在最后
# ⑦ 展开运算符:针对可迭代对象展开、字面量形式的对象做对象克隆和对象合并
# 章节14.浏览器对象模型BOM及浏览器检测
# ① window 对象:属性和方法、系统对话框、调出打印机print()、网页新建窗口open()、窗口页面的位置:screenX(screenLeft)和 screenY(screenTop)、窗口页面的大小:innerWidth和 innerHeight,outerWidth 和 outerHeight,document.documentElement.clientWidth和document.documentElement.clientHeight
# ② window对象:超时调用:setTimeout()方法、取消超时调用:clearTimeout()方法、间歇调用:setInterval()方法、取消间歇调用:clearInterval()方法、模拟定时器功能,超时调用模拟间歇
# ③ location 对象:获取网址相关信息、assign()方法跳转到指定页面、reload()方法、repalce()方法、获取网址url参数中的键值对、history 对象 : 属性:length,方法:back()、forward()、go(num)
# ④ 获取浏览器相关信息、浏览器插件检测、MIME 类型检测、判断设备是安卓、苹果、是否在微信上面浏览网页、用户查看网页的设备是电脑设备,还是手机设备
# 章节15.网页文档对象模型DOM
# 1、理解DOM
# ① DOM节点树,节点种类:元素节点、文本节点、属性节点
# 2、查找节点信息方法
# ① getElement系列: getElementById()方法,getElementById()方法获取的元素节点属性:tagName、innerHTML等, 获取及设置元素html属性:id,title,style,className等,getElementsByTagName()方法,getElementsByName()方法,getElementsByClassName()方法
# ② querySelector系列: querySelector()方法,querySelectorAll()方法
# ③ 属性操作系列: getAttribute()方法,setAttribute()方法,removeAttribute()方法
# ④ node节点属性: nodeName、nodeType、nodeValue
# ⑤ 层次节点属性: childNodes属性,firstChild 和 lastChild 属性,ownerDocument 属性,parentNode 属性,previousSibling 属性,nextSibling 属性,忽略空白文本节点,attributes 属性
# 3、操作节点
# ① document.write()方法,createElement()方法,appendChild()方法,createTextNode()方法, insertBefore()方法,模拟在指定节点的后面添加一个节点,repalceChild()方法,cloneNode()方法,removeChild()方法
# 4、DOM 类型、扩展、操作内容
# ① DOM 类型: Document类型补充(获取html节点对象,获取body节点对象,获取文档声明:DOCTYPE对象,document.title,document.images,document.links等),Text类型补充(normalize()方法,splitText(num)方法,deleteData删除字符,insertData插入字符,replaceData替换字符,substringData获取字符)
# ② DOM 扩展: scrollIntoView(), children 属性,contains()方法
# ③ DOM操作网页内容:innerText、innerHTML、outerText、outerHTML
# 5、DOM实战:操作表格
# ① DOM创建表格
# ② HTML DOM 来操作表格: 获取表格元素对象, 获取表格的标题对象<caption>,获取表头表尾<thead>、<tfoot>、<tbody>,获取表格的行数,获取表格主体里的行数,获取表格主体内第一行的单元格数量(tr),获取表格主体内第一行第一个单元格的内容(td),删除标题、表头、表尾、行、单元格,HTML DOM 创建一个表格
# 6、操作CSS样式
# ① 行内样式style的获取、赋值、移除属性removeProperty,计算后的样式获取(行内、内联、外联样式):window 对象下getComputedStyle()方法
# 7、操作页面样式
# ① className关键字设置样式,创建函数:hasClass() 判断是否存在某个类名,addClass() 如果不存在的这个类名,添加这个类名,removeClass() 如果存在的这个类名,删除这个类名
# 8、操作CSS外联样式表.css文件
# ① 获取CSSStyleSheet,外联的css样式表对象
# 9、DOM元素尺寸(元素大小)和位置(元素位置)
# ① 获取元素 CSS 大小回顾:通过 style 内联获取元素大小,通过计算getComputedStyle()方法获取元素大小,通过 CSSStyleSheet 对象中的 cssRules属性获取元素大小(需将网页放到服务器上查看)
# ② 获取元素实际大小:clientWidth 和 clientHeight:获取可视区的元素大小,可以得到元素内容及内边距所占据的空间大小,scrollWidth 和 scrollHeight:获取滚动内容的元素大小,offsetWidth 和 offsetHeight:获取元素大小,包含边框、内边距和滚动条
# ③ 获取元素周边大小位置:clientLeft 和 clientTop:获取元素设置了左边框和上边框的大小;offsetLeft 和 offsetTop:获取当前元素相对于父元素的位置;scrollTop 和 scrollLeft:这组属性可以获取滚动条被隐藏的区域大小(滚动条滚动高度宽度),也可设置定位到该区域(定位滚动条); getBoundingClientRect()方法:返回一个矩形对象,包含四个属性:left、top、right和 bottom,分别表示元素各边与页面上边和左边的距离
# 10、动态加载脚本
# ① 动态加载js文件,动态加载样式表
# 章节16.事件
# 1、事件基础知识
# ① 事件处理函数列表
# ② 内联模型
# ③ 脚本模型
# 2、事件处理函数分类
# ① 鼠标事件:click,dblclick,mousedown,mouseup,mouseover,mouseout,mousemove
# ② 键盘事件:keydown,keypress,keyup
# ③ HTML事件(包括表单事件):load,unload,resize,scroll,select,change,input,submit,reset,focus,blur
# 3、事件对象
# ① this 关键字和上下文
# ② 获取事件对象
# ③ 获取鼠标按钮(左键、右键、中间滚轮)
# ④ 可视区及屏幕坐标:clientX,clientY,screenX,screenY,鼠标点击位置距离页面顶部距离(带滚动条)
# ⑤ 修改键:shiftKey对应Shfit 键,ctrlKey对应 Ctrl 键,altKey 对应 Alt 键,metaKey 对应 windows 键,判断是否按下了它们
# ⑥ 键盘事件:键码(键盘上的任意键)keyCode,字符编码(键盘上可以输出字符的键)charCode
# ⑦ 事件对象的常用属性和方法:target,事件冒泡,取消:e.stopPropagation()
# ⑧ 事件对象其他属性方法:relatedTarget(在 mouseover 和 mouseout 事件中获取),e.preventDefault(),contextmenu取消鼠标右击弹出的菜单,鼠标滚轮:mousewheel
# 4、事件绑定
# ① 剖析传统事件绑定问题:同名事件后者覆盖前者,this 传递问题
# ② 现代事件绑定处理函数:添加事件addEventListener(),删除事件removeEventListener(),设置冒泡和捕获
# 章节17.表单处理及错误处理与调试
# 1、表单基础知识
# ① 获取form对象的方法
# ② 提交表单:默认提交form表单按钮type="submit",js中表单提交及阻止提交,让没有提交功能的按钮(其它元素)完成表单提交使用的是form.submit()方法,实现使用键盘 CTRL + enter(回车键)提交数据
# ③ 预防表单数据重复提交,表单重置:按钮重置type="reset",js重置 form.reset()方法
# 2、使用HTML DOM获取表单控件元素
# ① elements属性获取表单控件元素集合
# ② 多个表单字段都使用同一个 name,如单选框多选框,常用属性
# ③ 表单共有字段方法:foucs(),blur(),表单共有的字段事件:blur,change,input,focus
# 3、表单中的文本框
# ① input.value 和 textarea.value 获取输入的内容,defaultValue获取默认设置的value值
# ② 选择文本:使用 select()方法,可以将文本框里的文本选中,并且将焦点设置到文本框中
# ③ 选择部分文本:setSelectionRange()方法,这个方法接受两个参数:索引和长度
# ④ select 事件,选中文本框文本后触发
# ⑤ 获取选择的文本,两个属性:selectionStart 和 selectionEnd
# ⑥ 文本过滤输入(表单验证,文本验证,输入框验证)
# ⑦ 剪切事件:cut,复制事件:copy,粘贴事件:paste,禁用输入法
# ⑧ 利用正则表达式将用户输入的非数字字符替换成空,只留下数字
# ⑨ 输入框自动切换焦点到下一个输入框(类似Tab键),maxlength属性可输入的最大字符长度
# 4、表单中的下拉列表(选择框)
# ① 获取下拉列表对象
# ② 下拉列表多选属性 multiple="multiple"(按住键盘CTRL键进行多选),size显示的行数
# ③ 属性 options(下拉选项的集合)
# ④ 选择选项:选择一项的使用selectedIndex属性,监听的是下拉列表的change事件
# ⑤ 下拉列表动态添加选择项: 使用Option 构造函数,add方法添加选项
# ⑥ 下拉列表动态移除选择项:三种方式(removeChild移除、remove()方法移除和 null 移除)
# ⑦ 下拉列表动态移动选择项(两个下拉列表选项移动)
# ⑧ 下拉列表动态排序选择项(选项排序):属性index
# ⑨ 获取单选框或者多选框选择的值: 判断checked属性是否为真判断选中的项,defaultChecked判断项目原本设置的默认值
# 5、错误与调试
# ① 浏览器错误报告,错误处理:try-catch 语句,finally 子句,错误类型
# ② try-catch使用场景,抛出错误,错误事件error:处理DOM对象产生错误时候使用,比如加载图片失败,错误处理策略,调试技术和调试工具
# 章节18.数据Cookie、XML、JSON
# 1、Cookie、sessionStorage、localStorage
# ① cookie 的组成,编码和解码,失效时间,手动清理cookie,cookie路径访问,cookie限制域名访问,指定访问协议 http https
# ② 封装cookie(创建,获取,删除)
# ③ sessionStorage、localStorage
# ④ cookie 和 localStorage的对比
# 2、XML
# ① 创建 XMLDOM 对象(document.implementaion,DOMParser类型创建XMLSerializer类型进行序列化成字符串),解析错误
# ② 加载读取外部xml文件
# ③ XPath操作XML
# ④ 封装XPath操作xml文件
# 3、JSON
# ①JSON 语法,可以表示三种类型的值
# ② 获取外部json文件
# ③ 解析json字符串(将json字符串转成数组对象——json结构数据):JSON.parse()方法
# ④ js原生值数组、对象转成json字符串--JSON.stringify()
# ⑤ toJSON
# 其它学期课程
# 第一学期(学习顺序:01)
第一学期课程专为零基础的学员定制录制的,纯html+css做企业网站的网页,主讲html和css的相关基础知识,flex布局相关知识,封装css基础样式库,引入字体图标及网页开发基础布局思维,完成企业网站网页的开发过程。
[第一学期学习视频]
# 第二学期【第1季】(学习顺序:02)
# 第二学期【第2季】(学习顺序:03)
JavaScript中的面向对象,类,ajax,封装js库过渡到jQuery, vue.js基础配置网站页面,建议所有学员观看。
[第2季学习文档] [第2季学习视频]
# 第二学期【第3季】(学习顺序:04)
egg.js基础,响应式网页布局,Bootstrap框架,响应式后台系统管理,完整企业网站前后台开发,建议所有学员观看。
[第3季学习文档] [第3季学习视频]
# 第二学期【第4季】(学习顺序:05)
主要对第三季,同学们开发的企业网站,进行一个完整的上线运维流程的一个讲解,同学们将网站开发完成之后,如何进行上线运维,将项目交付给客户。
[第4季学习文档] [第4季学习视频]