JS(JavaScript)是一种脚本语言,是许多浏览器的默认脚本语言,因此不需要在<script>标签中使用 type=”text/javascript”。
下面所有JS代码都是写在下面这个模板的<script>标签中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head>
<body> <div id="app"> <button id="button" onclick="test()">Button</button> </div> </body>
<script> </script> </html>
|
获取HTML元素
1
| document.getElementById(id)
|
对象与JSON字符串互相转化
1 2
| var jsonStr = JSON.stringify(obj1) var obj2 = JSON.parse(jsonStr)
|
判断对象为空
js的对象有3种状态:undefined、null、空对象(无属性的对象)、有属性的对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| function test() {
var obj1 getType(obj1) var obj2 = null getType(obj2)
var obj3 = {} getType(obj3)
var obj4 = { a: 1, b: 2 } getType(obj4) }
function getType(obj) { if(obj === undefined) console.log('undefined') else if(obj === null) console.log('null') else if(Object.keys(obj).length === 0) console.log('{}') else console.log('有属性') }
|
另外,很多时候判断变量直接写if(obj),这个详细展开说下。
IF+变量
很多时候,我们直接使用变量作为判断条件,如:
1 2
| if(obj) {} obj ? true : false
|
对于不同的变量类型,判断为true/false的结果各有差异,具体为:
- undefined、null => false
- 空字符串 => false (只有空格的字符串不算空字符串)
- 整数0 => false
为true的情况就与以上情况相反。
是否相等
两个等号==与三个等号===都是用来比较变量是否相等,区别在于,两个等号是不严格相等,类型不同的变量只要值相等也属于相等。一般使用三个等号,类型不同即不相等。
不等号 !=与!==的区别也是如此,一般使用后者。
例子:
1 2 3 4 5 6 7
| function test() { var num = 1 var str = "1"
console.log(num == str) console.log(num === str) }
|
遍历数组
遍历数组元素都是通过下标来遍历,无论数组元素是普通类型还是对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| function test() { var arr = [1,2,3,4,5,6] for(var i in arr) { console.log(arr[i]) } for(var i=0; i<arr.length; i++){ console.log(arr[i]) }
var obj1 = { a: 1, b: 2, c: 3, d: 4 } var obj2 = { e: 99, f: 88 } var arr = [obj1, obj2] for(var i in arr) { console.log(arr[i]) } }
|
遍历对象属性
遍历对象属性也可以用for in语法,此外还可以用Object.keys()。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function test() { var obj = { a: 1, b: 2, c: 3, d: 4 }
for(var key in obj) { console.log(key + ":" + obj[key]) }
var keys = Object.keys(obj); for(var i in keys) { console.log(keys[i] + ":" + obj[keys[i]]) } }
|
对象合并与复制
使用三点运算符... 或 Object.assign()
三点运算符例子:
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
| function test() { var obj1 = { a: 1, b: 2, c: 3, d: 4 } var obj2 = { e: 99, f: 88 } var obj3 = {...obj1} var obj4 = {...obj1, ...obj2} var obj5 = { e: 100, f: 88 } var obj6 = {...obj4, ...obj5} console.log(JSON.stringify(obj3)) console.log(JSON.stringify(obj4)) console.log(JSON.stringify(obj6)) }
|
Object.assign()例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| function test() { var obj1 = { a: 1, b: 2, c: 3, d: 4 } var obj2 = { e: 99, f: 88 } var obj5 = { e: 100, f: 88 } var obj6 = Object.assign(obj1, obj2, obj5)
console.log(JSON.stringify(obj1)) console.log(JSON.stringify(obj6)) }
|
注:合并后的对象属性顺序与合并顺序一致。当参与合并的两个对象有相同属性 key 时,后一个对象的属性 value 会覆盖前一个对象的value。
对象属性的增删
JS对象可以随意新增、删除属性字段。前提是这个对象不为 null 或 undefined。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function test() { var user = {} user.name = "abc" user.age = 24 user.sex = "male" console.log(JSON.stringify(user)) delete user.age console.log(JSON.stringify(user)) var user2 = null user2.name = "efg" var user3 user3.name = "efg" }
|
查找数组元素并返回
JS的Array.find方法用于查找出满足指定条件的元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function test() { var arr = [1,2,3,4,5] var result = arr.find((e) => { e = e + 1 return e === 6 }) console.log(arr) console.log(result) var arr2 = [] var result2 = arr2.find((e) => { return e + 1 === 6 }) console.log(result2) }
|
在回调函数中,“return + 条件”,条件符合则返回true,查找到元素。回调函数中即使对每个元素有修改,也不会改变原数组和原数组中的元素。若符合条件的元素有多个,只返回第一个。
若数组为空,则返回 undefined 。
此外,还有返回符合条件的元素的下标的方法:Array.findIndex。除了返回的是下标值外,其他和 find 方法无异。空数组返回 -1 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function test() { var arr = [1,2,3,4,5] var result = arr.findIndex((e) => { e = e + 1 return e === 6 }) console.log(arr) console.log(result) var arr2 = [] var result2 = arr2.findIndex((e) => { return e + 1 === 6 }) console.log(result2) }
|
查找元素下标还有更简单的方法: indexOf和lastIndexOf,用法如下:
1 2 3 4 5 6 7 8 9
| function test() { var arr = [1,2,3,4,5,4] var result = arr.indexOf(4) var result2 = arr.lastIndexOf(4) console.log(result) console.log(result2) }
|
如果要返回所有符合条件的元素,用 filter 方法:
1 2 3 4 5 6 7 8 9
| function test() { var arr = [1,2,3,4,5,4] var result = arr.filter((e) => { return e === 4 })
console.log(result) }
|
遍历数组元素并执行函数
这个功能用上面小节“遍历数组”中的方法也可实现。这里介绍更高级的方法。
map:
1 2 3 4 5 6 7 8 9 10
| function test() { var arr = [1,2,3,4,5] var result = arr.map((e) => { return e*2 }) console.log(arr) console.log(result) }
|
map 方法对原数组每个元素执行一遍回调函数,返回新数组。如果没有return,则新数组元素为 undefined。若原数组为空,则新数组也为空:[]
map 方法也可以这么用:
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
| function test() { var obj1 = { a: 1, b: 2 } var obj2 = { a: 3, b: 4 } var obj3 = { a: 5, b: 6 } var arr = [obj1, obj2, obj3] var arrA = [] var arrB = [] arr.map((e, index) => { arrA[index] = e.a arrB[index] = e.b }) console.log(arr) console.log(arrA) console.log(arrB) }
|
forEach:
1 2 3 4 5 6
| function test() { var arr = [1,2,3,4,5] arr.forEach((e, index) => { console.log(e) }) }
|
与 map 不同,forEach 没有返回值,但也是每个元素都执行一遍回调函数。
map 和 forEach 会不会改变原数组?这个要看具体情况。
如果是对象数组,则会改变原数组:
【因为对象数组遍历时的 e 是引用类型,改变引用即改变原对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| function test() { var obj1 = { a: 1, b: 2 } var obj2 = { a: 3, b: 4 } var obj3 = { a: 5, b: 6 } var arr = [obj1,obj2,obj3] arr.map((e, index) => { e.b = e.a }) console.log(arr)
}
|
如果是基本类型数组,则不改变原数组:
【基本类型包括number, string, boolean, null, undefined
1 2 3 4 5 6 7 8 9
| function test() { var arr = [1,2,3,4,5] arr.map((e, index) => { e = e*2 }) console.log(arr) }
|
如果是下面这样用,不管是什么类型的数组都会改变原数组:
1 2 3 4 5 6 7 8 9 10
| function test() { var arr = [1,2,3,4,5] arr.map((e, index) => { arr[index] = 1 }) console.log(arr)
}
|
上面的例子都是用 map,改成 forEach 现象相同。
增删数组元素
pop:删除数组的最后一个元素,返回删除的元素。
push:向数组的末尾添加一个或更多元素,返回新的长度。
shift:删除数组的第一个元素,返回删除的元素。
unshift:向数组的开头添加一个或更多元素,返回新的长度。
例子:
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
| function test() { var arr = [1,2,3,4,5,6,7,8,9,10] var result1 = arr.pop() console.log(arr) console.log(result1) console.log("----------------") var result2 = arr.push(11,12,13) console.log(arr) console.log(result2) console.log("----------------")
var result3 = arr.shift() console.log(arr) console.log(result3) console.log("----------------") var result4 = arr.unshift(20,21,22) console.log(arr) console.log(result4) console.log("----------------") }
|
指定下标增删元素:splice 方法
array.splice(index, howmany, item1,…..,itemX)
index:要添加/删除元素的下标位置
howmany:在此下标位 删除 多少元素,为0表示不删除元素
item1,…..,itemX:要添加的元素,一个或多个
只返回被删除的元素组成的数组,若没有删除元素则返回空数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| function test() { var arr = [1,2,3,4,5,6,7,8,9,10] var result1 = arr.splice(2,2) console.log(arr) console.log(result1) console.log("----------------") var result2 = arr.splice(7,0,20,21) console.log(arr) console.log(result2) console.log("----------------") var result3 = arr.splice(1,3,30,31) console.log(arr) console.log(result2) console.log("----------------") }
|
字符串常用方法
JS中的字符串变量有很多方法的使用方式和作用与 Java 类似,其中包括:
substring(start, end)
split(regex, limit)
concat(str1, str2, …)
indexOf(searchString,position)
lastIndexOf(searchString, position)
replace(searchValue, replaceValue)