算术运算符:+ - * / %(模、取余) **(幂运算)
1.+(加号) : 将+号两边的number类型的数据,进行相加得到一个相加后的值 如果+号的两边不是number类型(string类型除外),它会先将其隐式转为number类型然后再进行计算
注意:加号运算也可以用作为字符串的拼接,当+的两侧有一边为string类型的数据,那么加法运算就变成了字符串的拼接运算
通常利用加号的这特性进行两个字符串的拼接
2.(减号) : 将-号两边的number类型的数据,进行相加得到一个相加后的值如果-号的两边不是number类型,它会先将其隐式转为number类型然后再进行计算
函数
定义:
函数是一个表达式,函数表达式默认的返回值是undefined
1.函数声明创建后,并不会立即执行函数体的代码,函数只有被调用时才会在创建的位置和环境中执行代码!
2.调用函数 语法: 函数名() 注意,不管该函数有没有形参,函数名后面的小括号都必须写上, 只有写上小括号该函数才会被调用执行!
3.形参默认情况下,初始值是undefined
函数返回值
语法:return 表达式
注意: return语句除了可以指定函数的返回值,还可以结束当前函数的执行
函数的参数传递分为两种情况:( 函数在参数传递时没有引用传递全部都是值传递 )
1、值传递
当函数在调用时,实参数据是基本数据类型时,这时传递给形参的是值,两个独立的空间
当函数在运行中改变了形参变量是不会影响到实参变量的
2、引用(地址)传递
当函数在调用时,实参变量是引用数据类型时,这时传递给形参变量的就是地址值,共享一个空间
当函数在运行中改变了形参变量是会影响到实参变量的数据的
作用域链
定义:
就在将多个作用域进行关联,形成一个隐式的链条,通过这个链条可以访问到上级作用域
注意:
1.作用域链,是从里往外依次寻找!不能从外往里去寻找对应变量或者函数
2.var可以在当前的作用域声明该作用域下的变量
3.函数的作用域只和创建和声明时的位置有关,和函数在哪里执行无关!
预解析
预解析中主要做以下事情:
1、构建全局对象
2、寻找当前作用域下所声明的所有的var 声明变量 以及 function声明的函数,将他们提前到当前作用域的开始位置
JS中的假值:
false ,undefined,null,0, ' ' ,NaN
window(顶层对象)
1.js代码在开始执行前首先它会在当前的运行环境中创建一个全局对象也称作为顶层对象(global)
2.全局对象主要是用来保存,官方提供的原生对象,以及全局方法,全局属性、宿主环境提供的一系列对象! 还会在解析阶段中全局作用域下的全局变量、全局函数,都作为全局对象的属性进行保存!
1.window对象,就是js运行时,宿主环境中所提供的对象 (浏览器)
2.宿主环境不同,global对象是不同的
(1)浏览器(window)
(2)node.js(global)
自执行函数(即时执行函数):
函数在被创建的同时就马上执行了!这种函数通常情况下只会执行一次(执行了地址没有被保存,后面就找不到这个函数了)
构造函数
定义:
实例或者构造一个对象,不同的构造函数,所实例的对象不同,类别不同
注意:
new关键字
1.在构造函数中,创建一个空对象
2.让构造函数中的this指向空对象
3.进行对象的初始化
4.返回初始化对象
语法法则:
new 构造函数(形参列表)
构造函数与普通函数的不同:
1.构造函数不是去实现某个功能,主要是去实例化对象
2.构造函数中的this指向不同,this指向的是一个新创建的空对象{}
3.构造函数一定要和new配合使用,单独使用构造函数将失去意义
4.返回值不同
(1)如果没有return语句,则默认返回新创建的空对象
(2)如果有return语句,1.return返回的是引用数据类型,则返回该引用数据类型
2.return返回的是基本数据类型,则直接无视返回值,返回空对象
5.构造函数的首字母应该大写
构造函数实例化对象
继承的意义:节省空间,不必重复开闭空间,存放完全相同的数据
原型属性
定义:
每一个对象身上都具备一个属性,该原型称为原型属性
种类:
显式原型属性:(prototype)每一个函数都具备prototype,并且还具备—proto—
隐式原型属性:(——proto——)每一个实例对象都具备—proto—
原型对象
定义:
存放在proto属性或者——proto——属性中的对象,称为原型对象
prototype,存放在该属性中的对象称作为显式原型对象
——proto——,存放在该属性中的对象称作为隐式原型对象
显式原型对象(prototype)的作用
1.必须是构造函数,该原型对象才有作用
2.当函数是一个构造函数时,会创建一个实例的空对象,然后会把prototype中的原型对象赋值给=空对象的——proto——属性中
prototype属性在不同的构造函数中属性是不同的:
自定义的构造函数中的prototype属性默认指向的是一个{}空对象
但是原生JS提供的构造函数中的prototype属性是提前定义好的, 基本不会是一个空对象
原型对象重点:
1.JS中所有的函数都是有Function构造函数创建的,包括Function自己
2.所有的原生对象都是object的实例,(object.prototype除外,)
原型链:
js通过每个实例对象上的——proto——隐士原型属性,将原型对象进行链接,在通过原型对象的原型属性在进行链接,依次往复,直到最终的null,这样便形成了JS中的原型链
原型链的寻找一定死通过实例对象的——proto——去寻找的
JS 造物者
包装对象
定义:
对基本数据类型进行一种包装,使其能够称为一种对象,从而使用对象的一些方法和属性(解释万物皆对象的说法)
回调函数
定义:
将函数作为参数传入另一个函数中,传入的这个函数称为回调函数
this的劫持
定义:this的劫持,强行的人为改变this的指向
三种方法用法
1.apply
函数表达式.apply(想要的调用者,[实参1,实参2,...])
2.call
函数表达式.call(想要的调用者,实参1,实参2,...)
3.bind
函数表达式.bind(想要的调用者,实参1,实参2...)()
三个关键字(声明定义变量或者常量)区别
var
1.只存在全局全局作用局,函数作用域
2.可以进行变量声明的提升
3.可在同一个作用域下声明同名的变量(变量的值可以被覆盖)
4.不需要声明初始化(可以只声明,不赋值)
let
1.存在块级作用域{}、
2.变量会进行提升,但是会存在‘暂时性死区’
3.不可以在同一个作用域下声明同名的变量或者同名的函数(同一作用域下的变量的值可以被覆盖)
4.不需要声明初始化(可以只声明,不赋值)
const
1.存在块级作用域{}、
2.变量会进行提升,但是会存在‘暂时性死区’
3.不可以在同一个作用域下声明同名的变量或者同名的函数
4.声明的同时必须进行赋值
5.常量的值不能被改变(会被锁定,强行改变会报错)
箭头函数
定义:
1.写法
let fun=(形参列表)=>{
}
当形参和函数中代码块语句只有一个或者一句,可以省略(){}
2.不能作为构造函数使用,因为箭头函数没有构造器
3.不具备自己的this,箭头函数this指向的是,在该函数被创建的时候,当前作用域下的this
解构赋值
1.数组类型解构(数组是有序的,按照元素的顺序进行解构即可,变量名无所谓 )
let[a,b,c]= [1,["a","c"],["b"],d]
console.log(a,b,c)
let [a,b,c] = [1,2]
console.log(a,b,c)//1,2,un
2.对象类型的解构(对象是无序的,不能按照属性的属性进行解构,而是必须与对象的属性名同名才能实现解构)
let {name,p,age} = {age:20,name:'张三',p:{xxx:'xxx'}}
console.log(name,age,p)//张三 20 Object
rest参数,收集多个变量,放到该变量中
语法:
...变量名
arguments对象会接受所有的实参,不管有没有对应的形参来接收
function fun(a,b){
console.log(arguments)
}
fun(1,2,3,4,5)
// rest参数 把实参传入的多余的数据,收集起来存放到数组
// 注意rest变量是真数组不是类数组
// rest参数只能放到所有形参的末尾 或者单独使用
// function fun(a,b,...xxx){
// console.log(a,b,xxx)
// console.log(Array.isArray(xxx))
// }
// fun(1,2,3,4,5,6)
实例对象API | STRING实例对象API | ARRAY实例对象API | ||
---|---|---|---|---|
length属性 | 获取字符串的长度console.log(str.length) | length属性 | 返回或者设置数组的长度console.log(arr.length) | |
charAt方法 | 通过”下标“访问对应字符(默认值为0) console.log(str.charAt(0)) | at方法 | 通过下标访问对应的数组元素console.log(arr.at(0))注意:负数是从数组元素从右到左开始计算 | |
charCodeAt方法 | 访问”下标“对应字符编码 console.log(str.charCodeAt()) | 数组元素的修改 | 数组[下标值] = 表达式 arr[0] = 'x' | |
concat 方法 | 将一个或多个字符串与现有的字符串进行拼接,形成一个新字符串返回 console.log(str1.concat(str2,str3,...)) | concat 方法 | 连接多个数组,返回一个新数组 console.log(str1.concat(str2,str3,...)) | |
split方法 | 使用指定的分隔符字符串,将一个string对象进行分割,形成一个字符串数组返回console.log(str.split(' 分割字符串',返回的数组元素个数)) | join 方法 | 将数组中的元素进行合并,通过指定的分隔符! 合并后形成一个字符串并返回 语法规则:join(str) 默认情况 str为',' | |
toLowerCase 方法toUpperCase 方法 | 将大写字母转换成小写字母 将小写字母转换成大写字母 | 为数组添加元素 | 1. Unshift方法:对数组开始位置添加一个或多个元素2. push方法:对数组末尾添加一个或多个元素3. splice方法:splice(开始删除的下标,0,添加元素) | |
去除字符串的空白字符(空格 水平制表符tab 换行符 等) | 1. trim 去除字符串前后两端的空白符如果biginIndex<endIndex 两者进行交换2. trimStart 去除开头空白符console.log(str.trimStart())3. trimEnd 去除结尾空白符console.log(str.trimEnd()) | 删除数组元素 | 1. pop方法(删除数组最后一个元素,并返回)2. shift方法(删除数组第一个元素,并返回)3. splice(开始删除的下标,删除个数) | |
检查是否包含特定的子串 | 1. indexOf 方法(正向查找) 从当前字符串的指定位置中查找第一个出现的特定的子串的位置索引, 如果查找成功 则放回该子串字符的首字符索引下标,如果未查找成功则返回 -1 语法: str.indexOf(searchValue[,fromIndex]) fromIndex默认值是0 2、 lastIndexOf 方法(反向查找) 从当前字符串的指定位置中查找第一个出现的特定的子串的位置索引, 如果查找成功 则放回该子串字符的首字符索引下标,如果未查找成功则返回 -1 语法: str.lastIndexOf(searValue[,fromIndex]) fromIndex默认值是0 3、 incudes方法判断当前字符串中有没有指定的某个子串,如果有则返回 true 没有则返回false 4、 starsWith方法 判断当前字符串是否以某个指定字符串进行开头 根据情况返回 true 或者 false 5、 endWith方法判断当前字符串是否以某个指定字符串进行结尾 根据情况返回 true 或者 false | reverse方法 | 数组反序 | |
截取字符串相关方法 | 1、 slice 方法 截取某个字符串中的一部分,并返回一个新的字符串,不会改变原字符串console.log(str.slice(beginIndex,endIndex-1))2、subString 方法返回一个字符串在开始索引到结束索引之间字符串console.log(str.slice(beginIndex,endIndex-1))注意:不支持负数形式。如果biginIndex<endIndex 两者进行交换 | sort方法(排序) | 该方法是对数组中的元素进行排序,可接受参数,但是参数必须是函数(比较函数) 如果不传入比较函数,他会按照字符编码进行排序 比较函数 :函数体内部主要是做比较运算 // let arr = [4,1,2,5,100,200] // // arr.sort() // // console.log(arr) // arr.sort((a,b)=>{ // console.log(66) // return b-a // }) |