我是靠谱客的博主 微笑香氛,最近开发中收集的这篇文章主要介绍前端面试之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和,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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和所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部