JavaScript基础
JavaScript-介绍
书写方式
内联
| <button onclick="alert('内联')">内联</button> |
内部书写
一般写在 上面
| <script> |
| alert('内部样式') |
| </script> |
外部引入
一般写在 上面
| <script src="./js.js"></script> |
注释
输入输出语句
输出
| |
| document.write('giao'); |
| |
| alert('giao'); |
| |
| console.log('giao'); |
输入
| |
| prompt('提示语','默认值'); |
| |
| confirm('提示语'); |
JavaScript-变量
声明赋值
关键字 let const var
块级作用域 : ES6新增 变量只能在当前作用域访问
变量提升 : 历史遗留 , 定义了一个变量浏览器会默认给这个变量赋值undefined, 不会报错, 将变量提升至作用域顶端
暂时性死区 : 如果区块内存在 let , const ,从一开始就是形成封闭作用域, 再声明之前使用变量, 会报错形成暂时性死区
let const
- 不存在变量提升
- 同一作用域不能重复
- 有块级作用域
- const 值 不能修改
var
- 有变量提升
- 同一作用域可以重复声明
- 没有块级作用域(有全局和函数作用域)
变量名规则
- 只能是字母,数字,下划线,$,但不能以数字开头
- 字母区分大小写
- 不能使用关键字
- 尽量有语义
- 尽量遵守驼峰命名法
变量数组
可以保存多个数据
语法
| |
| let arr = ['内容','内容','内容']; |
| |
- 数字是按顺序保存,每个数据都有自己的编号
- 编号从 0 开始,也叫索引或下标
- 可以存储任意类型数据
取值
| let arr = ['内容','内容','内容']; |
| |
| console.log(arr[0]); |
| |
| console.log(arr.length); |
- 数组长度 arr.length
- 数组下标长度 arr.length - 1
数据类型
基本类型 (常用)
Number String Boolean null undefined object
引用类型 数组 对象
number 数字型类型
| let score = 100; |
| let price = 12.345; |
| let temperature = -40; |
string字符串类型
| let user_name = '小明'; |
| let gender = "男"; |
| let str = '123'; |
| let str1 = ''; |
- 单引号和双引号本质上没区别
- 推荐使用单引号
- 必要时可以使用转义符 \,输出单引号或双引号
string 字符串拼接
用 + 拼接
| let name = '小啊giao'; |
| let age = 22; |
| console.log('我叫'+name+',今年'+age+'了') |
模板字符串 ``
可以换行 填写嵌套代码
| let name = '小啊giao'; |
| let age = 22; |
| console.log(`我叫${name},今年${age}了`) |
boolean 布尔类型
| let isCool1 = true; |
| let isCool2 = false; |
undefined 未定义类型
| let name ; |
| document.write(name); |
null 空类型
数据类型判断
typeof
可以判断基本类型, 不能对null , {} , [] 进行精确判断, 返回object
| console.log(typeof 'giao'); |
| console.log(typeof 123); |
| console.log(typeof false); |
| console.log(typeof undefined); |
| console.log(typeof function () { }); |
| console.log(typeof {}); |
| console.log(typeof []); |
| console.log(typeof null); |
instanceof
能判断复杂类型 不能判断基本类型 , [] 也判断成 Object
| console.log([] instanceof Array); |
| console.log([] instanceof Object); |
| console.log('giao' instanceof string); |
Object.prototype.toString.call()
可以判断数据的原始类型
| Object.prototype.toString.call(2); |
| Object.prototype.toString.call(""); |
| Object.prototype.toString.call(true); |
| Object.prototype.toString.call(undefined); |
| Object.prototype.toString.call(null); |
| Object.prototype.toString.call(Math); |
| Object.prototype.toString.call({}); |
| Object.prototype.toString.call([]); |
| Object.prototype.toString.call(function () { }); |
类型转换
隐式转换
| let name = '123'; |
| let age = 123; |
| |
| console.log(name+age); |
| |
| console.log(name-age); |
- 加号 两边只要有一个是字符串,结果都会是字符串
- 除了加号的运算符 都可以 转换为数字类型
显示转换
| let name = '123'; |
| let age = 123; |
| let age2 = '123.12'; |
| |
| |
| let zifu = String(age); |
| console.log(typeof zifu) |
| |
| |
| let zifu2 = age.toString(); |
| console.log(typeof zifu2) |
| |
| let zhengshu = parseInt(name); |
| console.log(typeof zhengshu) |
| |
| let xiaoshu = parseFloat(age2); |
| console.log(typeof xiaoshu) |
赋值运算符
= 将等号右边的值赋予给左边, 要求左边必须是一个容器
| let n = 1; |
| n += 4; |
| n -= 4; |
| n *= 4; |
| n %= 4; |
| n /= 4; |
| console.log(n); |
一元运算符
自增 ++
自减 --
前置自增和后置自增
比较运算符
| >: 左边是否大于右边 |
| <: 左边是否小于右边 |
| >=: 左边是否大于或等于右边 |
| <=: 左边是否小于或等于右边 |
| ==: 左右两边是否相等 |
| ===: 左右两边是否类型和值都相等 |
| !==: 左右两边是否不全等 |
| 比较结果为boolean类型,即只会得到true或false |
逻辑运算符
- && 与 并且 两边结果都为true 结果才为true
- || 或 或者 两边有一个true 结果为true
- ! 非 取反 true变false false变true
短路
JavaScript-语句
if语句
条件判断
单分支
双分支
多分支
| if(条件){ |
| 代码块 |
| }else if(条件2){ |
| 代码块 |
| }else { |
| 代码块 |
| } |
其他
三元运算符
switch 语句
| switch (数据) { |
| case '1': |
| 代码 |
| break; |
| case '2': |
| 代码 |
| break; |
| default: |
| 代码 |
| break; |
| } |
JavaScript-循环语句
while 循环
先判断,在执行
for 循环
把声明起始值、循环条件、变化值写到一起,让人一目了然
| for (变量初始值; 循环条件; 变化值) { |
| 代码 |
| } |
continue和break区别
- continue 结束本次循环,继续下次循环
- break 跳出所在循环
双 for 循环
| for (变量初始值; 循环条件; 变化值) { |
| for (变量初始值; 循环条件; 变化值) { |
| 代码 |
| } |
| } |
| |
| document.write(`<table border=1px; style = 'border-collapse:collapse;'>`); |
| for (let i = 1; i <= 9; i++) { |
| document.write(`<tr>`); |
| for (let j = 1; j <= i; j++) { |
| document.write(`<td>`); |
| document.write(`${i}X${j}=${i*j}`); |
| document.write(`</td>`); |
| } |
| document.write(`</tr>`); |
| } |
| document.write(`</table>`); |
JavaScript-操作数组
查询元素
数组[下标]
| let arr = [2,3,4] |
| console.log(arr[0]) |
修改元素
数组[下标] = 新值
| let arr = [2,3,4] |
| arr[0] = 7 |
| console.log(arr[0]) |
添加元素
arr.push() 从后面添加元素
arr.unshift() 从前面添加元素
| let arr = [2,3,4] |
| arr.push(9) |
| arr.unshift(0) |
| console.log(arr) |
删除元素
arr.splice(下标,个数(默认删到最后),替换的元素)
| |
| let arr = ["Banana", "Orange", "Apple", "Mango"]; |
| arr.splice(2,1); |
| console.log(arr) |
| |
| let arr = ["Banana", "Orange", "Apple", "Mango"]; |
| arr.splice(2,1,"Lemon","Kiwi"); |
| console.log(arr) |
冒泡排序
| |
| let array = [3,4,6,2,1,7,5]; |
| |
| let temp = []; |
| |
| for (let i = 1; i < array.length - 1; i++) { |
| |
| for (let j = 0; j < array.length - i; j++) { |
| |
| if (array[j] > array[j + 1]) { |
| temp = array[j]; |
| array[j] = array[j + 1]; |
| array[j + 1] = temp |
| } |
| document.write(' '+'内层'+' '+ (j+1)+'次'+'</br>'); |
| } |
| document.write('外层'+' '+ (i+1)+' '+'行'+'</br>'); |
| } |
| document.write('<h2>'+array+'</h2>'); |
数组去重并赋值新数组
| let array = ['a', 'b', 'c', 'a', 'd', 'a', 'c', 'b', 'c', 'd', 'a', 'b', 'c', 'c', 'a',]; |
| |
| let newArray = []; |
| |
| for (let i = 0; i < array.length; i++) { |
| |
| if (newArray.indexOf(array[i]) == -1) { |
| |
| newArray.push(array[i]); |
| } |
| } |
| document.write(newArray); |
| |
| for (let i = 0; i < array.length; i++) { |
| |
| let flag = true; |
| |
| for (let j = 0; j < newArray.length; j++) { |
| |
| if (newArray[j] == array[i]) { |
| flag = false; |
| } |
| } |
| |
| if (flag) { |
| newArray.push(array[i]) |
| } |
| } |
| document.write(newArray); |
JavaScript-函数
可以把具有相同逻辑的代码包裹起来,有利于精简代码,方便复用
声明
函数命名
和变量基本一致
| |
| |
| can 判断某个动作 |
| |
| has 判断是否含某个值 |
| |
| is 判断是否为某个值 |
| |
| get 获取某个值 |
| |
| set 设置某个值 |
| |
| load 加载某些数据 |
调用方法
函数名()
函数参数
声明
可以传多个数据
参数与参数之间逗号隔开
| function 函数名(参数,参数) { |
| 函数体 |
| } |
调用
函数名(参数,参数);
形参和实参
| function getname(name) { |
| document.write(name) |
| } |
| getname('giao'); |
函数返回值
- 能将内部的执行结果交给函数外部使用
- 只能出现一个return 并后面的代码不再执行
- 会结束当前函数
- 默认值 undefined
作用域
全局作用域
script标签内部有效
局部作用域
函数内部有效
块级作用域
{} 括号里有效 比如 if{} for{}
变量的作用域
全局变量
script标签内部可以访问修改
局部作用域
函数内部可以访问修改
块级作用域
{} 括号里有效 比如 if{} for{}
注意:var不具有块级作用域的说法 也是全局变量
作用域链
当前作用域没有变量, 一层一层向上寻找作用域的变量,这个关系, 作用域链
匿名函数
自执行函数
| |
| ;(function (形参) {} )(实参); |
| |
| ;(function (形参) {} (实参)); |
输入数字 转时间
| function showTime(shu) { |
| |
| let h = parseInt(shu / 60 / 60); |
| |
| let f = parseInt(shu / 60 % 60); |
| |
| let m = shu % 60; |
| h = h < 10 ? '0' + h : h; |
| f = f < 10 ? '0' + f : f; |
| m = m < 10 ? '0' + m : m; |
| document.write(`转换为:${h}时${f}分${m}秒`); |
| } |
| let shu = prompt ('数'); |
| showTime(shu); |
JavaScript-对象
什么是对象
- 对象是一种数据类型
- 无序的数据结合
- 可以详细的描述某个事物
声明
多属性之间用,分隔
| let 对象名 = { |
| 属性名:属性值, |
| 属性名:属性值, |
| 方法名:函数 |
| } |
访问属性
| |
| 对象名.属性名 |
| |
| 对象名['属性名'] |
| |
| |
| 对象名.方法名(); |
增加属性 / 修改属性
| |
| 对象名.属性名 = '属性值' |
| |
| 对象名['属性名'] = '属性值' |
| |
| |
| 对象名.方法名() = function() {} |
删除属性
| delete 对象名.属性名 |
| delete 对象名.方法名 |
遍历对象
| |
| for (let key in object) { |
| |
| console.log(key); |
| |
| console.log(object[key]); |
| } |
遍历对象数据
| let students = [ |
| {name: '小明', age: 18, gender: '男', hometown: '河北省'}, |
| {name: '小红', age: 19, gender: '女', hometown: '河南省'}, |
| {name: '小刚', age: 17, gender: '男', hometown: '山西省'}, |
| {name: '小丽', age: 18, gender: '女', hometown: '山东省'} |
| ]; |
| for (let i = 0; i < students.length; i++) { |
| document.write(` |
| <tr> |
| <td>${i + 1}</td> |
| <td>${students[i].name}</td> |
| <td>${students[i].age}</td> |
| <td>${students[i].gender}</td> |
| <td>${students[i].hometown}</td> |
| </tr> |
| `) |
| } |
求这个字符串里面出现最多的字符是哪个,出现了几次
| let str = '132642343739373635384628633124abcdaabca'; |
| |
| let newStr ={}; |
| |
| for (let i = 0; i < str.length; i++) { |
| |
| |
| if (newStr[str[i]]) { |
| |
| newStr[str[i]]++; |
| }else{ |
| |
| |
| newStr[str[i]] = 1; |
| } |
| } |
| |
| let max = str[0]; |
| |
| let biJiao = newStr[str[0]] |
| |
| for (let key in newStr) { |
| |
| if (newStr[key] > biJiao) { |
| |
| biJiao = newStr[key]; |
| |
| max = key; |
| } |
| } |
| console.log(biJiao + max); |
几种对象
- 自定义对象:基础内容 属于ECMAScript
- 内置对象:指JS语言自带的一些对象
- 浏览器对象:JS独有的 , JSAPI
Math对象 - 内置对象
| |
| |
| |
| |
| |
| |
| Math.floor(Math.random() * ( m - n + 1 ) + n); |
Date对象 - 构造函数
- 参数格式 YYYY-MM-DD hh:mm:ss'
| let now = new Date(年,月,日,时,分,秒); |
取值
| let date = new Date(); |
| |
| console.log(date.getFullYear()); |
| |
| console.log(date.getMonth() + 1); |
| |
| console.log(date.getDate()); |
| |
| let arr = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'] |
| let day = date.getDay() |
| console.log(arr[date.getDay()]); |
| |
| let h = date.getHours(); |
| h = h < 10 ? '0' + h : h; |
| console.log(h); |
| |
| let m = date.getMinutes(); |
| m = m < 10 ? '0' + m : m; |
| console.log(m); |
| |
| let s = date.getSeconds(); |
| s = s < 10 ? '0' + s : s; |
| console.log(s); |
时间戳
| |
| |
| let date = new Date(); |
| console.log(date.valueOf()); |
| console.log(date.getTime()); |
| |
| let date = +new Date(); |
| console.log(date); |
| |
| console.log(Date.now()); |
Array对象
| |
| let arr = []; |
| |
| console.log(arr instanceof Array); |
| |
| console.log(Array.isArray(arr)); |
| |
| let arr = ['1','2','3']; |
| arr.reverse(); |
| console.log(arr); |
| |
| let arr = ['1','2','3']; |
| arr.sort(function (a,b) { |
| return a - b; |
| return b - a; |
| }); |
| |
| let arr = ['1','2','3']; |
| console.log(arr.indexOf('2')); |
| |
| |
| let arr = ['giao','giao','giao']; |
| console.log(arr.toString()); |
| |
| console.log(arr.join('-')); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步