准备面试---js

110 阅读4分钟

js的数据类型有哪些?

js一共有8种数据类型,其中基本数据类型有:string、number、boolean、null、undefined、symbol、biglnt,引用型数据类型:Object(Array、function)。
其中symbol、biglnt是es6新增的数据类型,symbol是独一无二且不可变的数据类型,主要解决可能出现全局变量冲突的问题,biglnt是可以安全的存储和操作大整数,即使这个数已经超过number能够安全表示的范围。
基本数据类型是存放在 内的,引用型数据类型是存放在 内的。

栈和堆的概念及区别?

  • 栈:栈是一种后进先出的数据结构,栈中存放基本数据类型和引用类型的内存地址,操作速度快且有大小限制。
  • 堆:堆是一种无序的数据结构,堆中主要存放引用类型的对象数据,大小较大且动态分配。

js怎么判断数据类型?

  • typeOf:运算符,返回字符串,表示给定的数据类型,判断object、array、null都会返回object。
  • instanceOf:返回boolean值,只能判断引用型数据类型。
  • constructor:每个对象都有constructor属性,可以得知某个实例对象,是哪个构造函数产生的。null和undefined是没有constructor的。
  • Object.prototype.toString.call():返回一个 [objiect XXX] 的字符串。

js怎么判断数组?

  • Array.isArray()
  • Object.prototype.toString.call()
  • 通过原型判断 arr.__proto__ === Array.prototype

null和undefined的区别?

null是空对象,表示一个变量已经声明但是值为空或者不存在。
undefined是未定义,表示未声明变量或者声明未赋值。

==和===的区别?

==是两边值相等,类型不一样,会强制转换类型做比较。
===不会强制转换类型做比较,值相等类型不等,返回false。

怎么修改this的指向?有什么区别?

  • bind:返回一个新的函数并绑定指定的对象作为this,不立即执行,可传递参数。
  • call:不会返回新的函数,立即调用函数并指定this,参数是以列表形式传递。
  • apply:不会返回新的函数,立即调用函数并指定this,参数是以数组形式传递。
  • 箭头函数:继承外部函数的this,没有自己的this,也不能修改自己的this。

数组的方法有哪些?

  • push、pop:向数组末尾添加或删除
  • shift、unshift:向数组首部添加或删除
  • splice:添加、删除、替换
  • slice:截取
  • sort、reverse:排序
  • concat:拼接
  • indexOf、lastIndexOf :筛选
  • filter:过滤
  • join:将数组转换字符串
  • map、forEach:遍历数组
  • some:判断数组中的元素至少有一个满足条件,返回布尔值
  • every:判断数组中的元素全部满足条件,返回布尔值
  • reduce:累积数组的元素,从左到右依次处理数组中的元素,返回一个值。
  • includes:判断数组是否包含指定元素,返回布尔值。
  • find:查找数组中满足指定条件的第一个元素,找到则返回该元素,否则返回undefined。
  • findIndex:查找数组中满足指定条件的第一个元素的索引,找到则返回该索引,否则返回-1。

改变原数组的方法有 :push、pop、shift、unshift、splice、reverse、sort
不会改变原数组的方法有 :concat、slice、join、indexOf、lastIndexOf、includes、find、findIndex、every、some、map、forEach、filter、reduce

forEach和map的区别?

forEach没有返回值,不会创建新的数组,map有返回值,返回新的数组,不会改变原数组。

数组去重

    //第一种方法
    function removeArr(arr) {
        let newArr = [];
        for(let i = 0; i <arr.length; i++) {
            if(newArr.indexOf(arr[i]) ===-1) {
                newArr.push(arr[i]);
            }
        }
        return newArr;
    }
    
     //第二种方法
    function removeArr(arr) {
        return [... new Set(arr)];
    }
    
    //第三种方法
    function removeArr(arr) {
        return arr.filter(function (item,index,arr) {
            return arr.indexOf(item,0) === index;
        })   
    }

let、const、var的区别?

  • 块级作用域:let、const有块级作用域,var没有。
  • 变量提升:var有变量提升,let、const没有。
  • 重复声明:var可以重复声明,let、const不行。
  • 给全局添加属性:var声明的变量会被添加为全局对象window的属性,但是let和const不会。
  • 设置初始值:let和var可以不设置初始值,const必须设置初始值。
  • 暂时性死区:使用let、const声明的变量之前,该变量都是不可用的,var可以。