1.用数组表示的对象,也可以用对象表示:
eg:a=[1,2,3,4] 等同于 a={0:1,1:2,2:3,3:4}
数组的本质:有序数据的集合
对象的本质:无序数据的集合
当对数据顺序有要求的时候,用数组。当对数据顺序没要求的时候,用集合。
关联数组是对象 eg:a['foo']='Hello World';
2.闭包
变量作用域
在JavaScript中,函数内部可以直接访问全局变量
外部函数无法直接访问内部变量,除非return回去(也就是闭包思想)
3.js获取元素位置的几种办法
- document元素的clientHeight和clientWidth属性(不包含滚动条和border)
- scrollHeight和scrollWidth属性(包含滚动条)
4.this
函数调用:this 指向全局对象
方法调用:this指向执行该方法的对象
构造函数调用:this指向new的这个对象
apply、bind:this指向绑定的对象
5.封装
- JavaScript中规定,每个构造函数都有prototype属性,指向另一个对象。prototype处于内存之中
- 对象之中继承的5种方法(构造函数):
1、使用call或apply
2、prototype指向被继承对象
3、子对象的prototype继承父对象的prototype
4、利用空对象作为中间件
5、拷贝继承 - 非构造函数之间的继承
1、通过object()函数
2、浅拷贝
3、深拷贝
6.用js码一个快速排序的方法
//参照阮一峰先生的方法实现
var quickSort = function(arr){
if(arr.length<2){
return arr;
}//判断数组长度
var mid = Math.floor(arr.length / 2);
var midData = arr.splice(mid,1)[0];//选择基准
var left = [];
var right = [];//声明两个空数组,用于存储小的和大的元素
arr.forEach(item => {
//小的放左边,大的放右边
if (item > midData){
right.push(item);
}else{
left.push(item)
}
});//对数组进行排序
return quickSort(left).concat([midData],quickSort(right));//执行递归操作,并将数组的每一个不封concat起来
}
//注意:变量的声明记得加var,不加var可能会报错,或者效果不一样(var声明的在函数体内是局部变量,不加var的默认是全局变量)
7.JavaScript模拟出类的3种方法
1、构造函数法,new出来
2、Object.create()方法
3、模拟面向对象生成类的方法。
8.数组去重
/* 俺们试着遍历数组,并且去重 */
// 思路1:创建一个空数组,遍历原数组,如果新数组中有该元素,则不添加。否者就添加进去
var unique = function(arr){
var newArr = [];
arr.forEach(item1 => {
// forEach() 对于空数组是不会执行回调函数的。
var sign = false;/* 添加标识 */
for(var i=0;i<newArr.length;i++){
// 外层循环的一个数组与内层循环的每个数组进行比较
if(item1 === newArr[i]){
sign = true;
break;
}
}
if(!sign){
newArr.push(item1);
}
});
return newArr;
}
var arr = ['ks','ks','dj'];
console.log(unique(arr));
结果:
冒泡排序:
/*
* @Description: js实现冒泡排序
* @Author: Do not edit
* @Date: 2019-08-16 14:44:30
* @LastEditTime: 2019-08-16 16:20:50
* @LastEditors: winki
*/
var arr = [22,2,16,2349,1234,654,6,1234,43,43245,23,45,12,43,1324,6,54,6,5564,1,134,4];
var bubble = function(arr){
for (let i = 0; i < arr.length; i++){
for (let j = 0; j < arr.length; j++) {
//交换位置
if(arr[i]>arr[j]){
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr;
};
console.log(bubble(arr));
注意:本来想着直接用forEach解决上面的编码实现,结果,forEach原来无法直接改变数组,要想改变数组,只能通过arr[i]的方式实现
9.实现对某个数字进行操作
eg:输入9119 要求:对每个数字进行平方,然后输出结果811181。以下是代码
function squareDigits(num){
let newArr = [];
let newArr2 = '';
String(num).split('').forEach(item =>{
newArr.push(item*item);
});
//forEach cannot change the value of base data type
newArr.forEach(item =>{
newArr2 += ''+item
})
return parseInt(newArr2);
}
//注意:forEach,map函数如果操作应用类型会改变原数组的值,操作基本数据类型不会改变
10.注意:在八进制和十六进制下,数字后不需加点就可直接调用 Number 对象的方法;而在十进制下,需要在数字后加上一点才能调用 Number 对象的方法。
11.vue中常用几种组件通讯的方法
父子组件:props/$emit
兄弟组件或者跨级组件:vuex(比较大的或者公共的一些项目)、provide/inject
vue生命周期中的钩子函数
beforeCreate:初始化data el等(此刻所有的值为undefined)
created:data数据绑定 el(undefined)
beforeMount:初始化el(el中dom赋值,但数据没挂载)
mounted:data(数据已绑定),el(dom赋值完成,数据已挂载)
vue中vuex的使用:
新建一个js文件
index中import js文件路径,同时export出去
js文件{
state:data等...
action:发送请求等操作
mutation:赋值等操作
}
vue中想使用store中的文件的方法或者数据:
action:this.$store.dispatch(js文件名,请求参数)
mutation:this.$store.commit(js文件名,请求参数)
data:computed:{
...mapState({
data1:state=>state.data1
})
}
vue中的css
1、当 style 标签有 scoped 属性时,它的 CSS 只作用于当前组件中的元素。
2、你可以在一个组件中同时使用有 scoped 和非 scoped 样式:(两种样式同时作用)
使用scoped父组件不会渗透到该子组件
不使用scoped,父组件样式会渗透子组件
vue中的深度选择器:
外层组件 >>> 内层组件 or 外层组件 /deep/ 内层组件