1.JS的组成
JS 由 ECMAScript, BOM, DOM组成
ECMAScript 是Javascript基础规范,定义了Javascript基础语法。
BOM 浏览器对象模型 可以对浏览器窗口进行访问和操作。
DOM 文档对象模型 通过创建树来表示文档,从而使开发者对文档的内容和结构具有控制力。
2.声明变量的几种方式
var , let ,const
var 存在变量提升
var 声明的变量 在声明之前打印,不会报错,但打印出来的是undefined
声明之后没赋值不会报错,但是,打印出来是undefined
let 和 const 不存在变量提升
let 和const 不能在声明之前打印,打印之后会报错,这是因为暂时性死区的原因
const声明的是常量,只有声明的基本数据类型的时候 不可改变,引用数据类型可以改变值
3.JS有哪几种数据类型
JS有两种数据类型
第一种是 基本数据类型,第二种是 引用数据类型
两者的区别
存储的位置不同,基本数据类型存储于栈中,引用数据类型存储于堆中
基本数据类型有:Undefined,Null, Number,String,Boolean, ES6新增 Symbol BigInt
引用数据类型有:Object,Function,Array,Date,RegExp,ES6新增的map和set
4.什么是数组?
数组是由元素组成的有序的集合
声明数组的两种:
1. 字面量声明数组
2. 构造函数声明
数组有长度属性:代表着元素的个数
数组取值 一定要使用 下标 从0开始的
长度 和 下标 没有关系
5. 数组的操作方法
七个内置的操作方法: 改变数组本身
push -- 尾部添加 返回新数组的长度
pop -- 尾部删除 返回的是被删除的元素
shift -- 头部删除
unshift --头部添加
sort -- 排序 返回排序后的数组
reverse -- 数组反转
splice -- 增加 删除 修改;本质上是删除
splice(从哪里开始的下标,删除的长度,要替换的值)
2. 循环遍历数组
forEach -- 对数组进行循环遍历
filter -- 数组过滤 返回 所有符合条件的元素 一个新数组
map -- 对数组的每一项进行操作,返回新数组
some -- 判断数组中是否有满足条件的元素 如果有返回true 没有 false
every -- 判断数组中是否元素是否全部满足条件 如果是返回true 否则 false
indexOf -- 查找第一个符合条件的下标,查到不到返回-1
lastIndexOf -- 查找最后一个符合条件的下标,查到不到返回-1
findIndex -- 查找第一个符合条件的下标,查到不到返回-1
find -- 查找第一个符合条件的元素,查到不到返回undefined
includes -- 是否包含某个元素 如果包含 true;否则 false
3.伪数组
伪数组 / 类数组,和数组类似,有数组的长度属性,但是没有数组原型链上的操作方法
常见的伪数组 : arguments nodeList
伪数组转化为数组方法有3种
var arr = Array.prototype.slice.call(arguments)
var arr = [].slice.call(arguments)
var arr = [...arguments]
5.什么是对象?
对象是一个无序的声明对象
1.声明对象的方式
1.字面量
2.构造函数的
let obj = {} // 字面量
let obj1 = new Object()
如果想声明一个没有原型链的对象 var obj = Object.create(null)
2.对象的取值
两种取值方式: 1. 对象.属性名 2. 对象[]
对象的取值
两种取值方式: 1. 对象.属性名 2. 对象[]
let obj = {
a: 1,
b:2,
key: 123
}
console.log(obj.b)
console.log(obj['b'])
var haha = 'b'
3.对象的循环遍历
常用的有两种
for in ,for of
for(let key in obj){
console.log(key)
console.log(obj[key])
}
for(let key of obj){
console.log(key)
}
4. for in 和 for of的区别
都可以循环数组,for in 循环出来的是下标 for of循环出来的是元素
for in 可以循环对象 for of 不可以循环对象
对象合并 Object.assign(目标对象,要合并的对象)
let obj = {
name: '2111B'
}
// let obj1 = {a:1}
// Object.assign(obj,obj1)
Object.assign(obj,[1,2,3])
6.函数
封装可重复执行的代码块
声明函数的方法:2种(常用的)
字面量声明,关键字声明
1.两种声明方式的区别:
字面量声明的函数属于匿名函数,在函数赋值之前是不能调用的
匿名函数不能作为构造函数使用
关键字声明的函数 声明前后都可以调用
字面量声明
let fn = function(){
}
关键字声明
function fn1(){
}
function 比var 提升的高
console.log(fn)
var fn = 'hello world'
// console.log(fn)
function fn(){
console.log(1)
}
function fn(){
console.log(2)
}
console.log(fn)
var a = 1
var a
console.log(a)
2.函数的参数
形参 -- 形式上的参数 和 实参--实际的参数
3. 函数的返回值
函数的返回值 使用 return ;如果有函数有返回值,函数调用的时候会返回;如果没有,返回undefined , return 之后 代码不会在执行了
7.运算符
= 赋值 == 值是否相等 === 值 数据类型
8.作用域
变量的可使用范围
9.作用域链
当使用一个变量的时候,会首先在当前作用域查找,如果查找不到会继续向外一层作用域查找,直到查到为止;查不到报错 (就近原则)
10.闭包
就是函数 嵌套函数
11.递归
function fn(){
}
fn()
let num = 0
for(var i =0;i<=10;i++){
num+=i
}
12.时间戳
13.随机数(常用的)
Math.ceil()
向上取整
Math.floor()
向下取整
Math.abs()
数字的绝对值
Math.random()
大于或等于 0 且小于 1 的浮点伪随机数
Math.round()
四舍五入到最接近整数的数值
Math.max()
给出的最大数字
Math.min()
给出的最小的数字
14.原生dom绑定事件
一共有三种方法
1. 行内绑定
2. 选择到元素添加事件
3. 添加事件监听
15.ajax
async javascript and xml;实现局部刷新的一门技术
在浏览器内有一个内置的核心对象 XMLHttpRequest
要使用核心对象:
1. 实例化核心对象
2. 建立链接 xhr.open(请求方式,请求地址,同步异步)
// 1. 实例化核心对象
let xhr = new XMLHttpRequest()
// 2. 建立链接
xhr.open('GET','https://api.it120.cc/small4/banner/list')
// 3. 发送请求 (可携带参数)
xhr.send()
// 4. 获取请求的数据
xhr.onreadystatechange = function(){
if(xhr.readyState==4 && xhr.status==200){
console.log(JSON.parse(xhr.response))
}
}
16. 时间戳
从1970年1-1 0时0分0秒 到目前为止的总秒数 单位毫秒
17.setTimeout和setInterval
setTimeout - 一段时间之后执行一次 setInterval 每隔一段时间之后执行一次
延时的时间不写,大概是4ms
// setTimeout(()=>{
console.log(1)
},1000)
setInterval(()=>{
console.log(2)
},1000)
18.Vue指令
v-bind 动态绑定属性的 简写成 :
v-on 绑定事件 简写成 @
v-cloak 防止插值闪烁
v-if 通过动态的 删除或者添加元素 来实现元素的显示和隐藏
v-show
都是控制元素的显示和隐藏的,v-if通过动态的 删除或者添加元素 来实现元素的显示和隐藏
v-show是通过 css的display:none来隐藏元素
v-html -- 会解析标签 (富文本)
v-text -- 不会解析标签
v-pre -- 跳过插值解析
v-once -- 只渲染一次
v-model--双向的数据绑定,form表单
v-for -- 循环遍历
19.事件传播的流程
事件捕获 (从大到小的过程)
目标源
冒泡阶段 (从小到大的过程)
20.事件委托
事件委托,又名事件代理。事件委托就是利用事件冒泡,就是把子元素的事件都绑定到父元素上。如果子元素阻止了事件冒泡,那么委托也就没法实现了
好处:提高性能,减少了事件绑定,从而减少内存占用 比如:瀑布流:无限上拉列表中,如果给每一个图片绑定点击事件,非常繁琐且消耗内存。所以我们可以把每张图片上的点击事件委托给共同的父元素。
21.字符串替换方法
replace()
部分或所有匹配的 apattern
替换为 areplacement
22.Vue methods/computed/watch
1.computed
计算属性,只依赖于所依赖 的值,只会存在他所依赖 的值发生改变的时候,才会改变
不能直接修改计算属性的值,如果要修改,需要将计算属性写成对象形式
2.methods
methods 只有调用的时候才会 触发
23. this指向
this指向:谁调用指向谁
1. 全局中指向window
2. 构造函数中,this指向new出来的实例;比如说vue内的this都指向 vue的实例化
3. 箭头函数不会改变this指向;我通常在请求数据请求回来接受数据的时候,会写成箭头函数
4. 函数中 this指向最后调用的; 汗水在声明的时候是没有this指向的,只有在调用的时候才会有this指向并且谁最后调用指向谁
5. 原生dom点击事件内的this指向 点击的元素
6.当我写代码的时候,通常情况下,我直接 写一个 let vm = this;
24.强制性改变this指向:call bind apply
区别
1.call和 apply会直接调用函数,而bind不会调用函数,需要函数重新调用
2. 参数的区别:
.call(this的指向,参数1,参数2.....)
.apply(this指向,[参数1,参数2.....])
.bind(this指向)(参数1,参数2......)