阅读 34

js常见面试题集锦

箭头函数和普通函数的区别?

  1. 普通函数的this指向调用它的对象,箭头函数里的this是固定的(同时,没有其他的局部变量,比如this, arguments, super),它指向定义该函数时所在的对象。
  2. 箭头函数不能使用new来作为构造函数使用。

new操作符做了些什么?

  1. 创建了一个空对象

var obj = new Object()

  1. 设置原型链

obj.proto= Func.prototype

  1. 让Func的this指向obj, 并且执行Func函数体

Func.call(obj)

  1. 判断Func函数的返回值类型。

如果Func返回值是非引用类型或者没有返回值,则返回obj;如果是引用类型,则返回这个引用类型对象

call, apply和bind的区别?

相同点:都是用来改变函数的this指向

  1. call和apply都是用来在调用函数的时候同时改变this指向,其中call是将函数参数一个一个的传进来,apply则是将函数参数组合到数组中传进来的。
  2. bind只是绑定函数的this, 返回一个改变了this指向的新函数,不会立即执行这个函数。返回的新函数参数中始终有绑定时的参数。
function fn(a, b, c) {
    console.log(a, b, c);
}
var fn1 = fn.bind(null, 'Dot');

fn('A', 'B', 'C');            // A B C
fn1('A', 'B', 'C');           // Dot A B
fn1('B', 'C');                // Dot B C
fn.call(null, 'Dot');      // Dot undefined undefined
复制代码

浅拷贝和深拷贝的区别?

【我所理解的概念】 js基本数据类型是存在栈内存中,比较的是值的比较; 引用数据类型是存在堆内存中,比较的是引用的比较,两个独立的对象,js存储的是两个个指向堆内存的指针地址,将a对象复制给b,是对象保存在栈中地址的复制,他们指向的还是同一个堆地址。所以两者之间操作互相有影响。

深拷贝和浅拷贝是针对对象的概念,包括array.

  1. 浅拷贝指的是只拷贝对象的一层属性,如果属性值里还有对象则不拷贝。

浅拷贝的方法:

Object.assign()

let obj2 = {...obj1}

自定义一个浅拷贝方法:

function shallowCopy (obj) {
    let copyObj = {}
    for (let key in obj) {
        console.log(key, 'key')
        if (obj.hasOwnProperty(key)) {
            copyObj[key] = obj[key]
        }
   }
   return copyObj
}
复制代码
  1. 深拷贝是拷贝一个对象的以及对象的所有子对象

JSON.parse & JSON.stringify, 非数组对象里面的undefined, function, symbol值会被忽略, 数组里的会转换成null。

自定义一个简洁版深拷贝方法:

function deepCopy (obj) {
    let result = {}
    Object.keys(obj).forEach(key => {
        if (obj[key] && typeof obj[key] === 'object') {
            result[key] = deepCopy(obj[key])
        } else {
            result[key] = obj[key]
        }
    });
    return result
 }
复制代码

最后

文章分类
前端
文章标签