某小公司面试记录

记录一次面试过程,还有一些笔试题,挺简单的,排序,去重,this指向,深浅拷贝,微任务的执行顺序,变量提升等。

ES6数组新增的方法

Array.from: 将两类对象转为真正的数组:

  1. 类似数组的对象
  2. 可遍历的对象
  3. 包括es6新增的数据结构 Set 和Map
let arrayLike = {
    "0":"a",
    "1":"b",
    "2":"c",
    length:3
}
let arr2 = Array.form(arrayLike); //["a","b","c"]

//还可以将arguments的对象转化成数组
function foo (){
	let args = Array.from(arguments)
}
// 只要是部署了 Iterator 接口的数据结构,Array.from都能将其转为数组,字符串和 Set 结构都具有 Iterator 接口
Array.from("hello");
//["h","e","l","l","o"]

let namesSet = new Set(["a","b"]);
Array.from(namesSet) //["a","b"]


扩展运算符:(…) 将一个数组转为用逗号分隔的参数序列

console.log(...[1,2,3])
// 123 

Array.of:将一组值来转化成数组。

Array.of(3,11,8)//[3,11,8]

copyWithin():将指定位置的元素复制到目标位置(会覆盖掉原有的值)。

Array.prototype.copyWithin(target,start = 0,end = this.length);
//它接受三个参数
1.target (必需要):从该位置开始替换数据,如果为负值,表示倒数。
2.start(可选): 从该位置开始读取数据,默认为0。如果表示负值,则表示从末尾开始计算。
3.end(可选): 到该位置前停止读取数据,默认等于等于数组的长度,如果为负值,表示从末尾开始计算。

find():用来找出第一个符合条件的数组元素,它的参数是一个回调函数,所有的数组元素依次执行该回调函数,直到找到符合要求的元素

[1, 4, -5, 10].find((n) => n < 0) // -5

findIndex():用来寻找符合条件的元素的下标

[1,2,5,10,11].findIndex(function(value,index,arr){
    return value > 9;
}) //2

fill 方法使用给定值,填充一个数组

["a","b","c"].fill(7);
//[7,7,7]

//方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置。
["a","b","c"].fill(7);
//['a', 7, 'c']
  1. `entries()``

  2. ``keys()`

  3. values():这三个数组用来遍历数组,它们都返回一个遍历器对象,可以用for … of 循环进行遍历。

    for (let index of ["a","b"].keys()){
        console.log(index)
    }
    //0
    //1
    
    for(let elem of ["a","b"].values()){
    	console.log(elem)
    }
    // "a"
    // "b"
    
    for(let [index,elem] of ["a","b"].entries()){
    	console.log(index,elem)
    }
    //0 "a"
    // 1 "b"   
    // for...of循环,可以手动调用遍历器对象的next方法,进行遍历。
    

    includes():返回一个布尔值,表示某个数组是否包含给定的值,与字符串includes

    [1,2,3].includes(2) // true
    [1,2,3].includes(4) //false
    

    flat( ) 用于将嵌套的数组,打平,变成一维的数组,该方法返回一个数组,对原数据没有影响。

    // [1, [2, [3]]].flat(Infinity) // 参数代表要嵌套的次数。 
    // [1, 2, 3] 
    

    flatMap() 方法对原数组的每个成员执行一个函数,然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组。

    [2,3,4].flatMap((x)=>[x,x*2])
    // 2,3,4, 6,4,8
    
    //然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组。
    [1, 2, 3, 4].flatMap(x => [[x * 2]])
    // [[2], [4], [6], [8]]
    

    sort 利用原地算法对数组顺序进行排序

    默认排序顺序是在将元素转换为字符串,然后比较它们的 UTF-16 代码单元值序列时构建的

    const array1 = [1, 30, 4, 21, 100000];
    array1.sort();  //1, 100000, 21, 30, 4
    

reduce 如何使用?

reduce如何使用

遍历对象的方法!

  1. for … in 循环:

for … in 循环可以遍历一个对象的所有可以枚举的属性,包括自身属性,和原型链上的属性。

语法:

let obj = {name:"Li",age:18}
for (let key in obj){
    if(obj.hasOwnProperty(key)){
		console.log(obj[key])
    }
}

其中,obj为要遍历的对象,key为当前属性的名称。

注意事项:在使用for… in 遍历对象的时候,应该使用hasOwnProperty 方法来判断属性是否为对象本身的属性,而非原型链上的属性。

  1. Object.keys方法()

Object.keys()方法:可以返回一个对象所有自身的可枚举属性的名称组成的数组。

代码:

let obj = {name:"Li",age:18}
let keys = Object.keys(obj);
console.log(keys) //[name, age]

obj为要遍历的对象,keys 为返回的属性名称数组。

  1. Object.values()方法

Object.values()方法可以返回一个对象所有自身的可枚举属性的值组成的数组。

代码:

let obj = {name:"Li",age:18};
let values = Object.values(obj);
console.log(values)  //['Li', 18]
  1. Object.entries()方法可以返回一个对象所有自身的可枚举的属性的名称和值组成的数组。

代码:

let obj = {name:"Li",age:18};
let values = Object.values(obj);
console.log(values)  // ['Li', 18]

for of 可以遍历数组么?

for...of循环可以用于遍历数组。在for...of循环中,每次迭代会返回数组的一个元素值,循环将继续直到所有的元素都被迭代。

const arr = [1, 2, 3];

for (const item of arr) {
  console.log(item); // 1 2 3
}

for...of循环只能遍历可迭代对象,而数组是一种可迭代对象,有迭代器的属性。

for of 如何遍历一个对象?

答: for … of本身 不可以遍历对象只可以遍历可迭代对象,如果非要迭代可以这样来模拟。

const obj = {a: 1, b: 2, c: 3};

for (const [key, value] of Object.entries(obj)) {
  console.log(`${key}: ${value}`); //a:1,b:2,c:3
}

对象转换成 类数组的方法有哪些?

object.values

object.keys

object.entirys

2x undefined = NAN;

宏任务,微任务,主线程

主线程是:js从上向下执行的顺序叫做主线程。

宏任务:异步任务如,定时器是宏任务。

微任务:promise,async,await,nexttick 这些都是微任务

vue2的生命周期。

vue2的生命周期分为8个阶段,按顺序依次是:

  1. beforeCreate :实例被创建之前调用,此时数据和初始化都没有开始。
  2. created:实例已经完成数据加载,属性和方法的运算也已经结束,这个阶段可以对数据进行预处理操作。
  3. beforeMount:在挂载之前被调用,相关render函数首次被调用。
  4. mounted:实例被挂在到DOM上后调用,可以在这里访问到DOM节点。
  5. beforeUpdate:数据更新时调用,但是此时虚拟DOM还没有重新渲染,所以这里不能操作DOM。
  6. updated:虚拟DOM重新渲染和打补丁之后调用,所以这里可以进行DOM操作。
  7. beforeDestory:实例销毁之前调用,在这里可以进行一些清理工作,比如取消定时器、解绑时间等。
  8. destroyed:实例销毁之后调用,这个时候实例上的所有绑定和事件监听已经被解除,子实例也被销毁。

有一个 父组件 一个子组件,他们两个的加载顺序是什么样子的?

在vue2中,父组件和子组件的加载顺序是先父后子,就是父组件会在子组件之前被创建和加载,因为vue 会先解析父组件的模板,因此父组件的生命周期钩子函数会在子组件之前被调用。

具体的加载顺序如下

  1. Vue首先创建父组件实例,并执行父组件的生命周期钩子函数,beforeCreate和created。
  2. 接着Vue解析父组件模板,包括解析子组件标签,并创建子组件实例。
  3. Vue会递归执行子组件的生命周期钩子函数包括beforeCreate,和created
  4. 父组件和子组件的数据响应式绑定完成以后,vue会执行父组件的mounted钩子函数
  5. 最后,vue会递归的执行子组件的mounted钩子函数。

销毁的话呢?

vue中,当父组件销毁时,子组件也会随之销毁。销毁的执行顺序是先子组件再父组件。

具体来说,vue会在销毁父组件之前,先递归销毁其所有子组件,这个过程Vue会按照有深入浅的顺序进行销毁,

也就是先销毁最深层级的子组件,然后逐步向上层级进行销毁,最后才会销毁父组件。

vue-router ,跳转方法区别,路由首位等。

  1. 编程式导航

    1. this.$router.push("/path") :会在浏览器留下历史记录,浏览器的后退按钮会返回到上一个页面。可以触发路由守卫。
    2. this.$router.replace("/path"):不会在浏览器留下历史记录,点击后退按钮不会返回到上个页面
  2. this.$router.push两种传参方式

    1. params对象传参 :仅仅可以传基本类型数据,不能传对象,必须要用name来引入路由。

      this.$router.push({
              name:'Detail',
              params:{
                id:id
              }
            })
      
      1. query传参:使用query传参的时候,参数会被编码成url的查询字符串,参数表现在地址栏上,query可以传递对象等复杂的数据类型,刷新页面不会丢失数据。

        this.$router.push({
                path:'/detail/:id',
                query:{
                  id:id
                }
              })
        

vuex ?命名空间

Vuex 中,命名空间可以将 store 模块化,避免命名冲突和对全局状态的过度依赖。在命名空间下,可以使用相对命名访问模块的 action、mutation 和 getter。

const store = new Vuex.Store({
  modules: {
    user: {
      namespaced: true, // 开启命名空间
      state: { ... },
      mutations: { ... },
      actions: { ... },
      getters: { ... }
    }
  }
})

//在开启命名空间之后,就可以使用 namespaced 属性值作为前缀访问模块的 action、mutation 和 getter。例如:
 // 访问模块的 state
store.state.user.xxx

// 访问模块的 getter
store.getters['user/xxx']

// 调用模块的 action
store.dispatch('user/xxx', payload)

// 调用模块的 mutation
store.commit('user/xxx', payload)

mixin 的理解

  1. mixin可以将组件相同的属性和方法抽离出来形成一个单独的mixin对象,混入到需要用的组件中去,减少代码的重复操作。
  2. mixin会将mixin的属性和方法与组建的属性方法合并,mixin的优先级更高。
export const myMixin = {
  data() {
    return {
      message: 'Hello, World!'
    }
  },
  methods: {
    greet() {
      console.log(this.message);
    }
  }
}
//组件中引入
import { myMixin } from './myMixin.js'

export default {
  mixins: [myMixin],
  mounted() {
    this.greet(); // 输出:Hello, World!
  }
}

为什么data是一个函数,

如果data的选项是一个对象,不同的组件实例共享同一个对象就会造成交叉感染。

而使用函数就可以保证每个组件实例都有自己独立的数据对象。

为什么自定义表单校验可以写在data函数 里面呢。

data是一个函数,用来动态生成组件实例中的初始数据,当组件实例化时,vuejs会调用data函数,将返回的对象作为组件的初始数据,全部可以return 出去,renturn 出去的数据才是一个响应式的数据。

echartsvue那个生命周期初始化。

通常在mounted生命周期中初始化Echarts实例,因为在mounted生命周期中,Vue已经成功地将组件挂载到DOM上,这时我们可以获取到组件对应的DOM元素。

keep-alive 里面如何用的

权限如何做的,菜单栏如何配置的。

  1. 在路由配置文件中定义每个菜单的路由信息,并且为每个路由信息添加一个meta属性用来标记路由的权限。
  2. 然后用路由的生命周期判读特定的角色才可以访问。

如何动态路由 addRouters

  1. 在实现动态路由之前,首先需要在路由中定义一个占位符,用于动态路由的替换。
  2. 然后可以在代码中根据条件生成路由。

柱状图如何调整样式。

Echarts大屏如何适配呢。

  1. 宽高比例适配:在echarts的容器元素中设置宽高比例,让他与设计稿相同。
  2. 图表样式适配,在echarts中的options中设置图表样式。适应不同的分辨率。
  3. 响应式布局

自定义指令。

Vue.js 中的自定义指令(Custom Directive)是一种扩展 HTML 标签的能力,它可以在标签渲染时通过指令来操作 DOM 元素.

使用场景

  • 实现拖拽功能
  • 绑定一些复杂的事件监听器
  • 实现自定义表单验证规则
  • 等等
<template>
  <div v-my-directive></div>
</template>

<script>
export default {
  directives: {
    'my-directive': {
      // 指令选项
      bind: function (el, binding) {
        // 绑定时的处理逻辑
      },
      inserted: function (el, binding) {
        // 插入到 DOM 中时的处理逻辑
      },
      update: function (el, binding) {
        // 更新 DOM 中的节点时的处理逻辑
      },
      componentUpdated: function (el, binding) {
        // 更新组件 VNode 时的处理逻辑
      },
      unbind: function (el, binding) {
        // 解绑时的处理逻辑
      }
    }
  }
}
</script>

我们定义了一个名为 my-directive 的自定义指令,并在组件模板中使用它。在组件定义的 directives 属性中,我们可以为自定义指令指定一系列钩子函数来处理不同的操作。

  • bind:只调用一次,在指令第一次绑定到元素上时调用,可以在这里进行一些初始化设置。
  • inserted:在指令所在的元素插入到 DOM 中时调用。
  • update:当指令所在的元素更新时调用,但是可能在其子元素更新前调用。
  • componentUpdated:当指令所在的组件的 VNode 更新后调用。
  • unbind:只调用一次,在指令与元素解绑时调用,可以在这里进行一些清理工作。

在每个钩子函数中,我们都可以获取到绑定指令的元素 el 和指令绑定时的参数 binding。通过 binding 参数,我们可以获取到指令的名称、绑定的值、修饰符等信息。

通过自定义指令,我们可以轻松地扩展 Vue.js 的功能,实现一些强大的交互效果和业务逻辑。

一个完整的git提交流程。

image-20230303173707929

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/39.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2月编程语言排行榜新鲜出炉,谁又摘得桂冠?

近日&#xff0c;TIOBE公布了2023年2月编程语言排行榜&#xff0c;本月各个语言表现如何&#xff1f;谁又摘得桂冠&#xff1f;一起来看看吧&#xff01; TIOBE 2月Top15编程语言&#xff1a; 详细榜单查看TIOBE官网 https://www.tiobe.com/tiobe-index/ 关注IT行业的小伙伴…

【Linux】冯.诺依曼体系结构与操作系统

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;冯.诺依曼体系结构什么是冯诺依曼体系结构&#xff1f;我们如今的计算机比如笔记本&#xff0c;或者是服务器&#xff0c;基本上都遵循冯诺依曼体系结构…

基于HTML实现浪漫情人节表白代码(附源代码)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Java每日一练(20230312)

目录 1. 两数之和 II ★ 2. 反转链表 ★★ 3. 二叉树的层序遍历 II ★★★ &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 Java 每日一练 专栏 1. 两数之和 II 给定一个已按照 非递减顺序排列 的整数数组 numbers &#xff0c;请你从数…

YOLOv7、YOLOv5改进之打印热力图可视化:适用于自定义模型,丰富实验数据

💡该教程为改进YOLO高阶指南,属于《芒果书》📚系列,包含大量的原创改进方式🚀 💡更多改进内容📚可以点击查看:YOLOv5改进、YOLOv7改进、YOLOv8改进、YOLOX改进原创目录 | 唐宇迪老师联袂推荐🏆 💡🚀🚀🚀内含改进源代码 按步骤操作运行改进后的代码即可�…

Python每日一练(20230309)

目录 1. 删除有序数组中的重复项 ★ 2. 二叉树的最小深度 ★★ 3. 只出现一次的数字 II ★★ &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 1. 删除有序数组中的重复项 给你一个有序数组 nums &#xff0c;请你原地删除重复出现的元素…

裸辞两个月还能不能找到工作?亲身经历告诉你结果·····

这是我在某论坛看到的一名网友的吐槽&#xff1a; 软件测试四年&#xff0c;主要是手动测试&#xff08;部分自动化测试和性能测试&#xff0c;但是用的是公司内部自动化工具&#xff0c;而且我自动化方面是弱项。&#xff09;现在裸辞两个月了&#xff0c;面试机会少而且面试…

总结:电容在电路35个基本常识

1 电压源正负端接了一个电容&#xff0c;与电路并联&#xff0c;用于整流电路时&#xff0c;具有很好的滤波作用&#xff0c;当电压交变时&#xff0c;由于电容的充电作用&#xff0c;两端的电压不能突变&#xff0c;就保证了电压的平稳。 当用于电池电源时&#xff0c;具有交流…

自学前端,你必须要掌握的3种定时任务

当你看到这篇博客的时候&#xff0c;一定会和狗哥结下不解之缘&#xff0c;因为狗哥的博客里不仅仅有代码&#xff0c;还有很多代码之外的东西&#xff0c;如果你可以看到最底部&#xff0c;看到投票环节&#xff0c;我相信你一定感觉到了&#xff0c;狗哥的真诚&#xff0c;狗…

数据结构——第4章 数组与广义表(2)

矩阵1.特殊矩阵的压缩存储1.1对称矩阵1.2.三角矩阵1.2.1.下三角矩阵1.2.2. 上三角矩阵1.3 带状矩阵2.稀疏矩阵2.1. 稀疏矩阵的三元组表存储2.1.1. 稀疏矩阵的转置1.特殊矩阵的压缩存储 矩阵与二维数组具有很好的对应关系&#xff0c;因此在进行科学计算时&#xff0c;常常用二…

两年外包生涯做完,感觉自己废了一半....

先说一下自己的情况。大专生&#xff0c;17年通过校招进入湖南某软件公司&#xff0c;干了接近2年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测试…

Leetcode. 88合并两个有序数组

合并两个有序数组 文章目录归并思路二归并 核心思路&#xff1a; 依次比较&#xff0c;取较小值放入新数组中 i 遍历nums1 &#xff0c; j 遍历nums2 &#xff0c;取较小值放入nums3中 那如果nums[i] 和nums[j]中相等&#xff0c;随便放一个到nums3 那如果nums[i] 和nums[j]中相…

Form Generator扩展 文本 组件

一、form-generator是什么?✨ ⭐️ 🌟 form-generator的作者是这样介绍的:Element UI表单设计及代码生成器,可将生成的代码直接运行在基于Element的vue项目中;也可导出JSON表单,使用配套的解析器将JSON解析成真实的表单。 但目前它提供的组件并不能满足我们在项目中的…

2023年再不会Redis,就要被淘汰了

目录专栏导读一、同样是缓存&#xff0c;用map不行吗&#xff1f;二、Redis为什么是单线程的&#xff1f;三、Redis真的是单线程的吗&#xff1f;四、Redis优缺点1、优点2、缺点五、Redis常见业务场景六、Redis常见数据类型1、String2、List3、Hash4、Set5、Zset6、BitMap7、Bi…

英雄算法学习路线

文章目录零、自我介绍一、关于拜师二、关于编程语言三、算法学习路线1、算法集训1&#xff09;九日集训2&#xff09;每月算法集训2、算法专栏3、算法总包四、英雄算法联盟1、英雄算法联盟是什么&#xff1f;2、如何加入英雄算法联盟&#xff1f;3、为何会有英雄算法联盟&#…

【Linux修炼】16.共享内存

每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 共享内存一.共享内存的原理二.共享内存你的概念2.1 接口认识2.2演示生成key的唯一性2.3 再谈key三.共享资源的查看3.1 如何查看IPC资源3.2 IPC资源的特征3.3 进程之间通过共享内存进行关联四.共享内存的特点五.共享内存的内…

10个最频繁用于解释机器学习模型的 Python 库

文章目录什么是XAI&#xff1f;可解释性实践的步骤技术交流1、SHAP2、LIME3、Eli54、Shapash5、Anchors6、BreakDown7、Interpret-Text8、aix360 (AI Explainability 360)9、OmniXAI10、XAI (eXplainable AI)XAI的目标是为模型的行为和决定提供有意义的解释&#xff0c;本文整理…

C++基础算法①——高精度加减法计算

高精度算法1.导论2.高精度低精度3.高精度高精度4.高精度减法1.导论 当我们利用计算机进行数值计算&#xff0c;有时候会遇到这样的问题&#xff1a; n&#xff01;的精确结果是多少&#xff1f; 当n小于30的时候&#xff0c;我们当然可以通过电脑自带的计算器计算出来。但是当…

「Vue面试题」动态给vue的data添加一个新的属性时会发生什么?怎样去解决的?

一、直接添加属性的问题 我们从一个例子开始 定义一个p标签&#xff0c;通过v-for指令进行遍历 然后给botton标签绑定点击事件&#xff0c;我们预期点击按钮时&#xff0c;数据新增一个属性&#xff0c;界面也 新增一行 <p v-for"(value,key) in item" :key&q…

学习 Python 之 Pygame 开发坦克大战(一)

学习 Python 之 Pygame 开发坦克大战&#xff08;一&#xff09;Pygame什么是Pygame?初识pygame1. 使用pygame创建窗口2. 设置窗口背景颜色3. 获取窗口中的事件4. 在窗口中展示图片(1). pygame中的直角坐标系(2). 展示图片(3). 给部分区域设置颜色5. 在窗口中显示文字6. 播放音…
最新文章