笔试

以下代码执行输出结果是什么

  1. function b () {
  2. console.log(a);
  3. var a = 10;
  4. funciton a(){};
  5. a = 100;
  6. console.log(a);
  7. }
  8. b();
  9. // function a(){}
  10. // 100

数组去重, 能写几种写几种

  1. //遍历数组法: 最简单数组去重法
  2. function unique1(array){
  3. var result = []; //一个新的临时数组
  4. //遍历当前数组
  5. for(var i = 0; i < array.length; i++){
  6. //如果当前数组的第i已经保存进了临时数组,那么跳过,
  7. //否则把当前项push到临时数组里面
  8. if (result.indexOf(array[i]) == -1) result.push(array[i]);
  9. }
  10. return result;
  11. }
  12. // 对象键值对法: 速度最快, 占空间最多(空间换时间)
  13. function unique2(array){
  14. var obj = {}, result = [], len = array.length, val, type;
  15. for (var i = 0; i < len; i++) {
  16. val = array[i];
  17. type = typeof val;
  18. if (!obj[val]) {
  19. obj[val] = true;
  20. result.push(val)
  21. }
  22. }
  23. return result;
  24. }
  25. // 数组下标判断法
  26. function unique3(array){
  27. var n = [array[0]]; //结果数组
  28. //从第二项开始遍历
  29. for(var i = 1; i < array.length; i++) {
  30. //如果当前数组的第i项在当前数组中第一次出现的位置不是i,
  31. //那么表示第i项是重复的,忽略掉。否则存入结果数组
  32. if (array.indexOf(array[i]) == i) n.push(array[i]);
  33. }
  34. return n;
  35. }
  36. //排序后相邻去除法 将相同的值相邻,然后遍历去除重复值
  37. function unique4(array){
  38. array.sort();
  39. var re=[array[0]];
  40. for(var i = 1; i < array.length; i++){
  41. if( array[i] !== re[re.length-1])
  42. {
  43. re.push(array[i]);
  44. }
  45. }
  46. return re;
  47. }
  48. // 优化遍历数组法 思路:获取没重复的最右一值放入新数组
  49. function unique5(array){
  50. var r = [];
  51. for(var i = 0, l = array.length; i < l; i++) {
  52. for(var j = i + 1; j < l; j++)
  53. if (array[i] === array[j]) j = ++i;
  54. r.push(array[i]);
  55. }
  56. return r;
  57. }
  58. // es6 set去重
  59. funciton unique6(arr) {
  60. return Array.from(new Set(arr))
  61. <!--或者-->
  62. return [...new Set(arr)]
  63. }
  64. // 利用includes实现去重
  65. function unique7(arr) {
  66. var result = [];
  67. for (var i = 0; i < arr.length; i ++) {
  68. if (!result.includes(arr[i)) {
  69. result.push(arr[i);
  70. }
  71. }
  72. return result;
  73. }
  74. // 利用reduce + includes 去重
  75. function unique8(arr) {
  76. return arr.reduce((prev, cur) => prev.includes(cur) ? prev : [...prev, cur], []);
  77. }
  78. // 利用Map结构去重
  79. function unique9 (arr) {
  80. let map = new Map();
  81. let result = [];
  82. for (var i = 0; i < arr.length; i++) {
  83. if (map.has(arr[i])) {
  84. map.set(arr[i], true);
  85. } else {
  86. map.set(arr[i], false);
  87. result.push(arr[i])
  88. }
  89. }
  90. return result;
  91. }

请列举出三个Vue中常用的生命周期钩子函数

vue组件之间的传值

父子组件如何交流

父到子
  1. <child :a=a @change="change">
  1. 属性:props
  2. vm.$attrs子组件获取未注册的属性
  3. v-bind=”$attrs” 子组件传递给孙子组件
  4. this.重庆网锐科技有限公司 - 图1children 麻烦效率也比较低 不推荐
  1. <div id="app">
  2. <my-content :title="tilte" :content="content" ></my-content>
  3. </div>
  4. <script>
  5. const vm = new Vue({
  6. el: '#app',
  7. data: {
  8. content: 'content',
  9. title: 'title'
  10. },
  11. components: {
  12. myContent: {
  13. props: ['title'],
  14. created() {
  15. console.log(this.$attrs);
  16. },
  17. inheritAttrs: false,
  18. template: `<div> <h3>{{title}}</h3></div>
  19. <my-p v-bind="$attrs"> </my-p></div>`,
  20. components: {
  21. myP: {
  22. props: ['content'],
  23. template: `<p>{{ content }}</p>`
  24. }
  25. }
  26. }
  27. }
  28. })
  29. </script>
  1. provide inject
  1. <div id="app">
  2. <my-content ></my-content>
  3. </div>
  4. <script>
  5. const vm = new Vue({
  6. el: '#app',
  7. provide: {
  8. content: 'content',
  9. title: 'title'
  10. },
  11. components: {
  12. myContent: {
  13. inject: ['title'],
  14. created() {
  15. console.log(this.$attrs);
  16. },
  17. inheritAttrs: false,
  18. template: `<div> <h3>{{title}}</h3></div>
  19. <my-p> </my-p></div>`,
  20. components: {
  21. myP: {
  22. inject: ['content'],
  23. template: `<p>{{ content }}</p>`
  24. }
  25. }
  26. }
  27. }
  28. })
  29. </script>

子 —-》 父
  1. $emit(‘change’, )
  2. ref 引用
  3. $listener 所有绑定事件的函数的集合
  1. <div id="app">
  2. <my-cmp ref="cmp"></my-cmp>
  3. </div>
  4. <script>
  5. const vm = new Vue({
  6. el: '#app',
  7. mounted() {
  8. console.log(this.$refs.cmp.msg);
  9. },
  10. components: {
  11. myCmp: {
  12. data() {
  13. return {
  14. msg: 'hello world'
  15. }
  16. }
  17. }
  18. },
  19. methods: {
  20. cmpFunc() {
  21. console.log('cmp')
  22. }
  23. },
  24. template: `<div></div>`
  25. })
  26. </script>

子组件与子组件如何通信

  1. vuex
  2. event bus 事件总线
  1. Vue.prototype.bus = new Vue();

路由之间跳转, 如何携带参数, 有哪些方式

  1. 1. <router-link :to={params: {}} />
  2. 传参方式:
  3. - params传参(路由的配置 路由配置 path: "/home/:id" 或者 path: "/home/:id"
  4. - query传参 路由不需要额外配置
  5. 2. this.$router.push() (函数里面调用)
  6. - this.$router.push({name:'home',query: {id:'1'}})
  7. - this.$router.push({path:'/home',query: {id:'1'}})
  8. // html 取参 $route.query.id
  9. // script 取参 this.$route.query.id
  10. queryparams区别
  11. query类似 get, 跳转之后页面 url后面会拼接参数,类似?id=1, 非重要性的可以这样传, 密码之类还是用params刷新页面id还在
  12. params类似 post, 跳转之后页面 url后面不会拼接参数 , 但是刷新页面id 会消失

vuex有哪几种属性? 不用vuex会带来什么问题?

  1. VUEX共有五种属性,分别是 State GetterMutation Action Module
  2. 不用vuex会带来的问题
  3. 1、可维护性会下降,你要想修改数据,你得维护三个地方
  4. 2、可读性会下降,因为一个组件里的数据,你根本就看不出来是从哪来的
  5. 3、增加耦合,大量的上传派发,会让耦合性大大的增加,本来VueComponent就是为了减少耦合,现在这么用,和组件化的初衷相背。

vue 双向绑定原理

  1. <div>
  2. <input type="text" id="text">
  3. <p id="show"></p>
  4. </div>
  5. <script>
  6. var obj = {};
  7. Object.defineProperty(obj, 'text', {
  8. get: () => {
  9. return obj['text'];
  10. },
  11. set: (val) => {
  12. show.innerText = val;
  13. text.value = val;
  14. }
  15. });
  16. text.oninput = (e) => {
  17. obj.text = e.target.value;
  18. }
  19. // 新版vue用了Proxy
  20. </script>