alert() --- 警示框
prompt() --- 浏览器弹出输出框,用户可以输入信息
console.log() --- 控制台输出
document.write() --- 在文档页面输出(识别标签)
alert('你好, js');
prompt('JavaScript 基础');
console.log('它~会魔法吧~');
document.write('javascript我来');
// 声明变量
// 声明变量不赋值
let a
// 变量的初始化 --- 声明变量并赋值
let age = 18
// 声明多个变量(用逗号隔开)--- 不推荐
let a = 18, b = 'pink'
// 更新变量
let age = 18
age = 19
console.log(age) // 19
// 用变量赋值
let myFood = '香蕉'
let youFood = myFood
console.log(youFood) // 香蕉
const num = 10;
num = 10;
console.log(num); // 报错 - 常量不允许重新赋值
number
— 数字型string
— 字符串型boolean
— 布尔型undefined
— 未定义型null
— 空类型symbol
(了解)bigint
object
— 对象function
– 函数array
— 数组Number
一切十进制表示的数字Number.MAX_VALUE // 数字中的最大值
Number.MIN_VALUE // 数字中的最小值
Infinity // 无穷大
-Infinity // 无穷小
NaN // 非数值
isNaN(数据) 这个方法用来判定非数字,并且返回一个值,如果是数字返回 false,如果不是数字返回 true
+ `NaN` 代表一个计算错误,它是一个不正确的或者一个未定义的数学操作所得到的结果 + ⚠ **`NaN` 是 粘性 的。任何对 `NaN` 的操作都会返回 `NaN`**
console.log(2 - NaN) // NaN
console.log('粘性' + NaN) // NaN
console.log(NaN === NaN) // NaN
lengtn 属性
let strMsg = (`扶我起来,我还能干!`)
console.log(strMsg.length) // 显示 10
let myName = `邵秋华`
let age = 22
let str = `扶我起来,我还能干!`
document.write(`我叫${myName},今年${age}岁了,我的座右铭是${str}`)
true = 1
,false = 0
0
、 ''
、 undefined
、 null
、 NaN
、false
转换为布尔值后为 假,其余都为真undefined
undefined
这里本该有一个值,但是没有,就是 undefined
数字 + undefined = NaN
console.log(undefind + 1) // NaN
condsole.log(undefined + 'purple') // undefinedpurple
console.log(typeof(undefined)) //undefined
null = 0
console.log(null + 1) // 1
console.log(null + 'purple') // nullpurple
console.log(typeof(null)) // object
let num
console.log(undefined + 1) // NaN
let num = null
console.log(null + 1) // 1
null
和 undefined
值相等,数据类型不相等console.log(null == undefined) // true
typeof 数据
typeof(数据)
(推荐使用)
let num = 10;
console.log(typeof num); // number
let str = 'purple';
console.log(typeof str); //string
let flag = true;
console.log(typeof flag); //boolean
let i = undefined;
console.log(typeof i); //undefined
let timer = null;
console.log(typeof timer); //object
// 注意
console.log(typeof (a)); // undefined
instanceof
prototype
属性是否出现在某个实例对象的原型链上。Object.prototype.toString()
toString()
来获取每个对象的类型。为了每个对象都能通过 Object.prototype.toString()
的检测,需要以 Function.prototype.call()
或 Function.prototype.apply()
的形式来调用,传递要检查的对象作为第一个参数。// 引用数据类型
const obj = {uname: '迪迦', age: 22};
console.log(Object.prototype.toString.call(obj)); // [object Object]
const arr = [1, 2, 3];
console.log(Object.prototype.toString.call(arr)); // [object Array]
const fn = function () { console.log(1) };
console.log(Object.prototype.toString.call(fn)); // [object Function]
// 基本数据类型
console.log(Object.prototype.toString.call(123)); // [object Number]
console.log(Object.prototype.toString.call('123')); // [object String]
console.log(Object.prototype.toString.call(false) ); // [object Boolean]
console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
console.log(Object.prototype.toString.call(null)); // [object Null]
parseInt(string)
可以把 字符串型 转换为 整数型(不识别小数点)
console.log(parseInt('3.14')) //3(取整数位)
console.log(parseInt('3.99')) //3(取整数位)
console.log(parseInt('120px')) //120 (自动去除单位,前面必须是数字)
console.log((parseInt'rem120px')) //NaN
console.log(parseInt(true)) //NaN
console.log(parseInt(null)); // NaN
parseFloat(string)
可以把 字符串型 转换为 浮点型(识别小数点)
console.log(parseFloat('3.14')); //3.14
console.log(parseFloat('3.99')); //3.99
console.log(parseFloat('120px')); //120 (自动去除单位,前面必须是数字)
console.log(parseFloat('rem120px')); //NaN
console.log(parseFloat(true)) //NaN
console.log(parseFloat(null)); // NaN
parseInt 和 parseFloat 单词的大小写
Number(string)
强制转换
let num = '123';
console.log(Number(num)); //123
console.log(Number('12')); //12
console.log(NUmber('123.123'); // 123.123
console.log(Number('123abc'); //NaN
console.log(Number(null)); // 0
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log('12' - 0); //12 (先将 '12' 转换成数字型在进行减)
console.log('123' - '120'); //3
console.lof('123' * 1); //123
console.log(+'123') //123
+ 号作为正号解析可以转换成数字型(单用)
let year = prompt('请输入您的出生年份:');
//let age = 2022 - year;
alert('您今年:' + (2022 - year) + '岁了');
let num1 = prompt('请输入第一个数据:'); //得到的num1是字符型的
let num2 = prompt('请输入第二个数据:'); //得到的num2是字符型的
let result = parseInt(num1) + parseInt(num2);
alert(parseInt(num1) + '+' + parseInt(num2) + '=' + result);
/*
let num1 = +prompt('请输入第一个数据:');
let num2 = +prompt('请输入第二个数据:');
let result = num1 + parseInt(num2);
*/
parseInt(null); // NaN
parseFloat(null); // NaN
Number(null); // 0
null == undefined // true 值都是空
null === undefined // false 数据类型不一样
console.log(String(123)) // '123'
let num = 123
console.log(num.toString()) // '123'
console.log(123 + '') // '123'
toString() 和 String() 使用方式不一样。
三种转换方式,我们更喜欢用第三种加号拼接字符串转换方式, 这一种方式也称之为隐式转换。
console.log(Boolean('')) // false
console.log(Boolean(0)) // false
console.log(Boolean(NaN)) // false
console.log(Boolean(null)) // false
console.log(Boolean(undefined)) // false
console.log(Boolean(false)) // false
注意:
// 两个等号值比较 值
// null 和 undefined 都是空
console.log(null == undefined) // true
let num = 10;
alert(++num + 10); // 21
let num = 10;
alert(10 + num++); // 20
先自减,后运算(先已后人)
let num = 10;
alert(--num + 10); // 19
先原值运算,后自减(先人后己)
let num = 10;
alert(10 + num--); // 20
let a = 10;
++a; // ++a = 11 a = 11
let b = ++a + 2; // a = 12 ++a = 12
console.log(b); // 14
let c = 10;
c++; // c++ = 11 c = 11
let d = c++ + 2; // c++ = 11 c = 12
console.log(d); // 13
let e = 10;
let f = e++ + ++e;
// e++ = 10 e = 11
// e = 12 ++e = 12
console.log(f); // 22
console.log(2 == '2') // true
表达式1 && 表达式2
如果 表达式1的值 为 真,则返回 表达式2
如果 表达式1的值 为 假,则返回 表达式1 (后面的表达式不再执行)
两侧都为真,返回第二个
表达式1 || 表达式2
如果 表达式1的值 为 真,则返回 表达式1 (后面的表达式不再执行)
如果 表达式1的值 为 假,则返回 表达式2
两侧都为真返回第一个
console.log( 4 >= 6 || '人' != '阿凡达' && !(12 * 2 == 144) && true) // true
let num = 10
console.log( 5 == num / 2 && (2 + 2 * num).toString() === ‘22’) // true
let a = 3 > 5 && 2 < 7 && 3 == 4
console.log(a) // false
let b = 3 <= 4 || 3 > 1 || 3 != 2
console.log(b) // true
let c = 2 === "2"
console.log(c) // false
let d = !c || b && a
console.log(d) // true
条件为 true 的时候,大括号里面的代码才会执行
小括号里的结果若不是布尔类型时,会发生隐式转换转为布尔类型
⚠ if分支语句,如果前面的条件被满足,后面的代码就不执行了
if (条件) {
满足条件要执行的代码
}
if (条件) {
满足条件要执行的代码
} else {
条件不满足时要执行的代码
}
eg:
// 能被4整除但不能被100整除,或者被400整除的年份是闰年,否则都是平年
let year = +prompt('请输入年份:')
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
alert(`&{year}是闰年`)
} else {
alert(`&{year}是平年`)
}
if (条件表达式1) {
满足条件1要执行的代码
} else if (条件表达式2) {
满足条件2要执行的代码
} else if (条件表达式n) {
满足条件n要执行的代码
} else {
所有条件都不满足时要执行的代码
}
条件表达式 ? 表达式1 : 表达式2
let time = prompt('请您输入一个 0 ~ 59 之间的一个数字')
// 三元表达式 表达式 ? 表达式1 :表达式2
let result = time < 10 ? '0' + time : time // 把返回值赋值给一个变量
alert(result)
/* 如果输入的数字小于10,就在该数字前面加一个0,否则原样输出该数字 */
let num = prompt('请输入数字:')
let result = num < 10 ? '0' + num : num
alert(result)
switch ( 表达式 ) {
case value1:
满足value1执行的代码
break
case value2:
满足value2执行的代码
break
default:
所有条件都不满足时要执行的代码
}
let num1 = +prompt('请输入第一个数字:')
let sp = prompt('请输入 + - / * 其中一个:')
let num2 = +prompt('请输入第二个数字:')
switch (sp) {
case '+':
let add = num1 + num2
alert(`${num1} + ${num2} = ${add}`)
break
case '-':
let dif = num1 - num2
alert(`${num1} - ${num2} = ${dif}`)
break
case '*':
let bus = num1 * num2
alert(`${num1} x ${num2} = ${bus}`)
break
case '/':
let pro = num1 / num2
alert(`${num1} ÷ ${num2} = ${pro}`)
break
default:
alert('请输入正确的运算符')
break
}
for (初始化变量; 条件表达式; 操作表达式) {
循环体
}
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
body>
<script>
// 求1-100之间所有数字的和
let sum = 0;
let average = 0;
for (let i = 1; i<= 100; i++) {
sum += i
}
average = sum / 100;
console.log('1-100之间所有数字的和为:' + average);
// 求1-100之间所有偶数的和和奇数的和
let even = 0;
let odd = 0;
for (i = 1; i <= 100; i++) {
// 第一种
if (i % 2 == 0) {
even = even + i;
} else {
odd += i;
}
//第二种
if (i % 2 == 0) {
even = even + i;
}
odd = sum - even;
}
console.log('1-100之间所有偶数的和为:' + even + '\n' + '1-100之间所有奇数的和为:' + odd);
// 求1-100之间所有能被3整除的数字的和
let odd_num = 0;
for (let i = 1; i <= 100; i++) {
if (i % 3 == 0) {
odd_num = odd_num + i;
}
}
console.log('1-100之间所有能被3整除的数字的和为:' + odd_num);
//弹出输入框,输入一共有n个学生,然后弹出n个输入框,输入每个学生的成绩,最后输出总成绩和平均成绩
let frequency = prompt('请输入有多少个学生:');
let score = 0;
for (let i = 1; i <= frequency; i++) {
let a = prompt('请输入第' + i + '个同学的成绩:');
// 从 prompt 获取到的数据是 String 类型的,不能直接和数字进行相加
score = score + parseFloat(a);
}
alert('该班总成绩是:' + score);
alert('该班平均成绩是:' + (score / frequency));
//一行打印五个星星
let str = ' ';
for (let i = 1; i <=5; i++) {
str = str + '⭐';
}
console.log(str);
script>
html>
//打印n行m列的星星
let rows = +prompt('请输入需要打印几行的星星:');
let cols = +prompt('请输入需要打印几列的星星:');
let str = '';
for (let i = 1; i <=rows; i++) {
for (let j = 1; j <= cols; j++) {
str += '⭐';
}
str += '\n';
}
console.log(str);
// 外层for循环:控制已经排序好的元素的个数
// 内层for循环:控制每排序好一个元素需要比较几次
const arr = [1, 7, 3, 9, 5, 2, 6, 4, 8];
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
let temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
console.log(arr);
let n = 1
while ( 循环条件 ) {
重复执行的代码
n++
}
JS标记语法
here:
for (let i = 1; i <= 5; i++) {
for (let j = 1; j <= 3; j++) {
if (i === 3 && j === 2) {
console.log('看到半条虫子')
break here
}
console.log('吃的第 ' + i + ' 个包子得第 ' + j + ' 口')
}
console.log('=================')
}
let 数组名 = [数据1, 数据2, …, 数据n]
let arr = ['name', 'Jack', 'age', 20, 'gender', '男']
//没有参数表示空数组
let arr = new Array()
//一个参数表示数组的长度
let arr = new Array(100)
//多个参数表示都是数组里面的数据,没有表示长度的参数
let arr = new Array(10, 20, 30)
arr.length = 2 //删除最后一个
arr.length = 5 //后面的两个用空补齐
console.log(arr[2]) //读取里面的额第三个数据
能够获取数组里面的每个元素
for (let i = 0; i < 数组名.length; i++) {
// 执行的操作
// console.log(数组名[i])
}
数组.forEach(function (item, index, arr) { } )
-> item :数组里面的每一项
-> index :数组里面每一项的索引
-> arr : 原始数组
try {
[1, 2, 0, 3].forEach(item => {
console.log(item)
if (item === 1) {
console.log(item)
throw Error()
}
})
} catch (error) {
console.log('终止循环')
}
// 打印结果
// 1
// 1
// z
for (let item of arr) {
console.log(item) // item -> 数据里面的每一项
}
<script>
let arr = ['pink', 'red'];
// 增加
// 方案一:数组.push()方法
语法:arr.push(元素1, 元素2, …, 元素n);
追加数组 的同时 有一个 返回值 是 追加以后 的 数组长度
console.log(arr.push('green', 'hotpink', 'deeppink')); // 5
console.log(arr);
// ['pink', 'red', 'green', 'hotpink', 'deeppink']
// 方案二:数组.unshift()方法
语法:arr.unshift(元素1, 元素2, …, 元素n);
console.log(arr.push('green', 'hotpink', 'deeppink')); // 5
console.log(arr);
// ['green', 'hotpink', 'deeppink', 'pink', 'red']
// 删除
// 方案一:数组.pop()
console.log(arr.pop()); // green
// 方案二:数组.shift()
console.log(arr.shift()); // red
// 方案三:数组.splice(起始位置的索引, 删除几个元素)
// 从索引号0的位置开始,删除两个元素
console.log(arr.splice(0, 2)); // ['hotpink', 'deeppink']
// 查询 --- 利用数组的索引进行查找
console.log(arr[0]); // pink
// 修改 --- 利用 对数组进行遍历,然后和字符串拼接,重新赋值给数组里的元素
// 方案一:
arr[0] = 'blue';
arr[1] = 'purple';
//方案二:
for (let i = 0; i < arr.length; i++) {
arr[i] += '老师';
}
console.log(arr)
</script>
can --- 判断是否可执行某个动作
has --- 判断是否含义有某个值
is --- 判断是否为某个值
get --- 获取某个值
set --- 设置某个值
load --- 加载某些数据
function 函数名() {
函数体
}
let 函数名 = function () {
// 函数体
}
!(function (实参) { 函数体 })(实参);
!(function (实参) { 函数体 } (实参));
function getSum() {
let sum = 0
for (let i = 1; i <= 100; i++) {
sum += sum
}
document.write(sum)
}
函数名()
function getSum() {
let sum = 0
for (let i = 1; i <= 100; i++) {
sum += sum
}
document.write(sum)
}
getSum() // sum = 5050
function 函数名(参数列表) {
函数体
}
function getSum(start, end) {
// 形参 - 形式上的参数
let sum = 0
for (let i = start; i <= end; i++) {
sum += sum
}
document.write(sum)
}
函数名(传递的参数列表)
getSum(10, 20) // sum = 33
// 实参 - 实际的参数
function getSum(x = 0, y = 0) {
// 小括号里写了就不用写
// 推荐用逻辑中断
// x = x || 0
// y = y || 0
document.write(x + y)
}
getSum() // 0
getSum(1, 2) // 3
return 要返回的数据
function fn() {
return 20 // 把 结果(20) 返回给 fn
}
fn() // 相当于执行了 fn() = 20 (fn()是函数的调用者)
console.log(fn()) // 20
// 求两个数的最大值
function getMax(x = 0, y = 0) {
return x > y ? x : y
}
getMax(65, 99) // 99
let max = getMax(65, 99)
console.log(max)
// 声明一个 getArrValue函数
function getArrValue(arr = []) {
let max = arr[0]
let min = arr[0]
//遍历数组
for (let i = 0; i < arr.length; i++) {
// 最大值
if (max < arr[i]) {
max = arr[i]
}
// 最小值
if (min > arr[i]) {
min = arr[i]
}
}
// return 返回多个值写法
return [max, min]
}
let newArrr = getArrValue([23, 56, 32, 198, 0, 5, -98])
console.log(`数组中的最大值是:&{newArr[0]}`) // 198
console.log(`数组中的最小值是:&{newArr[1]}`) // -98
function getTime(t = 0) {
let second = parseInt(t % 60)
let minute = parseInt(t / 60 % 60)
let hour = parseInt(t / 60 / 60 % 24)
// if条件分支语句
/* if (second < 10) {
second = '0' + second
}
if (minute < 10) {
minute = '0' + minute
}
if (hour < 10) {
hour = '0' + hour
} */
// 三元表达式
second < 10 ? second = '0' + second : second
minute < 10 ? minute = '0' + minute : minute
hour < 10 ? hour = '0' + hour : hour
return `${t}秒 = ${hour}小时${minute}分钟${second}秒`
}
let str = getTime(+prompt('请输入秒数:')) // 1000
document.write(str) // 1000秒 = 00小时16分钟40秒
作用域: 变量的 可用性范围 就是 作用域 (提高程序逻辑的局部性)
function fn() {
num = 10 // 全局变量来看
}
fn()
console.log(num) // 10
function fun(x, y) {
// 形参可以看做是函数的局部变量
console.log(x) // 1
}
fun(1, 2)
console.log(x) // x is not defined (报错)
代码展示:
functin f1 () {
let num = 123
function f2 () {
console.log(num) // 123
}
f2()
}
let num = 456
f1()
function f1() {
let num = 123
function f2() {
let num = 0
console.log(num) // 0
}
f2()
}
let num = 456
f1()
let a = 1
function fn1() {
let a = 2
let b = '22'
function fn2() {
let a = 3
fn3()
function f3() {
let a = 4
console.log(a) // a的值 = 4
console.log(b) // b的值 = '22'
}
}
}
fn1()
let 变量名 = function () {
// 函数体
}
let fn = function () {
console.log('我是函数表达式')
}
fn() // 我是函数表达式
// 写法一:
(函数)();
// 写法二:
(函数 ());
(function () {
console.log('立即执行函数')
})();
// 保存之后会在控制台立即打印 '立即执行函数'
// 第一种写法:
(function () {
console.log('立即执行函数第一种写法');
})();
(function (x, y) { // (x, y) ---> 形参
console.log(x, y); // x = 5; y = 9
})(5, 9); // (5, 9) ---> 实参
// 第二种写法:
(function () {
console.log('立即执行函数第二种写法');
} ());
(function (x, y) { // (x, y) ---> 形参
console.log(x, y); // x = 5, y = 9
} (5, 9)); // (5, 9) ---> 实参
function fn(x = 0, y = 0) {
x = x
y = y
console.log(x, y)
}
fn(1, 2) // x = 1, y = 2
fn() // x = 0, y = 0
function fn(x, y) {
x = x || 0
y = y || 0
console.log(x, y)
}
fn(1, 2) // x = 1, y = 2
fn() // x = 0, y = 0
let obj = {} // 声明了一个obj的对象
let obj = new Object();
let 对象名 = {
属性名: 属性值,
方法名: 函数
}
eg:
let obj = {
uname: 'pink老师',
age : 18,
gender: '男'
}
console.log(obj)
// {uname: 'pink老师', age: 18, gender: '男'}
console.log(obj.uname) // pink老师
console.log(obj['uname']) // pink老师
obj.gender = '女'
console.log(obj.gender) // 女
obj.address = '武汉黑马'
console.log(obj) // {uname: 'pink老师', age: 18, gender: '女', address: '武汉黑马'}
console.log(obj.address) // 武汉黑马
delete obj.address
console.log(obj) // {uname: 'pink老师', age: 18, gender: '女'}
let obj = {
uname: '刘德华',
// 方法
song: function () {
console.log('冰雨')
},
getSum: function (x, y ) {
x = x || 0
y = y || 0
console.log(x + y)
}
}
// 方法调用 对象名.方法名()
obj.song() // 冰雨
obj.getSum(2, 5) // 7
for (let k in obj) {
console.log(obj[k])
}
属性/方法 in 对象名
let obj = {
uname: 'jack',
age: 18,
gender: '男',
score: 100
};
console.log('name' in obj); // true
//声明一个 obj 对象
let obj = {
uname: 'pink老师',
age: 18,
gender: '男'
}
// 用 fou in 循环遍历对象
for (let k in obj) {
// k 可以是任何变量,选择 k/key 是因为许多程序员都在使用
// console.log(k)
// k 是字符串型的,带有引号
// k => 'uname' 'age' 'gender'
// obj 对象里面没有 'uname'、 'age'、 'gender' 的属性名 ------ 有引号
// obj 对象里面的属性名是 uname、 age、 gender ------ 没有引号
// 查询对象里面的属性有两种方法:1)对象名.属性名
// 2)对象名['属性名']
// 原因:obj[k] === obj['uname'] === obj.uname
// obj[k] === obj['age'] === obj.age
// obj[k] === obj['gender'] === obj.gender
// 所以,利用for in循环遍历对象采用第二种查询方法
// 结论:k 是获得对象的属性名 , 对象名[k] 是获得 属性值
console.log(obj[k]) // 'pink老师'(string) 18(number) '男'(string)
}
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
table {
width: 600px;
text-align: center;
}
table,
th,
td {
border: 1px solid #ccc;
border-collapse: collapse;
}
caption {
font-size: 18px;
margin-bottom: 10px;
font-weight: 700;
}
tr {
height: 40px;
cursor: pointer;
}
table tr:nth-child(1) {
background-color: #ddd;
}
table tr:not(:first-child):hover {
background-color: #eee;
}
style>
head>
<body>
<h2>学生信息h2>
<p>将数据渲染到页面中...p>
<table>
<caption>学生列表caption>
<tr>
<th>序号th>
<th>姓名th>
<th>年龄th>
<th>性别th>
<th>家乡th>
tr>
<script>
// 1.数据准备
let students = [
{ name: '小明', age: 18, gender: '男', hometown: '河北省' },
{ name: '小红', age: 19, gender: '女', hometown: '河南省' },
{ name: '小刚', age: 17, gender: '男', hometown: '山西省' },
{ name: '小丽', age: 18, gender: '女', hometown: '山东省' }
]
// 2.开始渲染页面
for (let i = 0; i < students.length; i++) {
document.write(`
${i + 1}
${students[i].name}
${students[i].age}
${students[i].gender}
${students[i].hometown}
`)
}
script>
table>
body>
html>
let num = Math.floor(Math.random() * (10 + 1))
let num = Math.floor((Math.random() * (5 + 1)) + 5
let num = Math.floor(Math.random() * (M - N + 1)) + N
function getRandom (N, M) {
// return Math.floor(Math.random() * (M - N + 1)) + N;
return parseInt(Math.random() * (M - N + 1)) + N;
}
Math.floor(Math.random() * arr.length)
console.log(Math.ceil(1.1)) // 2
console.log(Math.ceil(1.01)) // 2
console.log(Math.floor(1.9)) // 1
console.log(Math.floor(1.99)) // 1
console.log(Math.max(0.1, 1, 65, 23, 88)) // 88
console.log(Math.min(99, 65, 3, 0.1, -99)) // -99
console.log(Math.abs(-100)) // 100
console.log(Math.round(2.45)) // 2
console.log(Math.round(2.5)) // 3
console.log(Math.round(-20.5)) // -20
console.log(Math.round(-20.51)) // -21
const实际上指的并不是变量的值不得改动,
其实说的是变量指向的那个内存空间中保存的数据不得改变
简单数据类型是将值保存在栈中,所以用const声明简单数据类型时,值不得改变,相当于常量
而复杂数据类型是将引用地址保存在栈中,具体的值保存在堆中
那么用const声明复杂数据类型时,比如对象,数组时,只能保证的是这个地址是固定不变的
堆中保存的数据是不是可变的,就无法保证了
console.dir(对象);
document.querySelector('css选择器')
const li = document.querySelector('ul li')
document.querySelectorAll('css选择器')
const lis = document.querySelectorAll('li') //NodeList[li, li, li]
document.documentElement --- html
document.body --- body
document.head --- head
document.title --- title
document.getElementById('id名称')
document.getElementsByTagName('标签名称')
document.getElementsByClassName('类名')
innerHTML += '要添加的文本'
<div class="box"> 天地不仁以万物为刍狗!!! </div>
<strong>
const box = document.querySelector('.box')
// 对象.innerText 属性
box.innerText = '扶我起来,我还能干!!!'
box.innerText = '扶我起来,我还能干!!!'
// 对象.innerHTML 属性
box.innerHTML = '扶我起来,我还能干!!!'
box.innerHTML = '扶我起来,我还能干!!!'
</strong>
<body>
<div>
123
<p>456
<span>789</span>
</p>
</div>
<script>
console.log(document.querySelector('div').innerText);
console.log(document.querySelector('div').innerHTML);
</script>
</body>
<img src="./images/1.webp" alt="">
//随机数函数
function getRandom(N, M) {
return Math.floor(Math.random() * (M- N + 1)) + N
}
//获取图片对象
//img在html中是标签,在js中是对象
const pic = document.querySelector('img')
// 修改对象的属性值
pic.src = `./images/${getRandom(1, 6) }.webp`
// 获取对象(元素)
const box = document.querySelector('div')
// 修改样式属性 对象.style.样式属性 = '值'
box.style.width = '400px'
box.style.height = '100px'
box.style.backgroundColor = 'red'
box.style['background-color'] = 'green'
<style>
div {
width: 200px;
height: 200px;
background-color: pink;
}
.active {
width: 300px;
height: 300px;
background-color: hotpink;
margin-left: 100px;
}
style>
<body>
<div class="one">div>
<script>
// 1.获取元素
// let box = document.querySelector('css选择器')
let box = document.querySelector('div')
// 2 给div添加类名 class 是个关键字,选用className替代它
// 新值换旧值,会覆盖原来的类名
box.className = 'active'
// 用旧类名+新类名的形式覆盖原来的类名
box.className = 'one active'
script>
body>
// 获取对象
const box = document.querySelector('.one')
// 追加类名
box.classList.add('two')
box.classList.add('three')
// 删除类名
box.classList.remove('three')
// 切换类名
// 如果有这个类名就是删除,没有就是追加
box.classList.toggle('ab')
box.classList.toggle('one')
// 替换类名
// 将 旧类名box 替换成 新类名box1
box.classList.replace('box', 'box1')
// 判断是否包含指定的类名
console.log(box.classList.contains('box')) // true
const input = document.querySelector('.computer')
console.log(input.value)
input.value = '扶我起来,我还能干!!!'
<input type="checkbox" value="" name="">
const input = document.querySelector('.computer')
input.checked = true // 让复选框选中
input.checked = false // 让复选框不选中
input.disable = true // 禁用吗? - 禁用(true)
input.disable = false // 禁用吗? - 不禁用(false默认值)
<div data-id="1" data-spm="不知道">1div>
<div data-id="2">2div>
<div data-id="3">3div>
<div data-id="4">4div>
<div data-id="5">5div>
<script>
// 获取元素
const one = document.querySelector('div')
// one是一个HtmlElement对象
console.log(one)
// dataset是一个对象集合
console.log(one.dataset)
// 获取dataset对象里面的id属性
console.log(one.dataset.id)
// 获取dataset对象里面的spm属性
console.log(one.dataset.spm)
script>
DOM对象.getAttribute(瞎定义属性名)
匿名函数:setInterval(函数, 间隔时间) // Interval - 间隔,间隙
具名函数:setInterval(函数名, 间隔时间)
// 匿名函数
setInterval(() => {
console.log('扶我起来,我还能干!!!')
}, 1000)
// 具名函数
function fn() {
console.log('扶我起来,我还能干!!!')
}
setInterval(fn, 1000)
// fn() --- 执行这个函数,只执行一次 (fn()调用这个函数)
// fn --- 每隔一段时间,回头去找fn这个函数(自动调用),再执行(fn是一个变量,代表这个函数)
// 定时器的返回值,是数字型,是id
// 声明一个变量,接收定时器的返回值
let n = setInterval(() => {
console.log(1)
}, 1000)
console.log(n) // 1
function fn() {
console.log('扶我起来,我还能干!!!')
}
let m = setInterval(fn, 1000)
console.log(m) // 2
// 匿名函数
let 变量名 = setInterval(函数, 时间间隔)
// 具名函数
let 变量名 = setInterval(函数名, 时间间隔)
clearInterval(变量)
// 匿名函数
let n = setInterval(() => {
console.log(11)
}, 1000)
// 具名函数
function fn() {
console.log('扶我起来,我还能干!!!')
}
let m = setInterval(fn, 1000)
// 关闭定时器
clearInterval(n)
clearInterval(m)
元素对象.addEventListener('事件类型', 要执行的函数)
// 获取元素
const btn = document.querySelector('button')
// 事件监听-点击事件
btn.addEventListener('click', () => {
alert('扶我起来,我还能干!!!')
})
element.addEventListener('事件类型', function (e) {})
元素.addEventListener('click', function (e) {
console.log(e.key)
console.log(e.type)
})
DOM.addEventListener(事件类型, 事件处理函数[, 是否使用捕获机制 = false])
const fa = document.querySelector('.father')
const son = document.querySelector('.son')
document.addEventListener('click', function () {
alert('我是爷爷')
})
fa.addEventListener('click', function () {
alert('我是爸爸')
})
son.addEventListener('click', function () {
alert('我是儿子')
})
// 事件冒泡:从子到父
// 弹出框的顺序依次是:儿子 -> 我是爸爸 -> 我是爷爷
事件对象.stopPropagation() // 方法 停止传播 sp(快捷)
e.stopPropagation()
// 事件对象 - 回调函数的第一个参数
const fa = document.querySelector('.father')
const son = document.querySelector('.son')
document.addEventListener('click', function () {
alert('我是爷爷')
})
fa.addEventListener('click', function () {
alert('我是爸爸')
})
son.addEventListener('click', function (e) {
alert('我是儿子')
// 阻止流动传播(阻止事件冒泡)
// 在这一块卡住,不允许向上传播
e.stopPropagation()
})
// 弹出框:我是儿子
e.preventDefault() // 方法 阻止默认 pd(快捷)
// 阻止 链接跳转
// 阻止 表单提交(缺点:提交数据页面h)
<body>
<form action="http://www.itcast.cn">
<input type="submit" value="免费注册">
form>
<a href="http://www.baidu.com">百度一下a>
<script>
// 获取元素
const a = document.querySelector('a')
const form = document.querySelector('form')
// 事件侦听-a-点击事件
a.addEventListener('click', function (e) {
// 阻止a的默认行为-页面跳转
e.preventDefault()
})
// 事件侦听-form-提交事件
form.addEventListener('submit', function (e) {
// 阻止form的默认行为-表单的提交
e.preventDefault()
})
script>
body>
btn.onclick = function () {
alert('点击了')
}
// L0事件移除解绑
btn.onclick = null
语法:
removeEventListener(事件类型, 函数名[, 获取捕获或冒泡阶段])
代码展示:
<script>
// 获取元素
const btn = document.querySelector('button')
// 声明函数
let fn = function (e) {
alert(`事件解绑语法:
元素.removeEventListener(事件类型, 函数名)
匿名函数 无法进行 事件解绑 操作
${e.target.tagName}
`)
}
// 事件侦听-点击事件
btn.addEventListener('click', fn)
// 事件解绑
btn.removeEventListener('click', fn)
</script>
<body>
<ul>
<li>第1个孩子li>
<li>第2个孩子li>
<li>第3个孩子li>
<li>第4个孩子li>
<li>第5个孩子li>
<p>我不需要变色p>
ul>
<script>
// 1.点击每个小li,当前li文字变色
// 按照事件委托的方式,委托给父级,事件写到父级身上
// 获取元素
const ul = document.querySelector('ul')
// 事件绑定
ul.addEventListener('click', function (e) {
// e:事件对象
// 得到一个事件对象
// console.log(e)
// 得到被点击的元素
// console.log(e.target)
// 得到被点击元素的标签名称
// 得到的标签名称是 大写的 字符串
// console.log(e.target.tagName) // 'LI'
// 判断点击的是不是li,如果是li文字就变颜色
if (e.target.tagName === 'LI') {
e.target.style.color = 'red'
}
})
script>
body>
window.addEventListener('load', function () {
// 执行操作
})
<script>
// 给 window 添加 页面加载事件(load)
window.addEventListener('load', function () {
// 获取元素
const btn = document.querySelector('button')
// 事件侦听-点击事件
btn.addEventListener('click', function () {
alert(`
页面加载事件
给 window 添加 load 事件
window.addEventListener('load', function() {})
`)
})
})
</script>
<body>
<button>点击</button>
</body>
document.addEventListener('DOMContentLoaded', function () {
// 执行的操作
})
document.addEventListener('DOMContentLoaded', function () {
// 获取元素
const btn = document.querySelector('button')
// 事件侦听-点击事件
btn.addEventListener('click', function () {
alert(`
页面加载事件
给 document 添加 DOMContentLoaded 事件
document.addEventListener('DOMContentLoaded', function() {})
`)
})
})
/* 页面滑动 */
html {
/* 让滚动条丝滑的滑动 */
/* 滚动-行为:平滑 */
scroll-behavior: smooth;
}
document.documentElement.scrollTop // html被卷去的高度
window.pageYoffset // 页面滚出去的高度(页面在竖轴的偏移量)
document.documentElement.scrollTop === window.pageYoffset
window.addEventListener('scroll', function () {
// 执行的操作
})
document.documentElement.scrollTop = 数字
window.pageYoffset - 只读属性
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
height: 3000px;
}
div {
display: none;
margin: 100px auto;
width: 470px;
height: 150px;
border: 1px solid #000;
text-align: center;
font-size: 20px;
font-family: '隶书';
}
.active {
display: block;
position: fixed;
top: 0;
left: 50%;
transform: translateX(-50%);
margin-top: 0;
}
style>
<body>
<div>
世间的悲喜皆不如我所愿,但苦于乐皆是恩赐!!!
世间的悲喜皆不如我所愿,但苦于乐皆是恩赐!!!
世间的悲喜皆不如我所愿,但苦于乐皆是恩赐!!!
世间的悲喜皆不如我所愿,但苦于乐皆是恩赐!!!
世间的悲喜皆不如我所愿,但苦于乐皆是恩赐!!!
世间的悲喜皆不如我所愿,但苦于乐皆是恩赐!!!
div>
<script>
// 事件侦听-页面滚动事件-window
window.addEventListener('scroll', function () {
// 获取html元素
const html = document.documentElement
// 获取div元素
const div = document.querySelector('div')
// console.log(html.scrollTop); // 得到的是数字型
// scrollTop >= 300显示div并固定在可视区域顶部,小于300隐藏
if (html.scrollTop >= 300) {
div.classList.add('active')
} else {
div.classList.remove('active')
}
})
script>
body>
document.documentElement.scrollTop = 指定位置距离顶部的距离
window.scrollTo(x, y)
window.addEventListener('resize', function () {
// 执行的代码
})
window.addEventListener('resize', function () {
let w = document.documentElement.clientWidth
console.log(w)
})
const div = document.querySelector('div')
div.getBoundingClientRect()
✅ 总结
属性 | 作用 | 说明 |
---|---|---|
scrollLeft 和 scrollTop | 被 卷去 的 头部 和 左侧 | 配合 页面滚动(scroll 事件) 来用,可读写 |
clientWidth 和 clientHeight | 获得 元素 的 宽度 和 高度 | 不包含border、margin、滚动条,用于js 获取元素大小 只读属性 |
offsetWidth 和 offsetHeight | 获得 元素 的 宽度 和 高度 | 包含border、padding、滚动条等,只读属性 |
offsetLeft 和 offsetTop | 获取元素距离 自己定位父元素 的左、上距离 | 获取 元素位置 的时候使用,只读属性 |
html {
scroll-behavior: smooth;
}
if (old) old.classList.remove('active')
old && old.classList.remove('active') - 逻辑与
old?.classList.remove('active') - 可选链
document.querySelector('[data-name=new]')
自定义属性 的 属性值 可以 省略 双引号(不推荐)
const 常量名 = new Date()
const date = new Date()
console.log(date)
// Wed Aug 03 2022 20:37:52 GMT+0800 (中国标准时间)
// 周三 八月 3号 年份 时间
const 常量名 = new Date('指定的时间')
const date = new Date('2022-8-3 20:50:00')
let h = date.getHours()
console.log(h) // number
console.log(date)
console.log(typeof date) // object
// Wed Aug 03 2022 20:50:00 GMT+0800 (中国标准时间)
语法 | 作用 | 说明 |
---|---|---|
对象.getFullYear() | 获得 年份 | 获取 四位 年份 |
对象.getMonth() | 获得 月份 | 取值为 0 ~ 11 |
对象.getDate() | 获取 月份中的 某一天 | 不同月份取值不同 |
对象.getDay() | 获取 星期 | 取值为 0 ~ 6 |
对象.getHours() | 获取 小时 | 取值为 0 ~ 23 |
对象.getMinutes() | 获取 分钟 | 取值为 0 ~ 56 |
对象.getSeconds() | 获取 秒 | 取值为 0 ~ 59 |
对象.getMilliseconds() | 获取 毫秒 | 取值为 0~1000 |
// 获得当前系统时间
const systemTime = new Date()
// 从 获取的当前系统时间(systemTime)里找
// 获取年份
const year = systemTime.getFullYear()
// 获得月份
const month = systemTime.getMonth() + 1
// 获取月份中的某一天
const date = systemTime.getDate()
// 获取星期
const day = systemTime.getDay()
// 获取小时
const hours = systemTime.getHours()
// 获取分钟
const minutes = systemTime.getMinutes()
// 获取秒
const seconds = systemTime.getSeconds()
console.log(systemTime);
console.log(`${year} 年 ${month} 月 ${date} 日 周${day} ${hours} 时 ${minutes} 分 ${seconds} 秒`)
// Wed Aug 03 2022 21:14:56 GMT+0800 (中国标准时间)
// 2022 年 8 月 3 日 周3 21 时 14 分 56 秒
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
div {
margin: 100px auto;
width: 600px;
height: 100px;
border: 5px solid #969696;
background-color: #d7d7d7;
color: hsl(338, 100%, 50%);
font-size: 44px;
font-weight: 700;
font-family: '华文隶书';
text-align: center;
line-height: 100px;
}
style>
head>
<body>
<div>div>
<script>
// 写法一:
const div = document.querySelector('div')
function getTime() {
const date = new Date()
let hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
let minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
let seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
return `当前时间:${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()} ${hours}:${minutes}:${seconds}`
}
div.innerHTML = getTime()
setInterval(function () {
div.innerHTML = getTime()
}, 1000)
// 当前时间:2022-8-3 22:45:50
// 写法二:自动补0
/*
// 定时器外面再写一次的原因:定时器隔1s再去执行,用外面的填补页面空白
div.innerHTML = date.toLocaleString()
// div.innerHTML = date.toLocaleDateString()
// div.innerHTML = date.toLocaleTimeString()
setInterval(function () {
const date = new Date()
div.innerHTML = date.toLocaleString() // 2022/8/3 23:00:00
// div.innerHTML = date.toLocaleDateString() // 2022/8/3
// div.innerHTML = date.toLocaleTimeString() // 22:48:20
}, 1000)
*/
script>
body>
html>
const date = +new Date('1970-01-01 00:00:00') / 1000 / 60 / 60
console.log(date) // -8
将来时间戳 2000ms - 现在时间戳 1000ms = 1000ms
1000ms 转换时分秒就是 0小时0分1秒
const date = new Date()
console.log(date.getTime()) // 1659539589145 毫秒数
// new Date().get.Time()
拓展:
时间对象.getTime() 和 时间对象.valueOf() 的到的结果一样
console.log(date.getTime() === date.valueOf()) // true
console.log(+new Date()) // 1659539732765 毫秒数
conlose.log(+new Date('2022-10-1 07:30:00'))
// 1664580600000 -- 指定时间的时间戳
console.log(Date.now()) // 1659540040487 毫秒数
const element = document.qurySelector('css选择器')
function getCountTime(time) {
// 得到当前的时间戳(毫秒)
const now = +new Date()
// 得到未来时间时间戳(毫秒)
const last = +new Date(time)
// 得到剩余的时间戳(毫秒) 并转换为 秒
const count = (last - now) / 1000
// 将 剩余秒数 -> 天、时、分、秒
let day = parseInt(count / 60 / 60 / 24)
let hours = parseInt(count / 60 /60 % 24)
// 补0
hours = hours < 10 ? '0' + hours : hours
let minutes = parseInt(count / 60 % 60)
// 补0
minutes = minutes < 10 ? '0' + minutes : minutes
let seconds = parseInt(count % 60)
// 补0
seconds = seconds < 10 ? '0' + seconds : seconds
return `${day} 天 - ${hours}:${minutes}:${seconds}`
}
function getRemainingTime(element, time) {
// 先执行一次:定时器过1s再去执行,会有1s的显示空白时间,让它限制性,填补空白,再让后面的覆盖
element.innerHTML = getCountTime(time)
setInterval(function () {
element.innerHTML = getCountTime(time)
}, 1000)
}
getRemainingTime(div, '2022-10-1 00:00:00')
子元素.parentNode
<div class="yeye">
<div class="dad">
<div class="baby">x</div>
</div>
</div>
<script>
const baby = document.querySelector('.baby')
console.dir(bady) // div.bady -> DOM对象
console.dir(baby.parentNode) // div.dad -> DOM对象
console.dir(baby.parentNode.parentNode) // div.yeye -> DOM对象
</script>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
.box {
position: relative;
width: 1000px;
height: 200px;
background-color: pink;
margin: 100px auto;
text-align: center;
font-size: 50px;
line-height: 200px;
font-weight: 700;
}
.box1 {
position: absolute;
right: 20px;
top: 10px;
width: 20px;
height: 20px;
background-color: skyblue;
text-align: center;
line-height: 20px;
font-size: 16px;
cursor: pointer;
}
style>
head>
<body>
<div class="box">
我是广告
<div class="box1">Xdiv>
div>
<div class="box">
我是广告
<div class="box1">Xdiv>
div>
<div class="box">
我是广告
<div class="box1">Xdiv>
div>
<script>
// const smallBox = document.querySelectorAll('.box1')
/* for (let i = 0; i < smallBox.length; i++) {
smallBox[i].addEventListener('click', function () {
this.parentNode.style.display = 'none'
})
} */
// 事件委托
document.body.addEventListener('click', function (e) {
if (e.target.className === 'box1') {
e.target.parentNode.style.display = 'none'
}
})
script>
body>
html>
父元素.childNodes
父元素.children
<ul>
<li>
1
<p>6</p>
<span>7</span>
</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<script>
// 获取子节点
// 语法:父元素.children
// 返回值:伪数组
// 仅 获得 所有 元素节点(标签)
console.log(document.querySelector('ul').children);
// 得到的是一个伪数组
</script>
兄弟元素.nextElementSibling
兄弟元素.previousElementSibling
<ul>
<li>
1
<p>6</p>
<span>7</span>
</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<script>
// 上一个兄弟节点
// 语法:兄弟元素.previousElementSibling
// 下一个兄弟节点
// 语法:兄弟元素.nextElementSibling
console.log(document.querySelector('ul li:nth-child(2)').nextElementSibling)
</script>
document.createElement('标签名') // 文档.创建元素
document.createElement() -- 创建的是空标签
父元素.appendChild(要插入的元素) // 追加孩子
父元素.insertBefore(要插入的元素, 在哪个元素前面) // 插入在…之前
<style>
div,
li {
font-size: 20px;
text-align: center;
line-height: 50px;
}
li:first-child {
width: 150px;
height: 50px;
background-color: #b8f0e8;
}
li:last-child {
width: 150px;
height: 50px;
background-color: #a6a6db;
}
div {
width: 150px;
height: 50px;
background-color: #c0bfbf;
}
style>
<body>
<ul>
<li>我是老大li>
ul>
<script>
// 增加节点(节点 -> 元素节点)
// 1.创建节点
// 语法:document.createElement('标签名称')
// 2.插入节点
// (1).作为父元素里面的最后一个子元素
// 语法:父元素.appendChild(要插入的元素)
// (2).插入到父元素里面指定位置(插入到父元素里面某个子元素的前面)
// 语法:父元素.insertBefore(要插入的元素, 在那个子元素前面)
// 1.创建节点
const li = document.createElement('li')
li.innerHTML = '我是老二'
// 2.插入节点
// 2.1获取父元素
const ul = document.querySelector('ul')
// 2.2作为父元素里面的最后一个子元素
ul.appendChild(li)
// 1.创建节点
const div = document.createElement('div')
div.innerHTML = '我是老大的大哥'
// 2.插入节点
// 2.1获取父元素
const body = document.body
// 2.2插入到父元素指定位置(插入到父元素里面指定元素前面)
body.insertBefore(div, ul)
// 将创建的节点始终插入到父元素的最前面
/*
body.children // 包含body下所有的(亲)子节点伪数组
body.insertBefore(div, body.children[0])
*/
script>
body>
元素.cloneNode(布尔值)
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
const ul = document.querySelector('ul')
// const newLi = ul.children[0].cloneNode(true)
// newLi.innerHTML = 'newLi'
// ul.appendChild(newLi)
ul.insertBefore(ul.children[0].cloneNode(true), ul.children[11])
</script>
父元素.removeChild(要删除的元素)
删除的元素.remove()
parentNode.replaceChild(newChild, oldChild);
触屏 touch 事件 | 说明 |
---|---|
touchstart | 手指 触摸 到一个DOM元素时触发 |
touchmove | 手指在一个DOM元素上 滑动 时触发 |
touchend | 手指从一个DOM元素上 移开 时触发 |
window(JS中的顶级对象) > BOM(浏览器对象模型) > DOM(页面文档对象模型)
setTimeout(回调函数, 等待的毫秒数)
let timerId = serTimeout(回调函数, 等待的毫秒数)
clearTimeout(timerId)
const btn = document.querySelector('button');
btn.addEventListener('click', function () {
location.href = 'https://www.baidu.com';
});
console.log(location.search); // 字符串
console.log(location.hash); // 字符串
const btn = document.querySelector('.reload');
btn.addEventListener('click', function () {
// F5 -> 刷新
//location.reload();
// F5+Ctrl -> 强制刷新
location.reload(true);
});
const btn = document.querySelector('button');
btn.addEventListener('click', function () {
location.replace('https://www.baidu.com');
});
// 检测userAgent(浏览器信息)
!(function () {
const userAgent = navigator.userAgent;
// 验证是否为Android或iPhone
const android = userAgent.match(/(Android);?[\s\/]+([\d.]+)?/);
const iphone = userAgent.match(/(iPhone\sOS)\s([\d_]+)/);
// 如果是Android或iPhone,则跳转至移动站点
if (android || iphone) {
location.href = 'http://m.itcast.cn';
}
})();
<button>后退button>
<button>前进button>
<script>
// 获取元素
const back = document.querySelector('button');
const forward = back.nextElementSibling;
// 事件侦听-点击事件
back.addEventListener('click', function () {
// 前进一步
history.go(1);
});
forward.addEventListener('click', function () {
// 后退一步
history.go(-1);
});
script>
localStorage.setItem(key, value)
// 设置每个小项,key和value要加引号,key和value可以是变量
localStorage.getItem(key) // 获取里面的项,key必须加引号
// 获取数据 - localStorage.getItem(key)
// 要加引号
console.log(localStorage.getItem('uname')); // 邵秋华
localStorage.removeItem(key) // 移除里面的项, key必须加引号
// 删除本地存储
localStorage.removeItem('uname');
localStorage.clear()
const arr = [1, 2, 3, 4];
arr.forEach((item, index) => {
localStorage.setItem(`id:${index}`, item);
console.log(localStorage.getItem(`id:${index}`)); // 1 2 3 4(字符串)
console.log(typeof (localStorage.getItem(`id:${index}`)));// string
});
const regObj = /表达式/ // 正则表达式不改变使用
const regObj = new RegExp('表达式') // 正则表达式变化使用
regObj.test(被检测的字符串)
// 正则表达式
// 正则表达式使用
// 1)定义规则
// 语法:const 变量名(regObj) = /表达式/;
// 注意:正则表达式的字面量中间 不要乱加空格
// 字面量中间些什么就匹配什么(不要乱加空格)
// 2)是否匹配
// 语法:regObj(字面量).test(被检测的字符串);
const reg = /前端/;
const str = '我在学习前端,希望学完高薪就业!!!';
console.log(reg.test(str)); // true
// 注意
const reg = / 前端 /;
const str = '我在学习前端,希望学完高薪就业!!!';
console.log(reg.test(str)); // false
// 注意
console.log(/哈/.test('哈')); // true
console.log(/哈/.test('哈哈')); // true
console.log(/哈/.test('二哈')); // true
regObj.exec(被检测字符串)
const reg = /前端/;
const str = '我在学习前端,希望学完高薪就业!!!';
console.log(reg.exec(str));
边界符 | 说明 |
---|---|
^ | 表示匹配 行首 的文本(以谁开始) |
$ | 表示匹配 行尾 的文本(以谁结束) |
console.log(/哈/.test('哈')); // true // 字符串的内容 和 规则相等
console.log(/哈/.test('哈哈')); // true
console.log(/哈/.test('二哈')); // true
console.log(/^哈/.test('哈')); // true
console.log(/^哈/.test('哈哈')); // true
console.log(/^哈/.test('二哈')); // flase
console.log(/^哈$/.test('哈')); // true
console.log(/^哈$/.test('哈哈')); // false -- 精确匹配(字符串的内容、长度必须和规则相等)
console.log(/^哈$/.test('二哈')); // flase
量词 | 说明 |
---|---|
***** | 重复 零次 或 多次 >= 0 |
+ | 重复 一次 或 多次 >=1 |
? | 重复 零次 或 一次 |
{n} | 重复 n次 |
{n,} | 重复 n次 或 更多次 >= n |
{n,m} | 重复 n 到 m 次 n <= 次数 <= m |
后面的字符串只要包含abc中任意一个字符,都返回true
console.log(/[abc]/.test('andy')); // true
console.log(/[abc]/.test('baby')); // true
console.log(/[abc]/.test('cry')); // true
console.log(/[abc]/.test('die')); // false
console.log(/^[abc]$/.test('a')); // true
console.log(/^[abc]$/.test('b')); // true
console.log(/^[abc]$/.test('c')); // true
console.log(/^[abc]$/.test('ab')); // false
console.log(/^[abc]{1,}$/.test('abc')); // true
[\u4e00-\u9fa5] 匹配汉字
/^[1-9][0-9]{4,}$/ // 第一个数字:1~9;从第二位开始:0~9;可以重复>=4
预定义 | 说明 |
---|---|
\d | 匹配 0-9之间 的 任一数字,相当于[0-9] |
\D | 匹配所有 0-9以外 的 字符,相当于[ ^0-9] |
\w | 匹配任意的 字母、数字和下划线,相当于[A-Za-z0-9_] |
\W | 除所有字母、数字和下划线以外的字符,相当于[ ^A-Za-z0-9_] |
\s | 匹配空格(包括换行符、制表符、空格符等),相等于[\t\r\n\v\f] |
\S | 匹配非空格的字符,相当于[ ^\t\r\n\v\f] |
日期:^\d{4}-\d{1,2}-\d{1,2}$
/表达式/修饰符
字符串.replace(/正则表达式/, '替换文本')
字符串.replace(/正则表达式/g, '替换文本')
字符串.replace(/正则表达式/ig, '替换文本')
字符串.replace(/正则表达式/gi, '替换文本')
字符串.replace(/正则表达式|正则表达式/, '替换文本')
// 修饰符:约束正则表达式的细节行为
// 语法: /正则表达式/修饰符
// i(不区分大小写) + g(匹配所有满足正则表达式的结果)
// i
console.log(/^java$/.test('JAVA')); // false
console.log(/^java$/i.test('JAVA')); // true
console.log(/^java$/i.test('JavA')); // true
// 替换 - replace
// 语法:字符串.replace(/正则表达式/, '替换文本')
const str = 'java是一门编程语言,学完JAVA工资很高';
// 替换一个
const re1 = str.replace(/java/, '前端');
console.log(re1); // '前端是一门编程语言,学完JAVA工资很高'
// 替换多个 - g
const re2 = str.replace(/java/ig, '前端');
console.log(re2); // '前端是一门编程语言,学完前端工资很高'
// 替换多个 - 或(|) (正则表达式里的或)(|两侧不要加空格)
const re3 = str.replace(/java|JAVA/g, '前端');
console.log(re3); // '前端是一门编程语言,学完前端工资很高'