1. 基础 1.1 发展历史
1.2 基本组成
总结:JS 就是通过固定的语法去操作 浏览器 和 标签结构 来实现网页上的各种效果。
1.3 能干什么
实现网页效果、表单验证、轮播图…
实现与H5配合实现游戏,如水果忍者…
实现应用级别的程序
实现图表统计效果
实现人工智能,如面部识别
后端开发、app开发、桌面端开发…
1.4 代码书写位置
1 2 3 4 5 6 <body > <button onclick ="alert('hello world')" > 点我</button > <br > <a href ="javascript: alert('hello, world!')" > 点我</a > </body >
1 2 3 4 5 <script > alert ("我是一个弹出层" ) console .log ("hello,world" ) </script >
1 2 3 <script src ="./js/hello1.js" > </script > <script src ="./js/hello2.js" > </script >
1.5 注释与规范
1.6 变量(★) 语法 :
示例 :
1 2 3 4 5 6 7 8 9 <script> var x x = 100 var y = x + 2000 console .log (y) </script>
命名规则 (必须遵守,不遵守就报错):
一个变量名称可以由数字、字母、英文下划线_、美元符号$ 组成
严格区分大小写
不能由数字开头
不能是 保留字 或 关键字
不能出现空格
命名规范 (建议遵守):
变量名尽量有意义(语义化,见名知意)
遵循驼峰命名规则,由多个单词组成的时候,从第二个单词开始首字母大写
不要使用中文
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <script> var x x = 100 var y = x + 2000 console .log (y) var a1, a2, a_, _a, a$b, $a1, $a2, $A2 var A1 , a1 var username, password, age, email, name var zhanghao, mima var productNumber, userInfo var 我 = "jerry" console .log (我) </script>
1.7 基本数据类型(★) 基本类型:
Number,数字类型,eg: 18, 12.5(浮点数), 2e3(2*10^3), 十进制, 八进制, 十六进制, 二进制
String,字符串类型,需加双引号
Boolean,布尔类型,取值 true/false
Undefined,声明了未赋值,取值 undefined
Null,空值(明确未来做为对象类型使用,提前赋值为null)
Symbol,
复杂类型(对象类型):
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <script> var age = 18 console .log (age + 20 ) var price = 12.5 console .log (price) var year = 2e3 console .log (year) var hex = 0xff var oct = 0o77 var dec = 99 var bin = 0b11 console .log (hex, oct, dec, bin) var num1 = 10 var num2 = "20" console .log (num1 + num2) var str = "hello" console .log (str) var isChecked = true var isVisited = false console .log (isChecked, isVisited) var which console .log (which) which = 100 console .log (which) var whichObject = null whichObject = {name : "Jerry" } console .log (whichObject) </script>
1.7.0 typeof() 类型检测 typeof 变量 或 typeof(变量) 变量类型判断,结果一定是个字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 <script> var a console .log (typeof a) console .log (typeof (a)) console .log (typeof typeof a) var b console .log (typeof b) var c = null console .log (typeof c) </script>
1.7.1 类型转数字
Numnber(变量)
可以把一个变量强制转换成数值类型
可以转换小叔,会保留小数
可以转换布尔值
遇到不可转换的都会返回 NaN
parseInt(变量)
从第一位开始检查,是数字就转换,直到一个不是数字的内容
开头就不是数字,那么直接返回 NaN
不认识小数点,只能保留整数
parseFloat(变量)
从第一位开始检查,是数字就转换,直到一个不是数字的内容
开头就不是数字,那么直接返回 NaN
认识一次小数点
除了加法以外的数学运算
运算符两边都是可运算数字才行
如果运算符任何一边不是一个可运算的数字,那么就会返回 NaN
加法不可以用
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <script> var a = "100" var a1 = Number (a) console .log (a, a1) console .log (typeof a, typeof a1) var s = "abc" var s1 = Number (s) console .log (s, s1) console .log (typeof s, typeof s1) var b = false var b1 = Number (b) console .log (b, b1) console .log (typeof b, typeof b1) var n var n1 = Number (n) console .log (n, n1) console .log (typeof n, typeof n1) var c = "125px" var c1 = parseInt (c) console .log (c, c1) console .log (typeof c, typeof c1) var d = "1.25rem" var d1 = parseInt (d) console .log (d, d1) console .log (typeof d, typeof d1) var e = "1.25rem" var e1 = parseFloat (e) console .log (e, e1) console .log (typeof e, typeof e1) var x = "100" var x1 = x - 0 console .log (x, x1) console .log (typeof x, typeof x1) </script>
1.7.2 类型转字符串
变量.toString()
有一些数据类型不能使用 toString() 方法,比如 undefined 和 null
String(变量)
使用加法运算
在js里面 + 号有两个含义
① 字符串拼接:只要 + 任意一边是字符串 ,就会进行字符串拼接
② 加法运算:只要 + 两边都是数字 的时候,就会进行数学运算
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <script> var a = 100 var a1 = String (a) console .log (a, a1) console .log (typeof a, typeof a1) var b var b1 = String (b) console .log (b, b1) console .log (typeof b, typeof b1) var c = null var c1 = String (c) console .log (c, c1) console .log (typeof c, typeof c1) var d = 100 var d1 = d.toString () console .log (d, d1) console .log (typeof d, typeof d1) var x = 100 var y = x + "" console .log (x, y) console .log (typeof x, typeof y) </script>
1.7.3 类型转布尔
Boolean(变量)
在js中,只有' '(空格)、0、null、undefined、NaN,这些是 false
其他都是 true(空格也是 true)
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <script> var a = "" var b = 0 var c = null var d var e = NaN console .log ("Boolean(a) = " , Boolean (a)) console .log ("Boolean(b) = " , Boolean (b)) console .log ("Boolean(c) = " , Boolean (c)) console .log ("Boolean(d) = " , Boolean (d)) console .log ("Boolean(e) = " , Boolean (e)) var space = " " console .log ("Boolean(space) = " , Boolean (space)) </script>
1.8 运算符 1.8.1 数学运算符 +
只有符号两边都是数字的时候才会进行加法运算
只要符号任意一边是字符串类型,就会进行字符串拼接
-
*
/
%
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <script> var a = 10 var b = 20 console .log (a + b) console .log (1 + "2" *3 + 4 ) var x = 10 var y = 3 console .log (x % y) var d = 1000 var h = parseInt (d / 60 ) var m = d % 60 console .log (h + ":" + m) </script>
1.8.2 赋值运算符 =
就是把 = 号右边的赋值给等号左边的变量
var num = 100,就是把100赋值给num变量,那边num变量的值就是100
+=
-=
*=
/=
%=
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <script> var a = 10 console .log (a) var m = 5 var n = 6 var c c = m m = n n = c console .log (m, n) var num = 1 num += 1 console .log (num) </script>
1.8.3 比较运算符 结果一定是 boolean 值,即 true 或 false
== 等于,只比较值
===等于,比较的是值和数据类型
!= 不等于,只比较值
!== 不等于,比较的是值和数据类型
> 大于
< 小于
>= 大于等于
<= 小于等于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <script> var sum = 100 console .log (sum > 200 ) var age = "22" console .log (age == 22 ) console .log (age === 22 ) console .log (parseInt (age) === 22 ) console .log ("----------" ) console .log (true == 1 ) console .log (true === 1 ) console .log ("----------" ) console .log ("" ==0 ) console .log ("" ===0 ) console .log (undefined ==0 ) console .log (undefined ===0 ) </script>
1.8.4 逻辑运算符 && 与 运算
|| 或 运算
! 非,即取反 运算,true 变 false,false 变 true
特殊1:!!a 这种写法是为了,把 a 转换为布尔值
特殊2:&&, || 短路用法,与 遇到第一个条件为假,则不执行后面的条件运算;或 遇到第一个条件为真,则不执行后面的条件运算
1.8.5 自增自减运算符 ++ 自增运算,前置++ 和 后置++
前置++,即 ++a,会先+1,再返回
后置++,即 a++,会先返回,再+1
-- 自减运算,前置– 和 后置 –
前置–,即 –a,会先-1,再返回
后置–,即 a–,会先返回,再-1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <script> var a = 10 console .log (++a) console .log (a++) console .log (a) var n = 10 var res = ++n + n++ + ++n; console .log (n, res); var m = 10 res = m++ + --m + m-- + ++m; console .log (m, res) </script>
1.8.6 三目运算符 三目运算,即由两个运算符号组成的逻辑运算语句。
语法:条件 ? 条件为true时执行运算1 : 条件为false的时候执行运算2
1 2 3 4 5 var age = 18 ; age > 18 ? alert ('已经成年' ) : alert ('没有成年' ) sum >= 200 ? sum - 10 : (sum >= 100 ? sum - 5 : sum)
1.9 分支结构 js 代码都是从上往下,从左往右执行的顺序,条件分支可以控制代码执行的逻辑。
1.9.1 if-else 分支语句 语法:
1 2 3 if (条件1 ) { 条件1 为true ,要执行的代码 }
扩展:
1 2 3 4 5 6 7 8 9 if (条件1 ) { 条件1 为true ,要执行的代码 } else if (条件2 ) { 条件2 为true ,要执行的代码 } else if (条件n) { 条件n为true ,要执行的代码 } else { 条件1 ,2 ,n都为false ,要执行的代码 }
1.9.2 switch-case 分支语句 语法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 switch (变量) { case 值1 : 变量===值1 时,要执行的代码 break case 值2 : 变量===值2 时,要执行的代码 break case 值n : 变量===值n时,要执行的代码 break default : 没有匹配的值时,默认执行的代码 break }
注意:
switch 的判断变量 与 值是否相等时,使用的是 === 值和类型都相等
switch 语句中判断的变量 和 值 中尽量不要写表达式,写具体的值是规范,根据情况使用
break 尽可能不能省略,除非要匹配多个 case 条件,但是可读性会降低,根据情况使用,如加注释
1.9.3 while 循环语句 先进行条件判断,决定是否执行以及执行次数。
组成:①初始化 ②条件判断 ③要执行的代码 ④自身改变
语法:
1 2 3 while (条件) { 满足条件就执行的代码 }
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <script> var n = 0 while (n < 10 ) { console .log ("hello" ) n++ } var x = 1 var sum = 0 while (x <= 100 ) { sum += x x++ } console .log (sum) var y = 5 var res = 1 while (y > 0 ) { res *= y y-- } console .log (res); </script>
1.9.4 do-while 循环语句 先不管条件,先执行一次,然后再开始进行条件判断。
语法:
1 2 3 do { 第一次执行和条件成立循环执行的代码 } while (条件)
示例:
1 2 3 4 5 6 7 8 9 10 <script> do { var res = prompt ("请输入你的名字:" ) if (res) { document .write (res) } else { alert ("你还没有输入名字!" ) } } while (!res) </script>
1.9.5 for 循环语句 语法:
1 2 3 for (var i = 0 ; i < 10 ; i++) { 要执行的代码 }
示例:
1 2 3 4 5 6 7 8 9 for (var i = 0 ; i < 10 ; i++) { console .log ("i = " , i) }var sum = 0 for (var i = 1 ; i <= 100 ; i++) { sum += i }console .log (sum)
1.9.6 break 终止循环 在循环没有进行完毕的时候,可以根据其他条件通过break进行提前终止循环。
跳出循环,就可以使用该关键字。
示例:
1 2 3 4 5 6 for (var i = 0 ; i < 10 ; i++) { if (i === 5 ) { break } 要执行的代码 }
1.9.7 continue 结束本次循环 在循环中,把循环的本次跳过去,继续执行后续的循环。
跳过本次循环,就可以用该关键字。
示例:
1 2 3 4 5 6 for (var i = 0 ; i < 10 ; i++) { if (i === 5 ) { continue } 要执行的代码 }
案例1:求质数 质数,只能被1和自身整除的自然数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <script> var n = 19 ; var isZhiShu = true for (var i = 2 ; i <= n/2 ; i++) { if (n % i === 0 ) { isZhiShu = false break } } if (isZhiShu) { console .log ("是质数" ) } else { console .log ("不是质数" ) } </script>
案例2:九九乘法表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <style> span{ display : inline-block; width : 100px; height : 30px; font-size : 20px; } </style><script > for (var m = 1 ; m <= 9 ; m++) { for (var n = 1 ; n <= m; n++) { document .write ("<span>" + n + " * " + m + " = " + m*n + "</span>" ) } document .write ("<br>" ) } </script >
效果:
1.10 函数 1.10.1 语法 定义一个函数:
声明式:【推荐】(会预解析) ,定义与调用无所谓先后,先调用或后调用都可以生效
1 2 3 var fn = function ( ) { }
作用:代码块进行封装,方便使用时,随时调用。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <script> function test1 ( ) { console .log ("我是test1函数" ) } test1 () var test2 = function ( ) { console .log ("我是test2函数" ) } test2 () </script>
1.10.2 参数 函数传递值使用 参数,分为
形参:函数定义时()内写的参数,用于接收实参
实参:调用时可以传参,可以不传参
1 2 3 4 5 6 function fn (形参) { }fn (实参)
示例:
1 2 3 4 5 6 7 8 9 function fn (a, b) { if (a === undefined || b === undefined ) { a = 0 b = 0 } console .log ("函数fn的参数值是:" , a, b) }fn (1 , 2 )
函数内对与参数传递时,习惯的两种操作:
给默认值
给提示和警告
1.10.3 返回值 return 返回的意思,给函数一个 返回值 和 终端函数
如果函数不需要返回值时,可以不写
return 后面的代码,不会执行
1 2 3 4 function fn ( ) { var res = 代码 return res }
1.10.4 预解析 js 代码在运行的时候,会经历两个环节 解释代码 和 执行代码
解释代码:预解析,会将声明和定义提前进行解析,调用时则不分先后,预解析有两类
执行代码
1.10.5 重名问题 重名时,同一个script标签内才有同名覆盖效果:
同为函数的情况,在预解析阶段逐个解析,后来的会覆盖前面的。切记声明提升(覆盖)无法跨 script 标签。
变量与函数名相同时
① 变量先被赋值的话,此时变量定义和函数定义预解析完后,名字继续被赋值,则为赋值结果
② 函数先被调用的话,此时变量定义和函数定义预解析完后,先执行函数调用,再继续赋值
1.10.6 作用域 全局作用域
最大的作用域
定义的变量可以在任何地方使用,可以跨script标签
页面打开的时候,浏览器会自动给我们生成一个全局作用域 window
这个作用域会一直存在,直到页面关闭才销毁
局部作用域
局部作用域只能在局部作用域的内部使用
在JS中只有函数能生成一个局部作用域,别的都不行
每一个函数,都是一个局部作用域
访问规则 就近访问原则。
访问规则:
自己的作用域 >> 上一级作用域 >> 继续上一级作用域 >> 全局作用域 >> 都没有就报错(该变量 is not defined)
赋值规则 就近赋值原则。
赋值规则:
自己的作用域 >> 上一级作用域 >> 继续上一级作用域 >> 全局作用域 >> 都没有就将其定义为全局变量,再给它赋值
2. 引用数据类型 2.1 对象 对象就是一个键值对的集合类型。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <script> var obj = {} console .log (obj) var obj1 = { name : "张三" , age : 18 , sex : "男" } console .log (obj1) var obj2 = new Object ({ name : "李四" , age : 20 , sex : "女" }) console .log (obj2) </script>
2.1.1 对象的增删改查 obj["key"] = value 推荐使用此方式,可以规避很多问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 <script> var obj = {} console .log (obj) obj.name = "张三" obj.age = 18 obj.sex = "男" console .log (obj) document .write ("姓名是:" + obj.name ) document .write ("年龄是:" + obj.age ) document .write ("性别是:" + obj.sex ) obj.name = "李四" obj.name2 = "王五" console .log (obj) delete obj.name2 console .log (obj) var obj2 = {} obj2["name" ] = "李四" obj2["age" ] = 20 obj2["sex" ] = "女" console .log (obj2) document .write ("姓名是:" + obj["name" ]) document .write ("年龄是:" + obj["age" ]) document .write ("性别是:" + obj["sex" ]) obj["name" ] = "赵六" console .log (obj) delete obj["age" ] console .log (obj) </script>
2.1.2 对象的属性遍历 1 2 3 4 for (var key in obj){ console .log (key) console .log (obj[key]) }
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <script> var obj = { name : "张三" , age : 18 , sex : "男" } console .log (obj) for (var key in obj){ console .log (key) console .log (obj[key]) } </script>
2.1.3 不同数据类型的存储 注意:
对象数据类型的内存地址存储在 栈 中,值存储在 堆 中。
内存地址只要相同,那么不论 == 还是 === 结果都相同;内存地址不同时,就算值相同也是 === 不相等的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 <script> var str1 = "abcd" var str2 = str1 console .log (str1 === str2) var str3 = "abcd" console .log (str1 === str3) var obj1 = { name : "张三" , age : 18 , sex : "男" } var obj2 = obj1 console .log (obj1 === obj2) obj2.name = "李四" console .log ("obj1:" , obj1) var o1 = {name : "jerry" } var o2 = {name : "jerry" } console .log (o1 == o2) console .log (o1 === o2) var newObj = { name : "李四" , age : 20 , sex : "男" } var newObj2 = {} for (var key in newObj){ newObj2[key] = newObj[key] } console .log (newObj2) newObj2.name = "王五" console .log (newObj2) </script>
2.2 数组 2.2.1 数组的定义 [值1, 值2, ...] 或者 new Array(值1, 值2, ...) 两种方式创建。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <script> var arr1 = [1 , 2 , 3 , 4 , 5 ] console .log (arr1) var arrObjs = [ {name : "张三" , age : 18 , sex : "男" }, {name : "李四" , age : 20 , sex : "男" }, {name : "王五" , age : 22 , sex : "男" } ] console .log (arrObjs) var arr2 = new Array (1 , 2 , 3 , 4 , 5 ) console .log (arr2) var array = new Array (5 ) console .log (array) </script>
2.2.2 数组的操作
.length 是可读可写的
.slice(0) 可以对数组进行深拷贝
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 <script> var arr = [1 , 2 , 3 , 4 , 5 ] console .log (arr.length ) arr.length = 3 console .log (arr) console .log (arr[0 ]) console .log (arr[1 ]) console .log (arr[2 ]) console .log (arr[3 ]) arr[0 ] = "Jerry" console .log (arr) arr[3 ] = "Tom" console .log (arr) for (var i = 0 ; i < arr.length ; i++){ console .log (arr[i]) } var newArr = arr.slice (0 ) console .log (newArr) newArr[0 ] = "张三" console .log (newArr) console .log (arr) newArr.push ("新元素" ) console .log (newArr) newArr.pop () console .log (newArr) </script>
2.2.3 数组的排序 1 2 3 4 5 6 7 var arr = [3 , 2 , 1 , 4 ] arr.sort ()console .log (arr) arr.sort (function (a, b ){ return b - a })console .log (arr)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 function bubbleSort (arr ) { for (var i = 0 ; i < arr.length - 1 ; i++) { for (var j = 0 ; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1 ]) { var temp = arr[j] arr[j] = arr[j + 1 ] arr[j + 1 ] = temp } } } }bubbleSort (arr)console .log (arr)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 function quickSort (arr ) { if (arr.length <= 1 ) { return arr } var pivot = arr[0 ] var left = [] var right = [] for (var i = 1 ; i < arr.length ; i++) { if (arr[i] < pivot) { left.push (arr[i]) } else { right.push (arr[i]) } } return quickSort (left).concat (pivot, quickSort (right)) }console .log (quickSort (arr))
2.2.4 数组常用方法 注意:以下方法都会修改原数组内容 。
.push() 向数组末尾添加元素,返回数组长度
.pop() 删除数组最后一个元素,返回该删除元素
.unshift() 向数组开头添加元素,返回数组长度
.shift() 删除数组的第一个元素,返回该删除元素
.splice() 删除数组指定的一个或多个元素,返回该删除元素
.reverse() 颠倒数组中的元素顺序,返回该数组
.sort([function]) 对数组进行排序,默认升序,可自定义回调函数指定排序规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 <script> var arr = [1 , 2 , 3 ] var res = arr.push ("Jerry" ) console .log (arr, res) var res2 = arr.pop () console .log (arr, res2) var res3 = arr.unshift ("Tom" ) console .log (arr, res3) var res4 = arr.shift () console .log (arr, res4) var res5 = arr.splice (1 , 2 ) console .log (arr, res5) var res6 = arr.splice (1 , 0 , "Jerry" , "Tom" ) console .log (arr, res6) arr = [2 , 4 , 3 , 1 , 5 , 6 ] arr.reverse () console .log (arr) arr.sort () console .log (arr) arr.sort (function (a, b ){ return b - a }) console .log (arr) </script>
注意:以下方法不会修改原数组 。
.concat() 合并数组
.join() 数组转换为字符串,可指定分隔符,默认逗号
.slice() 截取数组,.slice(0) 深拷贝原数组
.indexOf() 查找元素对应的索引值,-1未找到
.lastIndexOf() 查找数组中元素的最后一个索引值,-1未找到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <script> var arr1 = [1 , 2 , 3 ] var arr2 = [4 , 5 , 6 ] console .log (arr1) console .log (arr2) var arr3 = arr1.concat (arr2, 7 , [8 , 9 ]) console .log (arr3) var arr4 = arr1.concat (); arr4.pop () console .log (arr1, arr4) var arr5 = [1 , 2 , 3 , 4 , 5 , 6 ] console .log (arr5) console .log (arr5.join ("" )) console .log (arr5.join ()) console .log (arr5.join ("-" )) var arr6 = [1 , 2 , 3 , 4 , 5 , 6 , 2 , 3 ] console .log (arr6) console .log (arr6.slice (0 , 3 )) console .log (arr6.slice (3 )) console .log (arr6) var arr7 = arr6.slice (0 ) arr7.pop () console .log (arr6, arr7) console .log (arr6.indexOf (3 )) console .log (arr6.indexOf (99 )) console .log (arr6.lastIndexOf (3 )) console .log (arr6.lastIndexOf (99 )) </script>
数组的其他复杂常用方法:
.forEach() 遍历数组,传回调函数指定遍历规则
.map() 映射数组,传回调函数指定映射规则
.filter() 过滤数组,传回调函数指定过滤规则,返回新数组
.every() 检测数组所有 元素是否符合回调函数指定的规则
.some() 检测数组任一 元素是否符合回调函数指定的规则
.find() 查找数组符合回调函数指定的规则的第一个元素
.reduce() 累加器,将数组元素都累加起来,字符串则是拼接起来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 <style> li{ margin-left : 20px; } </style><script > var arr = ["aaa" , "bbb" , "ccc" , "ddd" ] arr.forEach (function (item, index ){ console .log (item, index) }) var newArr = arr.map (function (item, index ){ return "<li>" + item + "</li>" }) console .log (newArr) document .write (newArr.join ("" )) var filterArr = arr.filter (function (item, index ){ return item > "bbb" }) console .log (filterArr) var everyRes = arr.every (function (item, index ){ return item > "bbb" }) console .log (everyRes) var someRes = arr.some (function (item, index ){ return item > "bbb" }) console .log (someRes) var findRes = arr.find (function (item, index ){ return item > "bbb" }) console .log (findRes) var reduceRes = arr.reduce (function (prev, item ){ return prev + "-" + item }) console .log (reduceRes) </script >
2.2.5 数组的去重 方法有3:
利用查找indexOf()返回-1未找到的特性,遍历
利用对象的属性名不能重复的特性,遍历
利用 new Set() 直接去重后,再利用 Array.from() 转换为数组
1 var newArr = Array .from (new Set (arr))
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <script> var arr = [1 , 2 , 3 , 4 , 5 , 6 , 2 , 3 ] console .log (arr) var newArr = [] for (var i = 0 ; i < arr.length ; i++){ if (newArr.indexOf (arr[i]) === -1 ){ newArr.push (arr[i]) } } console .log ("indexOf去重:" , newArr) var newArr2 = [] var obj = {} for (var i = 0 ; i < arr.length ; i++){ if (!obj[arr[i]]){ newArr2.push (arr[i]) obj[arr[i]] = true } } console .log ("对象属性名去重:" , newArr2) var newArr3 = Array .from (new Set (arr)) console .log ("Array.from()去重:" , newArr3) </script>
2.3 字符串 2.3.1 字符串的创建
1 var str = new String ("hello" )
案例:统计字符出现的次数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <script> var str = "helloworld" var obj = {} for (var i = 0 ; i < str.length ; i++) { var char = str[i] if (obj[char]) { obj[char]++ } else { obj[char] = 1 } } console .log (obj) </script>
2.3.2 字符串常用方法
.length 字符串长度
.charCodeAt(索引) 索引对应的字符
String.fromCharCode(ASCII码) ASCII码转字符串
.toUpperCase() 转大写
.toLowerCase() 转小写
.substr() 截取字符串,substr(开始索引, 长度)
.substring() 截取字符串,substring(开始索引, 结束索引<不含>)
.slice() 截取字符串,slice(开始索引, 结束索引<不含>)
.replace() 替换字符串中指定内容,支持正则表达式
.split(分隔符) 字符串转数组
.indexOf() 查找子字符串首次出现的索引位置
.lastIndexOf() 查找子字符串最后一次出现的索引位置
.concat() 字符串拼接
.trim() 移除字符串首尾空格
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 <script> var str = "hello world" console .log (str.length ) console .log (str.charAt (4 )) console .log (str.charCodeAt (4 )) var arr = [] for (var i = 65 ; i <= 90 ; i++) { arr.push (String .fromCharCode (i)) } console .log (arr) console .log (str.toUpperCase ()) console .log (str.toLowerCase ()) console .log (str.substr (0 , 1 ).toUpperCase () + str.substr (1 )) console .log (str.substring (0 , 1 ).toUpperCase () + str.substring (1 )) console .log (str.slice (0 , 1 ).toUpperCase () + str.slice (1 )) console .log (str.replace ("world" , "universe" )) console .log (str.split (" " )) console .log (str.indexOf ("world" )) console .log (str.indexOf ("universe" )) console .log (str.lastIndexOf ("world" )) console .log (str.lastIndexOf ("universe" )) console .log (str.concat (" " , "universe" )) console .log (" hello world " .trim ()) console .log (" hello world " .trimLeft ()) console .log (" hello world " .trimRight ()) console .log (" hello world " .trimEnd ()) console .log (" hello world " .trimStart ()) </script>
案例:字符串模糊查找 1 2 3 4 5 6 7 8 <script> var arr = ["hello" , "world" , "universe" , "javascript" , "typescript" , "python" ] var res = arr.filter (function (item ){ return item.indexOf ("script" ) > -1 }) console .log (res) </script>
2.3.3 json格式字符串(★) 主要用于前后端数据发送到服务器、服务器返回的数据格式,统一标准。
JSON.parse(jsonStr) json字符串解析为JSON对象。
JSON.stringify(jsonObj) JSON对象序列化为json字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <script> var jsonStr = '{"name": "张三", "age": 18, "sex": "男"}' console .log (jsonStr) console .log (typeof jsonStr) console .log (jsonStr.name ) var jsonObj = JSON .parse (jsonStr) console .log (jsonObj) console .log (typeof jsonObj) console .log (jsonObj.name ) var jsonStr2 = JSON .stringify (jsonObj) console .log (jsonStr2) </script>
2.3.4 模版字符串(★) es6支持的模版字符串格式。
语法:
` ` 双反引号包裹
${key} 通配符替换,通配符支持计算表达式、三目运算符等 (类似Linux shell脚本的变量取值格式)
1 2 3 4 5 6 var name = "张三" var age = 18 var sex = 1 var str = `姓名:${name} ,年龄:${age+10 } ,性别:${sex===1 ?'男' :'女' } ` console .log (str)
应用案例:
1 2 3 4 5 6 7 8 9 var arr = ["aaa" , "bbb" , "ccc" , "ddd" ]var newArr = arr.map (function (item, index ){ return `<li style="margin-left: 20px;">${item} </li>` })console .log (newArr) document .write (newArr.join ("" ))
2.4 数字 2.4.1 数字的定义 Number 数字类型。Math 数学类型。
Math.random() 0-1之间的随机数,如 0.12177631585793602
Math.round() 四舍五入取整
Math.floor() 向下取整(舍弃小数)
Math.ceil() 向上取整(小数进位)
Math.max(...) 取最大值
Math.min(...) 取最小值
Math.pow(底数, 指数) 求次幂
Math.sqrt() 求平方根
Math.abs() 求绝对值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 <script> var num = 123.45678 console .log (num) console .log (typeof num) var sum = num.toFixed (2 ) console .log (sum) console .log (typeof sum) sum = Number (num.toFixed (2 )) console .log (sum) console .log (typeof sum) console .log (Math .PI ) console .log (Math .random ()) console .log (Math .round (1.5 )) console .log (Math .round (1.4 )) console .log (Math .floor (1.5 )) console .log (Math .floor (1.4 )) console .log (Math .ceil (1.5 )) console .log (Math .ceil (1.4 )) console .log (Math .max (1 ,2 ,3 )) console .log (Math .min (1 ,2 ,3 )) console .log (Math .pow (2 ,3 )) console .log (Math .sqrt (9 )) console .log (Math .abs (-1 )) </script>
2.4.2 随机整数 1 2 3 4 5 6 7 8 <script> console .log (Math .random ()) console .log (Math .floor (Math .random () * 100 )) console .log (Math .floor (Math .random () * 100 ) + 1 ) </script>
函数封装:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 function getRandomInt (start, end ) { if (start > end) { var temp = start; start = end; end = temp; } start = Math .ceil (start); end = Math .floor (end); return Math .floor (Math .random () * (end - start + 1 )) + start; }console .log ("1~100之间的随机整数:" , getRandomInt (1 , 100 )) console .log ("1~100之间的随机整数:" , getRandomInt (100 , 1 ))
2.5 时间 2.5.1 时间的定义 Date 是js提供的内置函数,专们用来获取时间的。
new Date(参数, ...) 创建时间对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <script> var date = new Date () console .log (date) console .log (typeof date) var date1 = new Date (1000 ) console .log (date1) var date2 = new Date ("1970/01/01 08:00:00" ) console .log (date2) var date3 = new Date (1970 , 0 , 1 , 8 , 0 , 0 ) console .log (date3) </script>
2.5.2 时间常用方法 getXXX/setXXX-年/月/日/时/分/秒
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <script> var date = new Date () console .log (date) console .log (typeof date) console .log (date.getFullYear ()) console .log (date.getMonth ()) console .log (date.getDate ()) console .log (date.getDay ()) console .log (date.getHours ()) console .log (date.getMinutes ()) console .log (date.getSeconds ()) console .log (date.getMilliseconds ()) console .log (date.getTime ()) date.setTime (1653280060490 ) console .log (date) date.setFullYear (2077 ) console .log (date) date.setMonth (10 ) console .log (date) date.setDate (10 ) console .log (date) date.setHours (10 ) console .log (date) date.setMinutes (10 ) console .log (date) date.setSeconds (10 ) console .log (date) </script>
2.5.3 定时器(★)
var t1 = setTimeout(func) 设置倒计时定时器
var t2 = setInterval(func) 设置间隔定时器
clearTimeout(t1) 清除倒计时定时器
clearInterval(t2) 清除间隔定时器
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <button id="btn1" >点击停止倒计时定时器</button><button id ="btn2" > 点击停止间隔定时器</button > <script > var timer1 = setTimeout (function ( ) { console .log ('3s倒计时结束' ) }, 3000 ) var timer2 = setInterval (function ( ) { console .log ('每隔1s打印一次' ) }, 1000 ) console .log (timer1) console .log (timer2) console .log (btn1, btn2) btn1.onclick = function ( ) { console .log ('点击按钮1,停止倒计时定时器' ) clearTimeout (timer1) } btn2.onclick = function ( ) { console .log ('点击按钮2,停止间隔定时器' ) clearInterval (timer2) } </script >
案例:倒计时 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <div id="box" ></div><script > var targetDate = new Date ('2077-01-01' ) function getDiffTime (currentDate, targetDate ) { var diffTime = Math .ceil ((targetDate - currentDate) / 1000 ) var day = Math .floor (diffTime / 60 / 60 / 24 ) var hour = Math .floor (diffTime / 60 / 60 % 24 ) var minute = Math .floor (diffTime / 60 % 60 ) var second = Math .floor (diffTime % 60 ) var obj = { 'day' : day, 'hour' : hour, 'minute' : minute, 'second' : second } return obj } setInterval (() => { var currentDate = new Date () var dt = getDiffTime (currentDate, targetDate) var str = `春节倒计时:${dt.day} 天${dt.hour} 小时${dt.minute} 分钟${dt.second} 秒` box.innerHTML = str }, 1000 ) </script >
效果: