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可以。