JS面试题(三)

简介: JS面试题

es6的面试题


22 let、const、var的区别


块级作用域,变量提升,添加全局属性,重复声明,暂区时性死,初始值设置


1. let 和const具有作用域  


2. var存在变量提升,let和const不存在变量提升


3. 给全局添加属性:


使用var声明的变量,会添加到全局对象window作为属性.可以通过window.变量名访问

let和const不会


4. var声明变量时,可以重复声明变量,相同名变量会覆盖之前声明的。


const和let不允许重复声明变量。


5暂时性死区: 在使用let、const命令声明变量之前,该变量都是不可用的。


这在语法上,称为暂时性死区。使用var声明的变量不存在暂时性死区。


6 初始值设置:在变量声明时,


var 和 let 可以不用设置初始值。


而const声明变量必须设置初始值


23 const对象的属性可以修改吗


答:对象的属性是可以修改的。


因为:


const保证的并不是变量的值不能改动,


而是变量指向的那个[内存地址]不能改动.


对于基本类型的数据(数值、字符串、布尔值),变量指向的那个内存地址.


但对于引用类型的数据(主要是对象和数组)来说,


保存的只是一个指针,const只能保证这个指针的指向是固定不变的。


至于它指向的数据结构【是不是】可变的,就完全不能控制了。


代码解释

const obj={
  name:'咋还尼桑'
}
obj.name='2131'
console.log(obj.name);

24.箭头函数与普通函数的区别


最大区别:1.不能使用new,不能作为构造函数。


2.箭头函数不绑定arguments


3.箭头函数不绑定this,会捕获其所在的上下文的this值,作为自己的this值


4.箭头函数没有原型属性 是undefined


5.箭头函数不能当做Generator函数,不能使用 yield 【有d】 关键字


25. 箭头函数的this指向哪⾥?


箭头函数不同于传统JavaScript中的函数,箭头函数并没有属于⾃⼰的this,


它所谓的this是捕获其所在上下⽂的 this 值,作为⾃⼰的 this 值,


并且由于没有属于⾃⼰的this,所以是不会被new调⽤的


26. 扩展运算符的作用及使用场景


取出对象中的所有可遍历属性,拷贝到当前对象之中

let bar = { a: 1, b: 2 };
let baz = { ...bar }; // { a: 1, b: 2 }

数组的扩展运算符:可以将一个数组转为用逗号分隔的【参数序列】,且每次只能展开一层数组。

console.log(...[1, 2, 3])  // 1 2 3
console.log(...[1, [2, 3, 4], 5])
// 1 [2, 3, 4] 5


27. javascript的typeof返回哪些数据类型. 开始的


答案:string,boolean,number,undefined,function,object。


null 数组 是object


28 字符串与数组的转换


split()前者是将字符串切割成数组的形式,


join() 的区别是将数组转换成字符串


巧计:一串串的,像是脚印,join


29 如何阻止事件冒泡


答案:ie:阻止冒泡e.cancelBubble = true; [kan shuo ba bo]


非IE event.stopPropagation(); [ pa p儿 gA xing]


30 如何阻止默认事件


答案:(1)return false;(2) event.preventDefault();


31 创建新节点


createElement() //创建一个具体的元素


createTextNode() //创建一个文本节点


2)添加、移除、替换、插入


appendChild() //添加


removeChild() //移除


replaceChild() //替换


insertBefore() //插入


32. document load 和document ready的区别


答案:document.onload 是在结构和样式,外部js以及图片加载完才执行js.


document.ready是[dom树创建完成]就执行的方法,原生种没有这个方法,


jquery中有 $().ready(function)


33.Javascript的事件流模型都有什么?


“事件冒泡”:事件由最具体的元素接受,然后逐级向上传播


“事件捕捉”:事件由最不具体的节点先接收,然后逐级向下,一直到最具体的


“DOM事件流”:三个阶段:事件捕捉,目标阶段,事件冒泡


34 js延迟加载的方式有哪些?


1. 按需异步载入js


2.(创建script,插入到DOM中,加载完毕后callBack)、


3. defer和async、动态创建DOM方式


35. 如何获取javascript三个数中的最大值和最小值?


【 mæ θ】Math 数学
Math.max(a,b,c);//最大值
Math.min(a,b,c)//最小值


36.form中的input可以设置为readonly和disable,请问2者有什么区别?


readonly 不可编辑,可以选择和复制;值可以传递到后台


disabled 不可编辑,不能选择和复制;值不可以传递到后台


37 可视区域距离页面顶部的距离


let scrollTop=document.documentElement.scrollTop
||document.body.scrollTop


38. 节点的种类有几种,分别是什么?


(1)元素节点:nodeType ===1;


(3)属性节点:nodeType ===2;


(2)文本节点:nodeType ===3;


元1属2文3


39. {offsetWidth offsetHeight}和{clientWidth clientHeight}的区别


(1)offsetWidth (content宽度+padding宽度+border宽度)
(2)offsetHeight(content高度+padding高度+border高度)
(3)clientWidth(content宽度+padding宽度)
(4)clientHeight(content高度+padding高度)
client [k lai en t]
Width  【wei d  s】


40.判断数组的方式有哪些 (5种)


1.通过原型链做判断


(目标源arr).__proto__ === Array.prototype;


2.通过ES6的Array.isArray()做判断


Array.isArrray(目标源arr); 【əˈreɪ]】


3.通过instanceof做判断


arr instanceof Array


4.通过Array.prototype.isPrototypeOf


Array.prototype.isPrototypeOf(arr) true


5.通过Object.prototype.toString.call()做判断


Object.prototype.toString.call(arr).slice(8,-1) === 'Array';


Object.prototype.toString.call(arr)==="[object Array]"    


1.什么是window对象?什么是document对象?


window对象代表浏览器中打开的一个窗口。


document对象代表整个html文档。实际上,


document对象是window对象的一个属性。


3. JS 中的主要有哪几类错误


JS有三类的错误:加载时错误


加载时错误:加载web页面时出现的错误(如语法错误)称为加载时错误。


运行时错误:由于滥用html语言中的命令而导致的错误。


逻辑错误:这些错误是由于对具有不同操作的函数执行了错误的逻辑而导致的


有趣的循环


for(var i = 1; i <= 3; i++){  //建议使用let 可正常输出i的值
  setTimeout(function(){
      console.log(i);   //4 4 4
  },0); 
};


这个问题说明的是:先执行同步,然后再去执行异步。


let 会产生块级作用


为啥是4, i=4的时候,不满足条件,循环了3次。


let 会产生块级做作用域 输出 1 2 3


有趣的题


var a = 100;
function test() {
  alert(a); //100 
  a = 10; 
  alert(a); //10
}
test();
alert(a); //10


写一个获取非行间样式的函数


function getStyle(obj,attr) {
  if(obj.currentStyle) {
    return obj.currentStyle[attr];
  }else{
    getComputedStyle(obi,false)[attr] 
  }
}


写一个function,清除字符串前后的空格。(兼容所有浏览器)


String.prototype.trim= function(){
return this.replace(/^\s+/,"").replace(/\s+$/,"");
}


程序中捕获异常的方法?


try{
}catch(e){
}finally{
}


相关文章
|
20天前
|
前端开发 JavaScript 网络协议
前端最常见的JS面试题大全
【4月更文挑战第3天】前端最常见的JS面试题大全
43 5
|
10天前
|
JavaScript 前端开发 测试技术
「一劳永逸」送你21道高频JavaScript手写面试题(上)
「一劳永逸」送你21道高频JavaScript手写面试题
36 0
|
1月前
|
设计模式 JavaScript 前端开发
最常见的26个JavaScript面试题和答案
最常见的26个JavaScript面试题和答案
46 1
|
1月前
|
存储 JavaScript 前端开发
【JavaScript】面试手撕浅拷贝
引入 浅拷贝和深拷贝应该是面试时非常常见的问题了,为了能将这两者说清楚,于是打算用两篇文章分别解释下深浅拷贝。 PS: 我第一次听到拷贝这个词,有种莫名的熟悉感,感觉跟某个英文很相似,后来发现确实Copy的音译,感觉这翻译还是蛮有意思的
45 6
|
1月前
|
JavaScript 前端开发
【JavaScript】面试手撕节流
上篇我们讲了防抖,这篇我们就谈谈防抖的好兄弟 -- 节流。这里在老生常谈般的提一下他们两者之间的区别,顺带给读者巩固下。
53 3
|
2月前
|
前端开发 JavaScript UED
【JavaScript】面试手撕防抖
防抖: 首先它是常见的性能优化技术,主要用于处理频繁触发的浏览器事件,如窗口大小变化、滚动事件、输入框内容改变等。在用户连续快速地触发同一事件时,防抖机制会确保相关回调函数在一个时间间隔内只会被执行一次。
36 0
|
2月前
|
前端开发 JavaScript 算法
【JavaScript】面试手撕数组排序
这章主要讲的是数组的排序篇,我们知道面试的时候,数组的排序是经常出现的题目。所以这块还是有必要进行一下讲解的。笔者观察了下前端这块的常用算法排序题,大概可以分为如下
24 2
|
2月前
|
JavaScript 前端开发 索引
【JavaScript】面试手撕数组原型链(易)
续借上文,这篇文章主要讲的是数组原型链相关的考题,有些人可能会纳闷,数组和原型链之间有什么关系呢?我们日常使用的数组forEach,map等都是建立在原型链之上的。举个🌰,如我有一个数组const arr = [1,2,3]我想要调用arr.sum方法对arr数组的值进行求和,该如何做呢?我们知道数组没有sum函数,于是我们需要在数组的原型上定义这个函数,才能方便我们调用,具体代码如下。接下来我们就是采用这种方式去实现一些数组常用的方法。
39 6
|
2月前
|
JavaScript 前端开发
【JavaScript】面试手写题精讲之数组(上)
该专题主要是讲解我们在面试的时候碰到一些JS的手写题, 确实这种手写题还是比较恶心的。有些时候好不容易把题目写出来了,突然面试官冷不丁来一句有没有更优的解法,直接让我们僵在原地。为了解决兄弟们的这些困扰,这个专题于是就诞生啦。我们会将一些常见的不是最优解的答案作为对比,方便大家更好理解。
38 3
|
3月前
|
存储 人工智能 JavaScript
【利用AI刷面试题】AI:十道JavaScript面试题巩固一下知识
【利用AI刷面试题】AI:十道JavaScript面试题巩固一下知识