概述
1.JavaScript有哪些数据类型?
答:基本数据类型:String、Null、Number、Undefined、Boolean、Symbo;
引用数据类型:Object、Array、Function。
2.null和undefined的区别?
答:null和undefined都是基本数据类型,这两个基本数据类型分别只有一个值,就是null和undefined。
undefined代表的含义是未定义的,null代表的含义是空对象。一般声明了但还没有定义的时候会返回undefined,null主要用于赋值给一些可能会返回对象的变量,作为初始化。
undefined在JavaScript中不是一个保留字,这意味着可以使用undefined来作为一个变量名,但是这样的做法是非常危险的,它会影响undefined值的判断。我们可以通过一些方法获得安全的undefined值,比如void。
当对这两种类型使用typeof进行判断时,null类型会返回object,这是一个历史遗留问题。当使用双等号对两种类型的值进行比较时,会返回true,使用三个等号时会返回false。
3.==和===的区别?
答:使用双等号(==)进行相等判断时,如果两边的类型不一致,则会进行强制类型转化后再进行比较;
使用三等号(===)进行判断时,如果两边的类型不一致时,不会强制类型转换,直接返回false。
4.如何获取安全的undefined值?
答:因为undefined是一个标识符,所以可以被当作变量来使用和赋值,但是这样会影响undefined的正常判断。表达式void__没有返回值,因此返回结果是undefined。void并不改变表达式的结果,只是让表达式不返回值。因此可以用void0来获得undefined。
5.typeof NaN的结果是什么?
答:NaN指“不是一个数字”,NaN是一个“警戒值”,用于指出数字类型中的错误情况,即“执行数学运算没有成功,这是失败后返回的结果”。
typeof NaN; //"number"
NaN是一个特殊值,它和自身不相等,是唯一一个非自反的值。而NaN!==NaN为true。
6.isNaN和Number.isNaN函数的区别?
答:函数isNaN接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的值都会返回true,因此非数字值传入也会返回true,会影响NaN的判断。
函数Number.isNaN会首先判断传入参数是否为数字,如果是数字再继续判断是否为NaN,不会进行数据类型的转换,这种方法对于NaN的判断更为准确。
7.typeof null的结果是什么,为什么?
答:typeof null的结果是Object
在JavaScript第一个版本,所以值都存储在32位的单元中,每一个单元一个小的类型标签以及当前要存储的值的真实数据。类型标签存储在每个单元的低位中,共有五种类型:
000:object -当前存储的数据指向一个对象
1:int -当前存储的数据是一个31位的有符号整数。
010:double -当前存储的数据指向一个双精度的浮点数。
100:string -当前存储的数据指向一个字符串。
110:boolean -当前存储的数据是一个布尔值
如果最低为是1则类标签标志位的长度只有一位;如果最低位是0,则类标签标志位的长度占三位,为存储其他四种数据类型提供了额外两个bit的长度。
有两种特殊数据类型:
undefined的值是(-2)^30(一个超出整数范围的数字)
null的值是机器码NULL指针(null指针的值全是0)
那就是说null的类型标签也是000,和object的类型标签一样,所以会被判定为Object.
8.let、var、const的区别?
答:(1)let、const存在块级作用域,var不存在块级作用域;
(2)let、const不存在变量提升,var存在变量提升;
(3)let、const不会给全局添加属性,var声明的变量为全局变量,将该变量添加为全局对象的属性;
(4)let、const不允许重复声明变量,var可以重复声明变量;
(5)let、const声明的变量存在暂时性死区,var不存在;
(6)var、let可以不用设置初始值,const声明的变量必须设置初始值
(7)let、var创建的变量可更改指针指向,const声明的变量不允许改变指针的指向。
9.箭头函数与普通函数的区别?
答:(1)箭头函数不能绑定arguments,取而代之的是rest的...解决,更简洁
(2)箭头函数是匿名函数,不能作为构造函数,不能使用new
(3)箭头函数没有原型属性,prototype
(4)箭头函数不能绑定this,会将离自己最近的一个普通函数的this作为自己的this,且继承的this指向永远不会改变
(5)call、apply、bind无法改变箭头函数中的this指向
(6)箭头函数不能用作Generator函数,不能使用yeild关键字
10.const对象的属性可以修改吗?
答:const保证并不是变量的值不能改动,而是变量指向的那个内存地址不能改动,对于基本数据类型的数据,其值就保存在变量指向的那个内存地址,因此等同于常量。
对于引用类型的数据(主要是对象和数组)来说,变量指向数据的内存地址,保存的只能是一个指针,const只能保证这个指针是固定不变的,至于它指向的数据结构是不是可变的,就完全不能控制了。
11.扩展运算符的作用及使用场景
(1)对象扩展运算符
对象的扩展运算符(...)用于取出参数对象中所有可遍历属性,拷贝到当前对象之中。
Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。Object.assign方法的第一个参数是目标对象,后面的参数都是源对象。(如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性)。
同样,如果用户自定义属性,放在扩展运算符后面,则扩展运算符内部的同名属性会被覆盖掉。
利用上述特性就可以很方便的修改对象的部分属性。在redux中的reducer函数规定必须是一个纯函数,reducer中state对象要求不能直接修改,可以通过扩展运算符把修饰符路径的对象都复制一遍,然后产生一个新的对象返回。
需要注意:扩展运算符对对象实例的拷贝属于浅拷贝。
(2)数组扩展运算符
数组的扩展运算符可以将一个数组转换为用逗号分隔的参数序列,且每次只能展开一层数组。
将数组转换为参数序列
function add(x,y){
return x+y;
}
const numbers=[1,2];
add(...numbers) //3
复制数组
const arr1=[1,2];
const arr2=[...arr1];
扩展运算符(...)用于取出参数对象中所有可遍历属性,拷贝到当前对象之中,这里参数对象是个数组,数组里面的所有对象都是基础数据类型,将所有基础数据类型重新拷贝到新的数组中。
合并数组
const arr1=["two","three"];
const arr2=["one",...arr1,"four","five"]; //["one","two","three","four","five"]
扩展运算符与解构赋值结合起来,用来生成数组
const[first,...rest]=[1,2,3,4,5];
first //1
rest //[2,3,4,5]
如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。
将字符串转为真正的数组
[...'hello'] //["h","e","l","l","o"]
任何Iterator接口的对象,都可以用扩展运算符转为真正的数组
function foo(){
const args=[...arguments];
}
用于替换es5中的Array.prototype.slice.call(arguments)写法
使用Math函数获取数组中特定的值
const numbers=[9,4,7,1];
Math.min(...numbers); //1
Math.max(...numbers); //9
12.ES6中模板字符串与字符串处理
ES6新增的创建字符串方式使用反引号``定义
let name=`张三`;
模板字符串的第一个优势---允许使用${}的方式嵌入变量。模板字符串的关键优势有:
在模板字符串中,空格、缩进、换行都会被保留;模板字符串完全支持“运算”式的表达式,可以在&{}里完成一些计算。
模板字符串新增了:
includes():判断字符串与子串的包含关系
startWith():判断字符串是否以某个、某串字符开头
endWith():判断字符串是否以某个、某串字符结尾
repeat():将原字符串重复n次,返回一个新字符串
13.Set和Map
Map对象保存键值对。任何对象或原始值都可以作为一个键或一个值。构造函数Map可以接受一个数组作为参数。set、delete、has、get
Set对象允许你存储任何类型的值,无论是原始值或对象引用。它类似于数组,但是成员的值都是唯一的,没有重复的值。可以进行数组去重。add、delete、has
最后
以上就是微笑香氛为你收集整理的前端面试之JavaScript1.JavaScript有哪些数据类型?2.null和undefined的区别?3.==和===的区别?4.如何获取安全的undefined值?5.typeof NaN的结果是什么?6.isNaN和Number.isNaN函数的区别?7.typeof null的结果是什么,为什么?8.let、var、const的区别?9.箭头函数与普通函数的区别?10.const对象的属性可以修改吗?11.扩展运算符的作用及使用场景12.ES6中模板字符串与字符串处理13.Set和的全部内容,希望文章能够帮你解决前端面试之JavaScript1.JavaScript有哪些数据类型?2.null和undefined的区别?3.==和===的区别?4.如何获取安全的undefined值?5.typeof NaN的结果是什么?6.isNaN和Number.isNaN函数的区别?7.typeof null的结果是什么,为什么?8.let、var、const的区别?9.箭头函数与普通函数的区别?10.const对象的属性可以修改吗?11.扩展运算符的作用及使用场景12.ES6中模板字符串与字符串处理13.Set和所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复