JS面试宝典

1、对象的复制、深拷贝和浅拷贝。

js 数据类型8种(Number、String、Boolean、Null、undefined、object、symbol、bigInt)
symbol=本质是唯一标识符,可用作对象的唯一属性
object = (Object、Array、Date、Function、RegExp等)

存储方式:
基本类型:基本类型值在内存中占用固定的内存中,保存在“栈内存”中,闭包变量除外。
引用类型:值是对象,保存在“堆内存”中。

浅拷贝

① 数组的slice和concat 方法。

var a = [ 1, 3, 5, { x: 1 } ];
var b = Array.prototype.slice.call(a);
b[0] = 2;
console.log(a); // [ 1, 3, 5, { x: 1 } ];
console.log(b); // [ 2, 3, 5, { x: 1 } ];

从输出结果可以看出,浅拷贝后,数组a[0]并不会随着b[0]改变而改变,说明a和b在栈内存中引用地址并不相同。

var a = [ 1, 3, 5, { x: 1 } ];
var b = Array.prototype.slice.call(a);
b[3].x = 2;
console.log(a); // [ 1, 3, 5, { x: 2 } ];
console.log(b); // [ 1, 3, 5, { x: 2 } ];

② …扩展运算符
对于值是对象的属性无法完全拷贝成2个不同对象

③ for in

function shallowClone(copyObj) {
  var obj = {};
  for ( var i in copyObj) {
    obj[i] = copyObj[i];
  }
  return obj;
}
深拷贝

① JSON.parse(JSON.strinify() )
弊端比如不能处理函数等
1.拷贝的对象的值中如果有函数,undefined,symbol则经过JSON.stringify()序列化后的JSON字符串中这个键值对会消失
2.无法拷贝不可枚举的属性,无法拷贝对象的原型链
3.拷贝Date引用类型会变成字符串
4.拷贝RegExp引用类型会变成空对象
5.对象中含有NaN、Infinity和-Infinity,则序列化的结果会变成null
6.无法拷贝对象的循环应用(即obj[key] = obj)
总结: 它会抛弃对象的constructor,深拷贝之后,不管这个对象原来的构造函数是什么,在深拷贝之后都会变成Object;这种方法能正确处理的对象只有 Number, String, Boolean, Array, 扁平对象,也就是说,只有可以转成JSON格式的对象才可以这样用,像function没办法转成JSON;

② 函数

③第三方插件(深拷贝库)
lodash
jquery 提供一个.extend.extend可以用来做深拷贝 语法:.extend([deep], target, object1[, objectN] )
**deep:**表示是否深拷贝 默认为false 为true为深拷贝,为false,则为浅拷贝
target: Object类型 目标对象,其他对象的成员属性将被附加到该对象上。
object1 objectN: 可选 Object类型 第一个以及第N个被合并的对象。

var $ = require('jquery');
var obj1 = {
   a: 1,
   b: {
     f: {
       g: 1
     }
   },
   c: [1, 2, 3]
};
var obj2 = $.extend(true, {}, obj1);
console.log(obj1.b.f === obj2.b.f);  // false

2、字符串和数组常用的函数,请举例。

Array( splice=指定位置增删元素、slice=截取元素、join=元素连成字符串、
push=末尾追加元素、concat=数组合并、indexOf=查找指定元素的索引、
includes=检查指定元素是否存在返回布尔(能检测NaNcy)
String ( split=拆分为数组、substr=截取指定位置的元素、indexOf=检查是否包含元素)

3、写一个方法获取URL中的参数转为对象

String.prototype.getURLParames = function () {
  let reg = /([^&?=]+)=([^&?=]+)/g, obj = {};
  this.replace(reg, (...arg) => {
    obj[arg[1]] = arg[2]
  });
  return obj;
}

4、Vue 中组件的通信方式

① props/$emit

描述:父组件通过绑定属性来向子组件传递数据,子组件通过props来接收数据。 子组件通过$emit事件调用父组件的方法来传递数据给父组件。

② provide / inject
③ $parent / $children

this.parent.parentMsg访this.parent.parentMsg 子组件通过该方式访问父组件的实例。 this.children[0].childMsg 父组件访问子组件

④Vuex

5、遍历常用的方法,那种效率最高?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章