参考资料:课程链接
<script>
alert("hello world")
document.write("hello world")
console.log("hello world")
</script>
<button onclick="alert('hello world')">点我</button>
<a href="javascript:alert('hello')">点我</a>
内嵌的js可以写在head和body中,但建议放在head或者body靠后面那里。
放在body前面或中间部分,可能会因为dom结点的获取导致网页卡住。
<script type="text/javascript">
console.log("hello")
</script>
这种方式最推荐
<script src="./js/hello.js"></script>
注释://单行注释;/多行注释/
alt+shitt+A -----> 多行注释快捷键
规范:要么写分号、要么用好换行
var num
num = 100
var x = 50
var a,b,n
var c=1,d=2
undefined 不知道会被赋值为什么类型的值时使用
null 知道一定会赋值为对象时使用
var a = "123"
typeof a
typeof(a)
console.log(typeof a + 100) //string100
console.log(typeof(a + 100)) // string
当x为undefined或者包含字符串,则其转换为NaN (not a number)
当x为null,则其转换为0
var a = "100"
var b = Number(a)
console.log(typeof a, typeof b)
var c = "abc"
var d = Number(c) //NaN Not a Number
console.log(c, d)
var e = true // true false
var f = Number(e) //1 0
console.log(e, f)
var g = null
var h = Number(g) //0
console.log(g, h)
// var i = undefined
var i
var j = Number(i) //NaN
console.log(i, j)
var a = "123abc"
var b = "123.46ab"
var c = parseInt(a) //123
var d = parseInt(b) //123
console.log(c, d)
var e = parseFloat(a) //123
var f = parseFloat(b) //123.46
console.log(e, f)
var a = "100"
var b = a - 0 // 数值100,还可以 a*1、a/1
String() 所有类型都能转成字符串
变量名.toString() null 和 undefined 转换不了
加号
// 1. String() 所有类型都能转成字符串
var a = 123
// var b = String(a)
// console.log(a, b)
// 2. 变量名.toString() null 和 undefined 转换不了
// var b = a.toString()
// console.log(a, b)
// 3. 加号
var b = a + ""
console.log(a, b)
Boolean(x)
当 x 为 0,“”,undefined,null,NaN时,结果为false,其余均为true
+
-
*
/
%
=
+=
-=
*=
/=
%=
== 不管数据类型 1 == "1"
=== 全等于,要管数据类型
!= 不管数据类型 1 != '1' 结果为false
!== 全不等于,要管数据类型 1 != '1' 结果为true
>
<
>=
<=
&&
||
!
特殊情况:
a++
++a
a--
--a
判断语句 ? 语句1 : 语句2
判断语句为真,则执行语句1,否则执行语句2
if () {
} else if () {
} else {
}
switch (值) {
case xxx: ...
case xxx: ...
default: ...
break;
}
// xxx 最好不写成判断语句,而写成特定的值,
while() {
}
do {
} while()
for () {
}
函数 function 是一个复杂的数据类型
//声明
function 函数名(){}
// 调用
函数名()
// 声明
var 函数名 = function(){}
// 调用
函数名()
声明式和赋值式的区别:赋值式必须先声明再调用,而声明式的调用允许写在它的声明之前
参数可以有,可以没有
function 函数名(参数) {
....
return 返回值
}
var res = function(参数)
// 默认undefined(没有return 返回值语句时)
js是一种解释型语言,就是在代码执行前,先对代码进行通读和解释,然后再执行代码
js代码在运行的时候,会经历解释代码和执行代码两个环节
变量的声明,声明式函数的声明,会在预解析阶段提到前面去进行声明、解析
<script>
// 变量
console.log(myName) //undefined
var myName = "Brisa"
console.log(myName) //Brisa
// 赋值式函数
// myFunc() //会报错,导致后面的代码也不能执行
var myFunc = function() {
console.log("my function1")
}
myFunc()
// 声明式函数
test() //正常执行
function test() {
console.log("test")
}
test()
</script>
<script>
/***********************************eg.1************************************/
var myName = "fbai"
var myName = "ey92ye"
console.log(myName) //答案会是ey92ye,联想到预解析,就相当于是先声明了变量,再给变量前后赋值两次,所以最后结果为后面那次
function test() {
console.log("test1")
}
function test() {
console.log("test2")
}
test() //答案会是test2,联想到预解析,就相当于是先声明了变量,再给变量前后赋值两次,所以最后结果为后面那次
/************************************eg.2.1***********************************/
//执行顺序 var age; age = 100; function age(){}
var age = 100
function age() {
console.log("age is 100")
}
console.log(age) //答案会是100
// age() //报错,函数名和变量名冲突
/*************************************eg.2.2**********************************/
//执行顺序 function age(){}; number(); var number; number = 100
number() // number is 100(正常显示)
var number = 100
function number() {
console.log("number is 100")
}
console.log(number) //100,函数名和变量名冲突(实际测试结果仍然正常显示)
// number() // 函数名和变量名冲突(报错)
</script>
<script>
// 预解析(变量提声-提前声明)只能提声到它自己所在的script便签内
number()
function number() {
console.log("number is 200")
}
</script>
<script>
function test(a, b) {
var result = a + b
console.log(result)
}
test(1, 2)
// console.log(result) //报错,该变量作用域只在函数内,函数外无法正常调用
</script>
function fn(){
num = 100 //前面没有对num有任何声明,就会将num定义为一个全局变量,再赋值为100
}
<script>
var obj = {
name: "kerwin",
age: 15,
location: "大连",
"a+b": "111111"
}
</script>
shift + " 给选中内容加""
要不要给obj里的key加引号取决于它是否符合变量命名规则,不符合的情况下建议加上引号有没有特殊符号,没有的情况下可以不加
// 创建一个空对象
var obj = {}
// 向对象中添加成员
obj.name = "ali"
obj.age = 18
// 创建一个空对象
var obj = new Object()
// 向对象中添加成员
obj.name = "rose"
obj.age = 18
Object()是JS中内置的创建对象的函数
删除属性 -> delete obj.属性名 或者 delete obj[“属性名”]
<script>
// 增
var obj = {}
obj.name = "kerwin"
obj.age = 100
obj.location = "dalian"
// 查
console.log(obj.name)
// 改
obj.age = 18
console.log(obj)
// 删
delete obj.name
console.log(obj)
// 2.增
var obj2 = {}
obj2["name"] = "tie"
console.log(obj2)
// 2.查
console.log(obj2["name"])
// 2.改
obj2["name"] = "tiechui"
console.log(obj2)
// 2.删
delete obj2["name"]
console.log(obj2)
</script>
var obj = {
name: "kerwin",
age: 100,
location: "dalian"
}
for (var i in obj) {
// 这里只能用obj[i]的方式访问属性值,obj.i由于i是变化的,无法正常访问到相对应的值
document.write(i + ":" + obj[i])
document.write("
")
}
var obj = {...}
var mvobj = obj //此时,他们指向了同一地址,不管谁对...中的值作了修改,另外一个都会变化
var obij = {...} //它操作的是另一地址...的值,不会互相影响
var obj3 = {} // 就相当于,它自己有一个地址
for (var i in obj) {
obj3[i] = obj[i]
}
// 这种情况下,我们对obj3进行改变,也不会影响到obj

数组:数字的组合,数据的集合
数据类型分类:
var arr1 = []
var arr2 = new Array()
var arr3 = [1, 2, 3, 4, 5]
var arr1 = [1, 2, 3, 4, 8]
arr1.length = 3
// arr1 -> [1, 2, 3]
//清空数组
arr1.length = 0
var arr1 = [1, 2, 3, 4, 8]
console.log(arr1[2]) // 3
arr1[2] = 4 //修改为4
arr1[5] = 5 // 增加一个元素
var arr1 = [1, 2, 3, 4, 8]
for (var i=0; i<arr1.length; i++){
console.log(arr1[i])
}
var arr1 = [1, 2, 3, 4, 8]
var arr2 = arr1
arr2[2] = 3
console.log(arr1[2]) // 3
// 对arr2更改也会影响arr1
var arr3 = []
for (var i=0; i<arr1.length; i++){
arr3[i] = arr1[i]
}
function bubbleSort(var arr) {
var flag = true
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
flag = false
}
}
if (!flag) {
break;
}
}
}
function selectSort(var arr) {
for (var i=0; i<arr.length; i++){
var minIndex = i
for (var j=i+1; j<arr.length;j++){
if (arr[j] < arr[minIndex]) {
minIndex = j
}
}
if (minIndex !== i) {
var temp = arr[i]
arr[i] = arr[minIndex]
arr[minIndex] = temp
}
}
}
会影响数组本身
最后面追加元素
返回值:追加后的数组长度
var arr = [1, 2, 3]
var res = arr.push(5)
console.log(res) // 4
删除最后面的元素
返回值:删除的元素
var arr = [1, 2, 3]
var res = arr.pop()
console.log(res) // 3
最前面追加元素
返回值:追加后的数组长度
var arr = [1, 2, 3]
var res = arr.unshift(0)
console.log(res) // 4
删除最前面的元素
返回值:删除的元素
var arr = [1, 2, 3]
var res = arr.shift()
console.log(res) // 1
删除元素或追加元素
返回值:删除的元素组成的的数组
// arr.splice(i, j, a, b, ...) i 开始的位置(下标);j 要删除元素的个数,写0就不删;a、b、...增加的内容
var arr = [1, 2, 3]
var res1 = arr.splice(1, 2)
var res2 = arr.splice(1, 0, 4, 5, 6)
console.log(res) // 4
倒序
var arr = [1, 2, 3]
arr.reverse()
console.log(arr) // 3, 2, 1
排序,sort是一个一个的排
var arr = [1, 2, 13,27, 5]
arr.sort()
console.log(arr) // 注意这里的结果!!! 1, 13, 2, 27, 5
arr.sort(function(a, b){
return a-b // 从大到小
//return b-a 从小到大
}
不会影响数组本身
拼接元素
var arr1 = [1, 2, 3]
var arr2 = [4, 5, 6]
var arr3 = arr1.concat(arr2)
var arr4 = arr3.concat(arr2, 7, [8, 9, 10])
var arr5 = arr1.concat() // 不传参可进行复制
数组转字符串
var arr1 = [1, 2, 3]
var arr2 = arr1.join("-")
console.log(arr2) // 1-2-3
var arr = []
for (var i=0; i<5; i++){
arr.push("- "
+i+"")
}
document.write(arr)
截取(开始索引,结束索引)
区别于slice,不会截走数组
var arr1 = [1, 2, 3, 4]
var arr2 = arr1.slice(0, 2)
console.log(arr2) // arr2 -> [1, 2, 3]
var arr3 = arr1.slice(0, -1) // [1, 2, 3, 4]
// -1, -2, ... 就相当于从最后一个往前数,倒数第一个的下标即为-1
var arr4 = arr1.slice() // 不传参,也相当于复制了一份,也是全新的复制,不会互相影响
定位
返回值:找的到就返回对应下标,找不到返回-1
var arr1 = ["a", "b", "c", "d"]
var res = arr1.indexOf("b")
console.log(res) // 1
var res2 = arr1.indexOf("b", 2) // 从下标2的位置找是否存在 b
console.log(res2) // -1 没找到
定位,从后往前找
返回值:找的到就返回对应下标,找不到返回-1
var arr1 = ["a", "b", "c", "d"]
var res = arr1.lastIndexOf("b", 2)
console.log(res) // 1
var arr = [1, 2, 3, 4, 5, 2, 1]
var res = []
for (var i=0; i<arr.length; i++){
if(res.indexOf(arr[i]) === -1){
res.push(arr[i])
}
}
console.log(res)
var arr = [1, 2, 3, 4, 5, 2, 1]
var obj = {}
for (var i=0; i<arr.length; i++){
obj[arr[i]] = i
}
var res = []
for (var i in obj){
res.push(i-0) //转数字
}
console.log(res)
var arr = [1, 2, 3, 4, 5, 2, 1]
var set1 = new Set(arr)
var res = Array.from(set1) // 转成数组
console.log(res)
遍历
var arr = [1, 2, 3, 4, 5, 2, 1]
arr.forEach(function(item, index, arr) { //index, arr 可略
console.log(item, index, arr)
})
映射
var arr = [1, 2, 3, 4, 5, 2, 1]
var arr2 = arr.map(function(item) { //index, arr 可略
return item*item
})
过滤
var arr = [1, 2, 3, 4, 5, 2, 1]
var arr2 = arr.filter(function(item) { //index, arr 可略
return item>2
})
var arr = [{name:"aaa",price:100}, {name:"bbb",price:120}, {name:"ccc",price:150}]
var arr2 = arr.filter(function(item) { //index, arr 可略
return item.price>120
})
每一项,都满足时返回true,否则返回false
var arr = [1, 2, 3, 4, 5, 2, 1]
var res = arr.every(function(item) {
return item>=1
})
console.log(res)
只要有一项,满足时就返回true
var arr = [1, 2, 3, 4, 5, 2, 1]
var res = arr.some(function(item) {
return item>=5
})
console.log(res)
找到满足条件的第一项
区别于filter,filter是过滤得到满足条件的数组,find是找到满足条件的第一项
var arr = [
{
name:"语文",
grade:95
},{
name:"数学",
grade:100
},{
name:"体育",
grade:96
}
]
var arr2 = arr.find(function(item) {
return item.grade===5
})
console.log(arr2)
叠加
var arr = [1, 2, 3, 4, 5]
var res = arr.reduce(function(prev, item){//prev 上一次返回的结果,每一项
return prev+item
},0)//0这个位置是放prev的初始值
console.log(res)
console.log(arr)
// prev 0 1 3 6 10 15
// item 1 2 3 4 5
两种差不多,但第二种是对象型字符串
var str1 = "hello" // hello
var str2 = new String("hello") //String{"hello"}
var str = "qewwaidf"
console.log(str.length)
console.log(str[1])
var str = "hello"
for (var i=0; i<str.length; i++){
console.log(i, str[i])
}
var str2 = str
str2 = "123"
console.log(str)//str仍为原样,因为str是简单数据类型,直接复制只是值的复制
var str = "abcabcbc"
var obj = {}
for(var i=0;i<str.length;i++){
var key = str[i]
if(obj[key]){
obj[key]++
} else{
obj[key] = 1
}
}
console.log(obj)
返回索引对应的字符
var str = "abcdef"
var str1 = str.charAt(2)
console.log(str1) // c
返回索引对应的字符的ASCII编码
var str = "abcdef"
var str1 = str.charCodeAt(2)
console.log(str1) // 99
var arr = []
for (var i=65;i<91;i++){
arr.push(String.fromCharCode(i))
}
console.log(arr) // ['A', 'B',...,'Z']
返回索引对应的字符的ASCII编码
var str = "abCDef"
var str1 = str.toUpperCase()
var str2 = str.toLowerCase()
console.log(str,str1,str2) //
区别:
var str = "abcdef"
var str1 = str.substr(1, 2)
console.log(str1) // bc
var str = "abcdef"
var str1 = str.substring(1, 2)
console.log(str1) // b
var str2 = str.substring(1) //只写一个,则默认截取开始索引到后面全部
console.log(str2) // bcedf
var str = "abcdef"
var str1 = str.slice(1, 2)
var str2 = str.slice(1)
var str3 = str.slice(1, -1)
console.log(str, str1, str2, str3)
// abcdef b bcdef bcde
var str = "abcdef"
str = (str.substring(0,1)).toUpperCase()+str.substring(1)
console.log(str)
替换
弊端:它只替换遇到的第一个相应的字符,想要全部替换可以用for循环或者后面会学到的正则表达式
var str = "abdcsgsr"
var str1 = str.replace("d", "*")
console.log(str1)
分割,和数组中的join反过来了
var str = "a, b, c, d"
var str1 = str.split(",") //用数组包裹起来 ['a', 'b', ...]
var str2 = str.split("")//空字符串,则表示把字符串的每一个字符都分割 ["a", ",", "b",...]
console.log(str1, str)
var str = "abcd"
console.log(str.indexOf("b"))
console.log(str.indexOf("b", 1)) //1-开始寻找的位置
console.log(str.lastIndexOf("b"))
console.log(str.lastIndexOf("b", 2)) // 2-开始寻找的位置,反向找
连接字符串
var str1 = "abcd"
var str2 = str1.concat("ef")
var str3 = str1 + "ef" //和+号没有区别
console.log(str2, str3)
var str = " hello world "
console.log("|" + str + "|")
console.log("|" + str.trim() + "|")
console.log("|" + str.trimStart() + "|")
console.log("|" + str.trimLeft() + "|")
console.log("|" + str.trimEnd() + "|")
console.log("|" + str.trimRight() + "|")
// | hello world |
// |hello world|
// |hello world |
// |hello world |
// | hello world|
// | hello world|
var arr = ["aaa", "bbb", "ccc", "abc", "bcc", "bcd", "ccd"]
var input = prompt("请输入查询的内容")
var res = arr.filter(function(item) {
return item.indexOf(input) != -1
// 也可以写 > -1
})
console.log(res)
// split
// json字符串-->对象
var str = '{"name":"ali", "age":100}'
var obj = JSON.parse(str)
console.log(obj) //不符合格式的就会出问题
// 下面的会报错,因为key没有引号,且不能多逗号
/*var str1 = '{name:"ali", age:"100"}'
var obj1 = JSON.parse(str1)
console.log(obj1)*/
// 对象-->JSON字符串
var obj1 = {
"name": "alala",
"age": 100
}
var str1 = JSON.stringify(obj1)
console.log(obj1, str1)
//es6 -`` 反引号(~键英文输入)
/*var myhtml = '- 11111111
\
- 222222
\
- 333333333
'*/
var myhtml = `- 11111111
- 222222
- 333333333
`
document.write(myhtml)
var myname = "alili"
var str = `my name is ${myname}, ${10+20} ${10>20 ? 'aaa':'bbb'}` //反引号里面还可以填入变量
document.write(str)
var arr = ["xiaoming", "daqiang", "blue"]
var arr2 = arr.map(function(item) {
return `${item}`
})
console.log(arr2)
// Number
// toFixed() 保留几位小数,且返回的是字符串
var price = 123.456
var sum = price.toFixed(2) - 0 + 100
console.log(sum.toFixed(2))
// Math 对象
// console.log(Math)
// random [0,1)之间的随机数
console.log(Math.random())
// round 四舍五入取整
console.log(Math.round(4.46))
// ceil 向上取整
console.log(Math.ceil(4.46))
// floor 向下取整
console.log(Math.floor(4.96))
// abs 绝对值
console.log(Math.abs(-10))
// sqrt 平方根
console.log(Math.sqrt(4))
// pow(底数, 指数)
console.log(Math.pow(2, 3))
// max(多个参数)
console.log(Math.max(2, 3))
// min(多个参数)
console.log(Math.min(2, 3))
// PI
console.log(Math.PI)
// 0-10 不包含10
var res = Math.floor(Math.random() * 10)
console.log(res)
// 0-10 包含10
var res = Math.floor(Math.random() * (10 + 1))
console.log(res)
// 10-20 不包含20
var res = Math.floor(Math.random() * 10) + 10
console.log(res)
// 10-20 包含20
var res = Math.floor(Math.random() * (10 + 1)) + 10
console.log(res)
// 函数 min-max 不包含
function getRnd1(min, max) {
if (min > max) {
console.error("参数有误")
return
}
return Math.floor(Math.random() * (max - min)) + min
}
console.log(getRnd1(10, 20))
// 函数 min-max 包含
function getRnd2(min, max) {
if (min > max) {
console.error("参数有误")
return
}
return Math.floor(Math.random() * (max - min + 1)) + min
}
console.log(getRnd2(10, 20))
// 不传参,获取当前时间
var date = new Date()
console.log(date) // 自动转为字符串
// new Date 传参
// 1个传参 毫秒数
var date1 = new Date(1000)
console.log(date1)
// 1970 1 1 0:0:1
// 2个参数 3个参数
var date2 = new Date(2023, 0) // 年份,月份(0-11对应1-12月),几号,时,分,秒
console.log(date2)
var date3 = new Date(2023, 0, 3, 12, 55, 37)
console.log(date3)
// 字符串
var date4 = new Date("2023-10-10 10:10:10")
var date5 = new Date("2023/10/10 10:10:10")
console.log(date4)
console.log(date5)
var date = new Date()
// getFullYear()
console.log(date.getFullYear())
// getMonth() 返回的是0-11 对应 1-12
console.log(date.getMonth())
// getDate() 几号
console.log(date.getDate())
// getDay() 周几
console.log(date.getDay())
// getHours()
console.log(date.getHours())
// getMinutes()
console.log(date.getMinutes())
// getSeconds()
console.log(date.getSeconds())
// getMilliseconds()
console.log(date.getMilliseconds())
// getTime() 时间戳
console.log(date.getTime()) // 距1970.1.1. 0:0:0的毫秒数
console.log(new Date(1663919317554))
// 设置
var date = new Date()
console.log(date)
date.setFullYear(2025)
date.setMonth(5)
date.setDate(6)
date.setHours(12)
date.setMinutes(55)
date.setSeconds(21)
date.setMilliseconds(356)
console.log(date)
// 时间戳
date.setTime(1663919317554)
console.log(date)
<button id="btn1">清除定时器-延时button>
<button id="btn2">清除定时器-间隔button>
<script>
// 注册定时器,延时执行代码 2000=2s
var time1 = setTimeout(function() {
console.log("abc")
}, 2000)
// 注册间隔定时器,间隔时间执行代码 1000=1s
var time2 = setInterval(function() {
console.log(new Date())
}, 1000)
console.log(time1, time2) // 注册顺序
// 停下的方法
// clearTimeout(time1)
// clearInterval(time2)
console.log(btn1, btn2) // 直接通过id,拿到按钮对象
btn1.onclick = function() {
console.log("btn1 onclick")
clearTimeout(time1)
}
btn2.onclick = function() {
console.log("btn2 onclick")
clearInterval(time2)
}
script>
// 总体同步,间隔里的function异步执行,且异步在同步执行完后才执行
console.log("111111111111")
setTimeout(function() { // 顺序仍然是从上往下的,不过先进行注册的这一步,然后继续向下,与此同时,异步中仍然在执行0s后的function
console.log("abc")
}, 0)
console.log("222222222222")
<div id="box">div>
<script>
var currentDate = new Date()
var targetDate = new Date("2022/11/11")
console.log(targetDate - currentDate) // 时间戳差值
// 函数
function diffTime(current, target) {
var sub = Math.ceil((target - current) / 1000) //毫秒差
var day = parseInt(sub / (60 * 60 * 24))
var hours = parseInt(sub % (60 * 60 * 24) / (60 * 60))
var minutes = parseInt(sub % (60 * 60) / 60)
var seconds = sub % 60
var obj = {
day: day,
hours: hours,
minutes: minutes,
seconds: seconds
}
return obj
}
setInterval(function() {
var currentDate = new Date()
var obj = diffTime(currentDate, targetDate)
// console.log(obj)
// document.write(`距离TB双11还有 ${obj.day}天${obj.day}时${obj.minutes}分${obj.seconds}秒`)
// document.write("
")
box.innerHTML = `距离TB双11还有 ${obj.day}天${obj.day}时${obj.minutes}分${obj.seconds}秒`
}, 1000)
script>