js常见面试题(一)

  1. 原始值和引用值类型及区别
    原始值: 存储在栈中的简单数据段,即他们的值直接存储在变量访问的位置。
    包括五种原始类型:undefined、null、boolean、number、string。
    引用值:存储在堆中的对象,即存储在变量处的值是一个指针,只想存储对象的内存处。
    包括:object、array、function等

  2. 判断数据类型typeof、instanceof、Object.prototype.toString.call()、constructor
    单目运算符typeof()返回值为一个string类型
    双目运算符instanceof()在框架间传递变量时,无法使用instanceOf检测类型 可以检测某对象是否是一个自定义对象的实例
    object.prototype.toString.call(obj)方法会将自定义的对象识别为object

  3. 类数组与数组的区别与转换
    类数组对象:arguments (包含传入函数中的所有实参集合,有个callee属性,指向拥有这个arguments对象的函数)
    DOM对象列表
    区别:
    相同点:都可用下标访问每个元素,都有length属性。
    不同点:数组对象的类型是Array,类数组对象的类型是object,也就是说类数组原型是Object;类数组不具有数组所具有的方法,数组遍历可以用 for in和for循环,类数组只能用for循环遍历。

  4. 数组的常见API
    (1)不改变原数组
    1)String(arr):将数组转化为字符串
    2)join():把数组中的所有元素放入一个字符串,默认为’,’,也可以自定义分隔符
    3)concat():数组拼接
    4)slice():切割 含头不含尾
    5)indexOf:返回指定字符串值在字符串中首次出现的位置
    (2)改变原数组
    1)splice:从数组中添加/删除项目,然后返回被删除的项目(splice(i,n)从开始n个元素)
    2)reverse:反转原数组
    3)sort:排序
    4)push:末尾添加新元素
    5)pop:删除返回数组的最后一个元素
    6)shift:删除第一个元素并返回
    7)unshift:
    迭代方法(以下方法都不会修改数组中包含的值):
    every():对数组中的每一项运行给定的函数,如果该函数对每一项都返回true,则返回true。
    filter():对数组中的每一项运行给定的函数,返回该函数会返回true的项组成的数组。
    forEach():对数组中的每一项运行给定的函数。这个方法没有返回值。
    map():对数组中的每一项运行给定的函数,返回每次函数调用的结果组成的数组。
    some():对数组中的每一项运行给定的函数,如果该函数对任一项返回true,则返回true。

  5. bind、call、apply的区别
    apply的实现和call很类似,但是需要注意他们的参数是不一样的,apply的第二个参数是数组或类数组.
    bind 和call/apply 有一个很重要的区别,一个函数被 call/apply 的时候,会直接调用,但是bind 会创建一个新函数。当这个新函数被调用时,bind() 的第一个参数将作为它运行时的 this,之后的一序列参数将会在传递的实参前传入作为它的参数。

  6. new的原理
    在调用new的过程中:
    1)新生成对象
    2)链接到原型
    3)绑定this
    4)返回新对象
    //定义create方法,实现类似new的方法
    function create(){
    //定义空对象
    let obj = {};
    //取出参数列表的第一个参数(构造函数)
    let Con = [].shift.call(arguments);
    //手动指正obj的构造函数为Con(链接原型)
    obj.proto = Con.prototype;
    //调用Con,改变this为obj,传入剩余参数arguments
    let result = Con.apply(obj,arguments);
    //考虑到Con函数中有return的原因,需要对result进行判断
    return result instanceof Object ? result : obj
    }

  7. 如何正确判断this?
    谁调用它,this 就指向谁

  8. 闭包及其作用
    闭包就是能够读取其他函数内部变量的函数
    由于在javascript中,只有函数内部的子函数才能读取局部变量,所以说,闭包可以简单理解成“定义在一个函数内部的函数“。所以,在本质上,闭包是将函数内部和函数外部连接起来的桥梁
    闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会在f1调用后被自动清除。(正常机制中,在函数被调用结束之后,类似于垃圾回收制回收)。
    缺点:1)浪费内存2)可以改变父级元素中的变量值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值