前端零散知识点收集

189 阅读4分钟

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));

结果:

去重结果
9.我又踩坑了
冒泡排序:

/*
 * @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/ 内层组件