js简介
js是什么
是一种运行在浏览器的编程语言,实现人机交互
书写位置
- 内部js
</body >的上边 - 外部js
代码写在==.js==文件中,使用<script src=""></script>引用 - 内联js
与vue框架相关,代码写在标签内部,如:<button onclick="alert('XXX')">< /button>
输入输出
输入
document.write('XXX')
向body中输出内容,XXX可以是标签,被解析为网页元素alert('弹出对话框')console.log('控制台打印')
console:控制台,log:日志
输出
prompt('请输入年龄:')
执行顺序
- 从上到下
- alert和prompt会先执行
变量
www.runoob.com/js/js-let-c… 变量名称为标识符
- var声明
- 声明的变量是全局的,在函数内声明的变量作用域是局部的.但没有块级代码的概念,同时作用在循环体内与外.
- 变量提升:var变量可以先使用再声明
- 可以重复声明
- let声明(与C相似)
- 名称可包含字母、数字、下划线和美元符号
- 名称也可以 以字母,$ 和 _ 开头
- 名称对大小写敏感(y 和 Y 是不同的变量)
- 保留字无法用作变量名称
- 数组:
let shuzu = {A,B}
数据类型
js为弱数据语言,只有赋值后才知道是什么数据类型
基本数据类型
- Number
- 用于任何类型的数字:整数或浮点数,在 ±(253-1) 范围内的整数。
- Bigint
- 用于任意长度的整数。
- String
- 用于字符串:一个字符串可以包含 0 个或多个字符,所以没有单独的单字符类型。
- 单引号和双引号效果一致,包裹的都是字符串
- Boolean
- 用于 true 和 false。
- true不一定等于1,false不一定等于0。
- Undefined
- 在使用var 声明变量但未对其加初始化时,这个变量就是undefined。
- 开发中,判断一个接收数据的变量是否接收到,可判断该值是否为undefined
- Null
- 表示赋值了但内容为空
- null是表示一个空对象指针。对象还没创建好可以先给个null
- Symbol
- 用于唯一的标识符。
- Symbol 值可以用作对象的属性键,以确保属性名的唯一性
const symbol1 = Symbol();
const symbol2 = Symbol();
console.log(symbol1 === symbol2); // false
引用数据类型
- Object
- 用于更复杂的数据结构,比如 function、Array、Date。
typeof 运算符查看存储在变量中的数据类型。
- 两种形式:typeof x 或者 typeof(x)。
- 以字符串的形式返回类型名称,例如 "string"。
- typeof null 会返回 "object" —— 这是 JavaScript 编程语言的一个错误,实际上它并不是一个 object。
值的比较
相等运算符
==非严格相等运算
不同类型转化为同一类型,比较两个操作数的值是否相同- 不同类型进行相等运算时,转化优先级:数字>字符串>对象
- 如果两个操作数都是对象,则比较引用地址。如果引用地址相同,则相等;否则不等。
===或!==严格相等运算
先检测类型是否相同,相同后才比较值是否相同- 高级类型互比,两者没有区别,都是指针地址比较,高级与基础互比与正常情况相同
其他运算符
- 字符串的比较,会按照“词典”顺序逐字符地比较大小。
+相加运算符,转化优先级:字符串>数字>布尔值
(布尔有0和1或ture和false两种状态),null与数字会变成0- result1=5+5+'abc'输出为10abc
- result2='abc'+5+5输出为abc55
- result1=' '+5+5+'abc'输出为55abc
特殊值
- 在非严格相等 == 下,null 和 undefined 相等且各自不等于任何其他的值。
- NaN与任何值都不相等,包括它自己。任何操作数与NaN比较,都是false
- 在使用 > 或 < 进行比较时,需要注意变量可能为 null/undefined 的情况。比较好的方法是单独检查变量是否等于 null/undefined。
类型转换
- 原因举例:JavaScript是弱数据类型,表单、prompt传来的数据默认为字符串型,不能直接进行加法运算
隐式类型转换
当某些运算符被执行时,系统内部自动将数据类型进行转换
- +‘ ’可将数据化为字符串
(+号两边有是一个字符串,另一个也被转成字符串)- 除了+的-*/运算符,会把数据转成数字类型
- 在数据前放个+,可以将数据转化为数字型
(作为正号解析) - !!a可以转化为布尔型
(第一个!转化为布尔型的反面,第二个!正过来)
显式类型转换
- 转换成String类型
- .toString
a = a.toString();- Null和Undefined没有toString()方法_,如果调用它们的方法,则会报错。
- String()
-
对于Number和Boolean就是调用toString()方法,对于null和undefined,就不会调用toString()方法,它会将null直接转换成”null”,将undefined转换成”undefined”。
-
- .toString
- 转换为Number类型
- Number()
- 如果是纯数字的字符串,则直接将其转换为数字。
- 如果字符串中有非数字的内容,则转换为NaN。
- 布尔类型转换成数字:Ture转成1;False转成0。
- Null转成数字0。
- Undefined转成数字NaN。
- parseInt(),parseFloat()
-
- parseInt()把一个字符串转换为一个整数,只取整数部分;
- parseFloat()把一个字符串转换为一个浮点数,可获得有效小数;
- a = parseInt('12.34.56ab');a:12.34
- 对非String使用parseInt()或parseFloat(),它会将其转换为String.
-
- Number()
- 转换为Boolean类型
- Boolean()
- 对于数字,0和NaN是false,其余的都是true。
- 对于字符串,空串是false,其余的都是true。
- 对于null和undefined,都是false。
- 对于对象,都是true。
- Boolean()
函数
在JavaScript里,函数实际上是对象, 每个函数都是Function类型的实例, 而Function也有属性和方法。因为函数是对象, 所以函数名就是指向函数对象的指针
如何创建一个函数?
1. 使用函数表达式
函数通过一个表达式定义,且储存在一个变量中。使用这种语法定义的函数可以是命名函数或匿名函数
const sum = function (a1, a2) {
return a1 + a2
}
let a = sum(1, 2)
console.log(a)
-
使用函数声明
在关键字“function”之后,你必须指定函数的名称。之后,如果函数接受多个参数或参数,也需要提及它们。
function sum(a1 , a2) {
return a1 + a2
}
let a=sum(1,2);
- 箭头函数(很简化的一种方式)
let 函数名 = (参数1, 参数2) => { }
- 当只有一个参数时,圆括号可以省略,没有参数时,空圆括号即可
- 当函数部分只有一个语句,花括号也可以省略
- 推荐将定义时采用的let改为const,此时函数表达式无法被改变,安全性更强
- 箭头函数是不能提升的,所以需要在使用之前定义。
函数参数
显式参数与隐式参数
- 显式参数在函数==定义时==列出。
- 隐式参数在函数调用时传递给函数==真正的值==。(arguments和this等)
函数重载
两个或多个同名函数,参数数量或类型不同,可以通过调用时传入的参数数量或类型判断使用哪个函数
在js中,没有函数重载,后声明的同名函数会对原同名函数进行覆盖
默认函数值
定义函数时,可以赋给参数一个默认值
- 默认值只有在调用函数时没有传入数据,才会被使用,定义时也不会起作用
- 若有两个参数,只传入一个,另一个也会使用默认值
类数组arguments对象
函数传入的参数会存入arguments中,多个参数以类似数组方式存储和调用
fun(1,2,3)//arguments[0]=1
回调函数(Callback函数)
回调函数是一个作为参数传给另一个 JavaScript 函数的函数。这个回调函数会在传给的函数内部的末尾执行。
function doSomething() {
// 执行一些耗时的操作
}
function onDone() {
// 操作完成后要执行的操作
}
doSomething(onDone);
对象
对象是变量的容器==>对象是键值对的容器
对象属性
键值对通常写法为 name : value (键与值以冒号分割),也称之为对象属性
var student= {id:"20230001", age:21, name:"张三"};
访问对象属性
可以使用 .property 或 ["property"]两种方法
objectName.propertyNameobjectName["propertyName"]
对象方法
对象也可以有方法。方法是在对象上执行的动作。以函数定义被存储在属性中。
- 实例:
var person = {
firstName: "Bill",
lastName : "Gates",
id : 678,
fullName : function() {
return this.firstName + " " + this.lastName;
}
};
访问对象方法
objectName.methName();
对象的声明方式
- 声明字面量对象
- 通过object类创建对象
// 创建空对象
let obj1 = {}
let obj2 = new Object();
// 添加属性
obj1.key1 = "value1"
obj2.key2 = 12
obj1["key1"] = false
// 添加方法
obj2.hi=function(){
console.log("hi")
}
区别
- 语法
- 字面量对象使用花括号 (
{}) 来定义。 Object声明的对象使用new Object()语法来定义。
- 字面量对象使用花括号 (
- 创建方式
- 字面量对象是直接创建的,不需要使用构造函数。
Object声明的对象是通过构造函数创建的。
- 性能
- 字面量对象的创建速度通常比
Object声明的对象更快。
- 字面量对象的创建速度通常比
- 可拓展性
- 字面量对象不能直接扩展其原型。
Object声明的对象可以通过Object.prototype扩展其原型。
- 使用场景
- 字面量对象通常用于创建简单对象。
Object声明的对象通常用于创建复杂对象或需要继承的对象。
object类
-
Object.prototype是 JavaScript 中所有对象的原型对象。 它包含所有对象默认继承的属性和方法。 -
原型机制允许对象继承自其原型对象的属性和方法。 这是一种代码重用和减少代码冗余的有效方式。
字符串
字符串的属性和方法
length属性
使用字符串的length属性可以查看当前字符串中字符的数量,就算其中包括双字符也会按照单字符计算,(有些Emoji占用四个字符)
拼接字符串的concat方法
- 但在实际开发中,常用+连接两个字符串进行连接
let str = "hello";
let str2 = str.concat(" world", " qwq");
console.log(str); //hello
console.log(str2); //hello world qwq
字符串切片方法slice、substr、substring
- 他接受两个参数,第一个参数是开始的位置(必传),第二个参数是结束的位置
- 当传入负数时,按照从末位开始算,-1表示倒数第一位
let str = "一二三四五六七八";
let strSplice = str.slice(0,6);
console.log(strSplice);
删除左右空格的trim方法
- trim方法会返回一个新字符串,删除了左右的所有空格。
- 在实际开发中会用到这个方法进行用户输入数据的处理
将字符串打碎成数组的split方法
let str = "一二三四五六七八";
let engStr = "hello world you qwq";
console.log(str.split(""));//所有单子符之间加上","
console.log(engStr.split(" "));//将" "(空格)替换为"," 也可用字母当分割线
字符串的大小写转换方法toLowerCase toUpperCase
数组
在JS的数组中,可以任意的存放各种类型的数据(这点和大多数其他语言不同),并且JS的数组是动态的,他会自动为你扩充大小。
数组的属性和方法
检查数组长度的length属性
- 和字符串的属性类似,数组会有一个length属性供我们查看数组中有多少个元素。
转换数组为字符串的join方法(和toString)
- 使用join方法可以直接返回一个以传入参数为分隔连接起来的字符串
arr.join("") - (不推荐)其实,数组也是一种特殊的对象,所有对象都会拥有toString方法用于返回一个和该对象有关的字符串,数组也不例外,他可以返回一个用逗号相连的字符串。
数组的推入与删除push pop shift unshift
- 使用push pop shift unshift方法可以操作数组最前面一项和最后面一项
- push:向数组的最后推入一项
- pop:移除数组的最后一项
- shift:移除数组的第一项
- unshift:向数组最前方推入一项
push和pop方法可以构建类似栈的处理方式
使用push向末尾推入新的一项,用pop删除最后一项,这样的操作方式和栈的工作原理一致
shift和push方法可以构建类似队列的处理方式
使用shift和push方法可以构建类似队列的处理方式,使用push推入最后一项,使用shift删除最前面的一项。
数组的迭代方法map,forEach
数组有自己的迭代方式,不需要我们手动使用for循环去遍历数组
forEach方法:
- forEach是不带有返回值的方法:
let arr = [1, 2, 3, 4, 5, 6];
arr.forEach((item) => {//item是形参
console.log(item);
});
map方法:
- map是带有返回值的方法,并且map方法比forEach要更快,他会返回一个新的数组;
let arr = [1, 2, 3, 4, 5, 6];
let arrNew = arr.map((item) => {
return item + 1;
});
console.log(arr);
console.log(arrNew);
- map方法可以方便进行[[链式调用]]
- 在实际开发中,由于map拥有这样可以返回新数组、运行效率高、可以链式调用的特性,我们通常使用map而不是forEach方法
数组的过滤方法filter
filter方法用于对数组进行过滤。它会创建一个新数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
var arr = [2,3,4,5,6]
var result = arr.filter(function (number) {
return number > 3
})
console.log(result);
filter为数组中的每个元素调用一次 callback 函数,并利用所有使得 callback 返回 true 或 等价于 true 的值 的元素创建一个新数组。
数组中查找某个元素的位置indexOf
array.indexOf(item,start)方法可返回数组中某个指定的元素位置。该方法将从头到尾地检索数组,看它是否含有对应的元素。开始检索的位置在数组 start 处或数组的开头(没有指定 start 参数时)。如果找到一个 item,则返回 item 的第一次出现的位置。如果在数组中没找到指定元素则返回 -1。
其他方法
JavaScript数组中的方法还有很多。如排序方法sort()、截取数组splice()、翻转数组reverse()等等。