续 <一>
<script>
var num = 19//new Number(num)
// integer:整数
// 类属性
console.log(Number.MAX_SAFE_INTEGER);
// 对象方法
var num1 = 3.333454
// 转化成字符串类型
console.log(num1.toString());
// 转换为二进制
console.log(num1.toString(2));
console.log(123..toString());
// 保留三位小数
console.log(num1.toFixed(2));
// 类方法
// 字符串转数字类型
var str = "123.24"
Number(str)//不做区分浮点数和整数
Number.parseInt(str)
Number.parseFloat(str)
// window对象上面
console.log(parseInt(str));
</script>
<body>
<script>
console.log(typeof Math);
// Math对象的属性
console.log(Math.PI);
var num = 3.13
console.log(Math.floor(num));
console.log(Math.ceil(num));
console.log(Math.round(num));
// random:[0,1)
console.log(Math.random());
// 需求5~50的随机数
// [5,20)
var randomNum = Math.floor(Math.random()*45)+5
</script>
</body>
属性
常见的方法
公式: [a,b)的随机数
<script>
// 属性
var message = "lili"
console.log(message.length);
// 访问某一个位置对应的字符
console.log(message[3]);//超出范围:undefined
console.log(message.charAt(3));//超出范围:空字符串
// 3. 字符串的遍历
// 3.1 for普通遍历
for(let i =0;i<message.length;i++){
console.log(message[i]);
}
// 3.2 for..of遍历 -> 迭代器:目前就字符串和数组
// 对象不支持for...of
// string对象内部将字符串变成了一个可迭代对象
for(var char of message){
console.log(char);
}
</script>
// 4. 修改字符串
// 创建新的字符串,让变量指向了一个新的值
message = "加加加"
// 严格的修改字符串:修改之前的字符串内部
message[1] = "0"
// 所有字符变成大写:生成新的字符串
var message1 = message.toUpperCase()
console.log(message1);
// 变成小写
var message2 = message.toLowerCase()
// 判断一个字符串中是否有另外一个字符串
// 5.1 indexOf(searchString,fromIndex)
/*
index:搜索到,返回搜索字符串所在的索引位置
没有搜索到,返回-1
*/
var index = message2.indexOf(name)
console.log(index);
// 存在
if (message2.indexOf(name) !== -1) {
console.log("message2中包含name");
} else {
console.log("message2中不包含name");
}
// 5.2 includesES6新增语法,用来判断包含关系
if (message2.includes(name)) {
console.log("哈哈哈哈好好照顾自己~~");
}
// 5.3 startWith:是否以xxx开头
if (message2.startsWith("my")) {
console.log("messages以my开头");
}
// 5.4 endWith:是否以xxx开头
// 5.5 replace:替换字符串("替换谁",正则表达式、代替值、函数)
var newMessage = message2.replace("lili", "涵涵")
console.log(newMessage);
var newMessage2 = message2.replace("lili", function () {
// 使用函数返回的值去替代字符串
return "kobe"
})
console.log(newMessage2);
// 6. 获取子字符串:slice、substring、substr
// slice
var clothes = "衣服包包鞋子"
console.log(clothes.slice(3));//截到最后
console.log(clothes.slice(1, 3));
// substr:浏览器是否支持
// 6. 获取子字符串:slice、substring、substr
// slice
var clothes = "衣服包包鞋子"
console.log(clothes.slice(3));//截到最后
console.log(clothes.slice(1, 3));
// substr:浏览器是否支持
// 7. 字符串的拼接
// 7.1 +
var str1 = "lili"
var str2 = "哈啰"
var newStr = str1 + str2
// 7.2 concat:支持链式调用,参数是可变参数...
var newStr2 = str1.concat(str2, newStr)
// 8. 删除首尾空格
console.log(" lili ".trim());
// 9. 字符串的切割split:返回值是一个string类型的数组
var infos = "aaa-bbb-ccc-ddd"
// 传入一个分隔符
var items = infos.split("-")
console.log(items);
// join:把数组转为字符串,参数为以什么连接
var str3 = items.join("*")
console.log(str3);
<body>
<script>
// 1. 创建数组的方式一:字面量的方式
var names = ["aaa", "bbb", "ccc"]//字符串类型
var products = [
{ name: "iphone", price: 99, desc: "九块九" },
{ name: "鼠标", price: 199, desc: "哈哈" },
{ name: "键盘", price: 989, desc: "六点多" },
]//对象类型
// 2. 创建数组方式二:类Array
var arr1 = new Array()
console.log(arr1);
var arr2 = new Array("abc", "cba", "nba")//["abc","cba","nba"]
console.log(arr2);
// 传入一个数字,会默认当成常见一个对应长度的数组
var arr3 = new Array(5)//[empty * 5]
</script>
</body>
<script>
var names = ["aaa", "bbbb", "ccccc"]
// 1. 访问数组中的元素
console.log(names[0]);
console.log(names.at(-1));
// 2. 修改数组中的元素
names[0] = "why"
// 3. 新增数组中的元素
names[3] = "kobe"//没有人这么做
// 4. 删除数组中的元素
delete names[1]//empty,没有人这么做
</script>
<script>
var names = ["lili", "dameinb", "jiao"]
// 在数组的尾部添加和删除元素
// push方法
names.push("aaaa", "dddd")
// pop方法
names.pop()
// 在数组的头部添加和删除元素:效率非常低
// unshift方法
names.unshift("sss", "hhh")
// shift方法
names.shift()
// splice方法:处理数组的利器,修改的是原数组
// 能够在任意位置添加/删除/替换元素
// 参数一:start,从什么位置开始操作函数
// 参数二:deleteCount,删除元素的个数
// 1. 删除元素
names.splice(1,2)
// 2. 新增元素:deleteCount=0,后面可以添加新的元素
names.splice(1,0,"why","kebe")
// 3. 替换元素:先移除,再新增
names.splice(1,2,"lisssss","yejie")
</script>
<script>
var names = ["lilio", "xiaoming", "xiaohong"]
// 获取数组的长度
console.log(names.length);
// length属性可写的
names.length=10
// 会自动对数组进行扩容
// 设置的length小于原来的元素个数
names.length = 2//会将后面的内容截取掉
</script>
// 数组的遍历
// 1. 普通的for循环
for (var i = 0; i < names.length; i++) {
console.log(names[i]);
}
// 2. for in:适用于需要获取对应的索引
for (var index in names) {
console.log(index, names[index]);
}
// 3. for of
for (var item of names) {
console.log(item);
}
var names = ["abc","ddd","ggg","ytyt"]
// 1. slice 方法:不会修改原数组
// 与splice 区别:splice修改原有的数组
var newNames = names.slice(1)
console.log(newNames);
// 2. concat :将多个数组拼接在一起
var name1 = "lili"
var name2 = "jiao"
var name3 = "dandan"
// 使用展开运算符
const newNames = []
newNames.push(...name1,...name2,...name3)
const newNamess=name1.concat(name2,name3)
console.log(newNamess);
// 3. join:将数组变成字符串
console.log(names.join("-"));
// 1. 数组中存放的是原始类型
var names=["abc","cba","dddd"]
// 1.1 indexOf
// 找到返回索引
// 没找到返回-1
console.log(names.indexOf('abc'));
// 2. 数组中存放的是对象类型
var student = [
{id:1002,name:"hey2",age:14},
{id:1004,name:"hey3",age:15},
{id:1005,name:"hey5",age:64},
{id:1006,name:"hey4",age:34},
]
// 查找id为1004的学生信息
// 2.1 自己写一个for循环
// var stu = {}
// 因此初始化为null
var stu =null
// 赋值为空的缺点:1. 转为布尔值都是真值 2. 空对象会占用内存
for(var i =0;i<student.length;i++){
if(student[i].id === 1004){
console.log(student[i]);
stu = student[i]
break
}
}
// 判断有没有找到对应的学生
if(stu){
console.log("找到了");
}
// 2.2 find方法:高阶函数:数组中有几个元素就会调用多少次传入的函数
var stu = student.find(function (item) {
// console.log(item);
if (item.id === 1004) return true
})
// 简写:
var stu = student.find(item => item.id === 1004)
</script>
//手动实现高阶函数forEach
var names = ["dd", "ddd", "gggg"]
// forEach 函数:可以帮助遍历数组
// names.forEach(function (item, index, err) {
// console.log(item, index, err);
// })
// //版本一:回调函数
// // 自己实现上述函数
// function liliForEach(fn) {
// for (var i = 0; i < names.length; i++) {
// fn(names[i], i, names)
// }
// }
// liliForEach(function (item, index, names) {
// console.log(item, index, names);
// })
// //版本二
// function liliForEach(fn, arr) {
// for (var i = 0; i < arr.length; i++) {
// fn(names[i], i, arr)
// }
// }
// liliForEach(function (item, index, names) {
// console.log(item, index, names);
// }, names)
// // 版本三:往对象里面加属性
// names.liliForEach = function liliForEach(fn) {
// for (var i = 0; i < this.length; i++) {
// fn(this[i], i, this)
// }
// }
// names.liliForEach(function (item, index, names) {
// console.log(item, index, names);
// })
// 版本四:放在原型链上
Array.prototype.liliForEach = function liliForEach(fn) {
for (var i = 0; i < this.length; i++) {
fn(this[i], i, this)
}
}
names.liliForEach(function (item, index, names) {
console.log(item, index, names);
})
//手动实现高阶函数forEach
// 原始类型
var names = ["abc", "vvv", "ooo1"]
// 内部函数返回true,意味着找到了,后边就不需要遍历了,后面的不会继续执行
// 没有返回值意味着返回undefined,布尔值为false
names.find(function (item, index, arr) {
console.log(item, index, arr);
// return true//返回了第一个元素而不是true
})
// 数组中对象类型
var students = [
{ id: 1002, name: "hey2", age: 14 },
{ id: 1004, name: "hey3", age: 15 },
{ id: 1005, name: "hey5", age: 64 },
{ id: 1006, name: "hey4", age: 34 },
]
students.find(function (item) {
console.log(item);
return item.id === 1002
})
// 自己实现
Array.prototype.liliFind = function (fn) {
var item //可以不设定,默认为undefined
for (var i = 0; i < this.length; i++) {
var isFlag = fn(this[i], i, this)
if (isFlag) {
// item = this[i]
// break
return this[i]
}
}
// return item
}
students.liliFind(function (item, index, arr) {
return item.id === 101
})
// 查找元素
// indexOf/lastIndexOf
// includes
console.log(names.includes('abc'));
// findIndex:查找元素索引
var findIndex = names.findIndex(function(item,index,arr){
return item === 'nba'
})
console.log(findIndex);
数组的排序:sort修改原数组
数组的反转:reserve生成一个新的数组
其他高阶函数
reduce
filter
map
// 1.forEach函数
var names = ["abc", "cba", "nba", "mba"]
// 三种方式, 新增一种方式
names.forEach(function (item) {
console.log(item)
})
names.forEach(item => console.log(item))
// 2.filter函数: 过滤
var nums = [11, 20, 55, 100, 88, 32]
// 2.1. for循环实现
var newNums = []
// for of方法
for (var item of nums) {
if (item % 2 === 0) {
newNums.push(item)
}
}
// 2.2. filter实现:形成新数组
// 只筛选出满足条件的
// var newNums = nums.filter(function(item) {
// return item % 2 === 0
// })
// console.log(newNums)
// 3.map函数: 映射:对原来的数组元素进行变化,映射形成新数组
var nums = [11, 20, 55, 100, 88, 32]
var newNums = nums.map(function (item) {
return item * item
})
console.log(newNums)
// 4.reduce
var numbers = [11, 20, 55, 100, 88, 32]
var result = 0
for (var item of numbers) {
result += item
}
console.log(result)
// initialValue: 初始化值, 第一次执行的时候, 对应的preValue
// 如果initialValue没有传呢?
var result = nums.reduce(function(preValue, item) {
console.log(`preValue:${preValue} item:${item}`)
return preValue + item
}, 0)
console.log(result)
// reduce练习
var products = [
{ name: "鼠标", price: 88, count: 3 },
{ name: "键盘", price: 200, count: 2 },
{ name: "耳机", price: 9.9, count: 10 },
]
var totalPrice = products.reduce(function(preValue, item) {
return preValue + item.price * item.count
}, 0)
console.log(totalPrice)
// 综合练习:
var nums = [11, 20, 55, 100, 88, 32]
// 过滤所有的偶数, 映射所有偶数的平方, 并且计算他们的和
var total = nums.filter(function (item) {
return item % 2 === 0
}).map(function (item) {
return item * item
}).reduce(function (preValue, item) {
return preValue + item
}, 0)
console.log(total)
var total = nums.filter(item => item % 2 === 0)
.map(item => item * item)
.reduce((preValue, item) => preValue + item, 0)
console.log(total)
创建数组
数组基本操作
arr[1] = "fff"
arr[5]="123"
delete arr[0]
在数组的尾部:
在数组首部
利器
UTC :标准的时间
创建 Date对象
//创建Date对象的方式
// 1. 没有传入任何的参数,获取到当前时间
var date1 = new Date()
console.log(date1);
// 2. 传入参数:时间字符串
var date2 = new Date("2022-09-09")
console.log(date2);
// 3. 传入具体的年月日时分秒
var date3 = new Date(2023, 10, 10, 9, 8, 7, 333)
console.log(date3);
// 4. 传入一个 Unix 时间戳==》需要转成对应的时间
// 1s ==> 1000ms
var date4 = new Date(100000000000233)
console.log(date4);
new Date().toISOSTring()
---- 但其实也不经常用 // 获取想要的时间信息
var date = new Date()
console.log(date.toISOString());
var year = date.getFullYear()
var month = date.getMonth() + 1
var day = date.getDate()
var hour = date.getHours()
var minute = date.getMinutes()
var second = date.getSeconds()
// 一周中的第几天
var weekday = data.getDay()
// Date对象如何转成时间戳
var date = new Date()
console.log(date);
// 方法一:当前时间的时间戳
var timestamp = Date.now()
console.log(timestamp);
var timestamp1 = date.getTime()//获取时间戳一
var timestamp2 = date.valueOf()//获取时间戳二
//计算操作花费的时间
var startTime = Date.now()
for (var i = 0; i < 10000; i++) {
console.log(i);
}
var endTime = Date.now()
console.log("花费的时间:", endTime - startTime);
利用浏览器提供给开发者的DOM、BOM相关的API才能对页面、浏览器进行操作
API:application programming interface
DOM:文档对象模型
BOM:浏览器对象模型
DOM tree:抽象成DOM对象的时候,会形成一个树结构
学习顺序
继承关系图
文档对象模型(Document Object Model)将页面所有的内容表示为可以修改的对象
对DOM的所有操作都是从 document 对象开始的
,, 元素提供了 rows 属性:
和
// 1. 元素之间的导航
// 1. 拿到 body
var bodyEl = document.body
// 2. 拿到 box
var boxEl = bodyEl.firstElementChild
// 3. 拿到 container
var containerEl = boxEl.children[1]
// 4. 拿到 p
var pEl = containerEl.children[0]
// 5. 拿到 keyword
var spanEl = pEl.children[0]
spanEl.style.color = 'red'
// 2 通过getElementBy直接获取
// 2.1 通过classname获取火速
var keyword = document.getElementsByClassName("keyword")
// 2.2 通过id获取元素
var titleEl = document.getElementById('title')
// 3 通过选择器查询
var keyWordEL = document.querySelector('.keyword')
var keywordEls = document.querySelectorAll('.keyword')
// 是类数组对象但是是可迭代的,支持for of,有一个索引属性,不是数组
//可迭代对象:String,数组,节点列表
nodeType:节点的类型
nodeName:针对于节点,节点的名称
tagName:针对于元素,元素的标签名称
data/nodeValue:针对非元素的节点获取数据
innerHTML:对应的html元素也会获取,会直接进行替换,能够识别标签
textContent:只会获取文本内容,不能够识别标签
outerHTML
hidden属性:也是一个全局属性,可以用于设置元素隐藏,display
总结
boxEl.className = 'active'
boxEl.style.color = 'red'
boxEl.style.fontSize = '24px'
## 10.15 元素的 style 属性
data-age = '19'
boxEl.dataset.age
插入一个元素
早期使用 document.write 方法写入
后期
// 真实地创建一个 DOM 对象
var h2El = document.createElement("h2")
h2El.textContent = '我是标题'
// 将元素加入boxboxEl
boxEl.append(h2El)
clientWidth:contentWith+padding(不包含滚动条)内容的宽度加上 padding
clientHeight:contentHeight+padding
clientTop:border-top的宽度
clientLeft:border-left的宽度
offsetWidth:元素完整的宽度
offsetHeight:元素完整的高度
offsetLeft:距离父元素的x
offsetHeight:距离父元素的y
scrollHeight:整个可滚动的区域高度
scrollTop:滚动部分的高度
scrollBy(0,100)
<body>
<ul class="list">
</ul>
<script>
var ulEl = document.querySelector('.list')
var isFlag = true
while (isFlag) {
var message = prompt('请输入待处理事件')
if (!message) {
isFlag = false
} else {
var liEl = document.createElement('li')
liEl.textContent = message
ulEl.append(liEl)
}
}
</script>
</body>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.countdown {
color: red;
font-size: 40px;
}
.countdown .time {
background-color: rgb(187, 119, 31);
color: azure;
display: inline-block;
padding: 50px;
border-radius: 3px;
}
</style>
</head>
<body>
<div class="countdown">
<span class="time hour">03</span>
<span class="split">:</span>
<span class="time minute">03</span>
<span class="split">:</span>
<span class="time second">03</span>
</div>
<script>
// 1. 获取元素
var hourElement = document.querySelector('.hour')
var minuteElement = document.querySelector('.minute')
var secondElement = document.querySelector('.second')
setInterval(function(){
// 2. 获取倒计时的时间
var nowDate = new Date()
var endDate = new Date()
endDate.setHours(24)
endDate.setMinutes(24)
endDate.setSeconds(24)
endDate.setMilliseconds(24)
// 间隔时间
var interValTime = Math.floor((endDate.getTime() - nowDate.getTime()) / 1000)
// 秒 ==》 小时 分钟 秒钟 按照六十进制
var hour = Math.floor(interValTime / 3600)
var minute = Math.floor((interValTime / 60) % 60)
var second = interValTime % 60
// 3. 设置内容
hourElement.textContent = padLeft(hour)
minuteElement.textContent = padLeft(minute)
secondElement.textContent = padLeft(second)
},1000)
function padLeft(content, count, padStr) {
count = count | 2
padStr = padStr | '0'
content = String(content)
return content.padStart(count, padStr)
}
</script>
</body>
</html>
## 11.3 事件对象
## 11.4 event 常见的属性和方法
常见的属性
常见的方法
var aEl = document.querySelector("a")
aEl.onclick = function(event){
event.preventDefault()
}
currentTarget
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.active {
color: red;
font-size: 20px;
}
</style>
</head>
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>0</li>
</ul>
<script>
// 1.每一个li都监听自己的点击,并且有自己的处理函数
var liEls = document.querySelectorAll("li")
for (const liEl of liEls) {
liEl.onclick = function (event) {
event.currentTarget.classList.add('active')
console.log("点击li");
}
}
// 2. 统一在ul中进行监听
var ulEl = document.querySelector("ul")
ulEl.onclick = function (event) {
event.target.classList.add('active')
console.log("点击li");
}
// 3. 点击li变成active,其他取消active
var ulEl = document.querySelector("ul")
// 3.1 变量记录的方式
var activeLiEl = null
ulEl.onclick = function (event) {
// 边界判断
if (activeLiEl && event.target !== ulEl) {
activeLiEl.classList.remove("active")
}
// 3.2 给点击的元素添加active
if (event.target !== ulEl) {
event.target.classList.add('active')
}
console.log("点击li");
// 3.3 记录最新的active对应的li
activeLiEl = event.target
}
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div class="box">
<button data-action="remove">移除</button>
<button data-action="new">新建</button>
<button data-action="search">搜索</button>
</div>
<script>
var boxEl = document.querySelector(".box")
boxEl.onclick = function (event) {
var btnEl = event.target
var action = btnEl.dataset.action
switch (action) {
case "remove":
console.log("click remove");
break
case "new":
console.log("click new");
break
case "search":
console.log("click search");
break
}
}
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box {
display: flex;
width: 300px;
height: 300px;
background-color: aquamarine;
}
button {
flex: 1;
height: 40px;
}
</style>
</head>
<body>
<div class="box">
<button>删除</button>
<button>新增</button>
<button>搜索</button>
</div>
<script>
// 方案一:监听的本身就是button元素
// var btnEls = document.querySelectorAll('button')
// for (var i = 0; i < btnEls.length; i++) {
// btnEls[i].onmouseenter = function (event) {
// console.log(event.target.textContent);
// }
// }
// 方案二:事件委托(只给父元素绑定一个元素)
var boxEl = document.querySelector(".box")
boxEl.onmouseover = function (event) {
if (event.target.tagName === 'BUTTON')
console.log(event.target.textContent);
}
</script>
</body>
</html>
onkeydown :某个键盘按键被按下,down事件先发生
onkeypress :某个键盘按键被按下,press 发生在文本被输入
onkeyup :某个键盘按键被松开,up发生在文本输入完成
可以通过 key 和 code 来区分按下的键
“KeyA”,“ArrowLeft” 等),特定于键盘上按键的物理位置,不区分大小写
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<input type="text">
<button>button</button>
</body>
<script>
const btnEl = document.querySelector('button')
const inputEl = document.querySelector('input')
btnEl.onclick = function () {
console.log("sousuo");
}
btnEl.onkeyup = function (event) {
if (event.code == 'Enter') {
console.log("search");
}
}
// 按下s,搜索自动获取焦点
document.onkeyup = function (event) {
console.log("document键盘事件", event.key, event.code);
if (event.code === 'KeyS') {
inputEl.focus()
}
}
</script>
</html>
onchange 该事件在表单元素的内容改变时触发( <input>, , , 和 )
oninput :元素获取用户输入时触发
onfocus :元素获取焦点时触发
onblur :元素失去焦点时触发
onreset :表单重置时触发
onsubmit :表单提交时触发
// 完整的URL
console.log(location.href);
// 获取URL信息
console.log(location.hostname);
console.log(location.host);
console.log(location.protocol);
console.log(location.pathname);
console.log(location.search);
console.log(location.hash);
是一种非常重要的数据格式,并不是编程语言,可以在服务器和客户端之间传递
全称是 JavaScript Object Notation( js 对象符号)
一种轻量级资料交换格式,算是 js 的一个子集
目前已经独立于编程呢个语言,可以在各个编程语言中使用
在 js 中可以直接使用
其他数据交换格式,使用什么数据格式是一种架构
应用场景
希望将一个对象保存在 localStorage 中,如果直接将对象塞到里面去只能看到 object
需要进行序列化JSON.stringify():将 obj 对象转成字符串再塞进来
JSON.stringify(obj,function(key,value){if(key==="lili" return "miao")})
需要进行反序列化JSON.parse():将字符串转成 obj 对象拿到结果
JSON.parse(item,function(key,value){if(key==="age")return value+2})
var obj = {
name: "lili",
age: 99
}
// 1. 将 obj 对象进行序列化
var objJSONString = JSON.stringify(obj)
// 2. 将对象存储到LocalStorage
localStorage.setItem("info", objJSONString)
console.log(localStorage.getItem("info"));
var item = localStorage.getItem("info")
// 3. 将字符串转回对象(反序列化)
var newObj = JSON.parse(item)