此外还有一些面试题都是个人针对面试的时候弄的,没其他作用就是担心有些平时用不到的知识点遗忘
html面试题(一)--html css js_前端菜鸟-CSDN博客前端面试题汇总一、HTML和CSS1、你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么?IE:trident内核Firefox:gecko内核Safari:webkit内核Opera:以前是presto内核,Opera现已改用Google Chrome的Blink内核Chrome:Blink(基于webkit,Google与Opera Software共...https://blog.csdn.net/dong281500748/article/details/79858120?spm=1001.2014.3001.5502html面试题(二)html css js_前端菜鸟-CSDN博客1、一个200*200的div在不同分辨率屏幕上下左右居中,用css实现div{width:200px;height:200px;background-color:red;position:absolute;top:50%;left:50%;margin-top:-100px;margin-left:-100px;}2、写一个左中右布局占满屏幕,其中左右两块是固定宽度2...https://blog.csdn.net/dong281500748/article/details/82798710?spm=1001.2014.3001.5502
1、叙述原型链
答案:当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。
function Person (name){
this.anme = name
}
Person.prototype.say = funticon(){
console.log('hello' + this.name)
}
let p1 = new Person('张三')
let p2 = new Person('李四')
p1.say()
这里面的原型就是就是 Person.prototype
函数有原型,函数有个属性叫prototype,函数的这个原型指向一个对象,这个对象叫做原型对象,这个原型对象有个constructor属性,指向这个函数本身
js规定每一个函数都有一个proto属性,而且对应的是自身的原型
2、js如何继承
答案:
1、对象冒充
function Parent(username){
this.username = username;
this.hello = function(){
alert(this.username);
}
}
function Child(username,password){
//通过以下3行实现将Parent的属性和方法追加到Child中,从而实现继承
//第一步:this.method是作为一个临时的属性,并且指向Parent所指向的对象,
//第二步:执行this.method方法,即执行Parent所指向的对象函数
//第三步:销毁this.method属性,即此时Child就已经拥有了Parent的所有属性和方法
this.method = Parent;
this.method(username);//最关键的一行
delete this.method;
this.password = password;
this.world = function(){
alert(this.password);
}
}
var parent = new Parent("zhangsan");
var child = new Child("lisi","123456");
parent.hello();
child.hello();
child.world();
2、 call()方法方式、
call方法是Function类中的方法
call方法的第一个参数的值赋值给类(即方法)中出现的this
call方法的第二个参数开始依次赋值给类(即方法)所接受的参数
function test(str){
alert(this.name + " " + str);
}
var object = new Object();
object.name = "zhangsan";
test.call(object,"langsin");//此时,第一个参数值object传递给了test类(即方法)中出现的this,而第二个参数"langsin"则赋值给了test类(即方法)的str
function Parent(username){
this.username = username;
this.hello = function(){
alert(this.username);
}
}
function Child(username,password){
Parent.call(this,username);
this.password = password;
this.world = function(){
alert(this.password);
}
}
var parent = new Parent("zhangsan");
var child = new Child("lisi","123456");
parent.hello();
child.hello();
child.world();
3、apply()方法方式、
apply方法接受2个参数,
A、第一个参数与call方法的第一个参数一样,即赋值给类(即方法)中出现的this
B、第二个参数为数组类型,这个数组中的每个元素依次赋值给类(即方法)所接受的参数
function Parent(username){
this.username = username;
this.hello = function(){
alert(this.username);
}
}
function Child(username,password){
Parent.apply(this,new Array(username));
this.password = password;
this.world = function(){
alert(this.password);
}
}
var parent = new Parent("zhangsan");
var child = new Child("lisi","123456");
parent.hello();
child.hello();
child.world();
4、原型链(子类通过prototype将所有的父类中通过prototype追加的属性和方法追加到child,从来实现继承)、
function Person(){
}
Person.prototype.hello = "hello";
Person.prototype.sayHello = function(){
alert(this.hello);
}
function Child(){
}
Child.prototype = new Person();//这行的作用是:将Parent中将所有通过prototype追加的属性和方法都追加到Child,从而实现了继承
Child.prototype.world = "world";
Child.prototype.sayWorld = function(){
alert(this.world);
}
var c = new Child();
c.sayHello();
c.sayWorld();
5、 混合方式
混合了call方式、原型链方式
function Parent(hello){
this.hello = hello;
}
Parent.prototype.sayHello = function(){
alert(this.hello);
}
function Child(hello,world){
Parent.call(this,hello);//将父类的属性继承过来
this.world = world;//新增一些属性
}
Child.prototype = new Parent();//将父类的方法继承过来
Child.prototype.sayWorld = function(){//新增一些方法
alert(this.world);
}
var c = new Child("zhangsan","lisi");
c.sayHello();
c.sayWorld();
另外补充一下
另外补充一下:
call()、applay()以及bind()三者之间的区别?
1、call(obj,param1,param2,param3······)
参数说明:
obj:指定的对象
param:指定的对象中所带有的参数
注:参数之间用逗号隔开。
2、applay(obj,[param1、param2、param3······])
参数说明:
obj:指定的对象
param:指定的对象中所带有的参数
注:参数使用数组包含起来。
扩:在不传入参数的情况下,call(obj)和apply(obj)的作用是一样的;
3、bind(obj,param1,param2,param3······)
参数说明:
obj:指定的对象
param:指定的对象中所带有的参数
注:参数之间用逗号隔开【和call使用语法一致】
二:使用场景
1、call和apply绑定完this会立即调用当前的函数,而bind绑定完this不会立即调用当前函数,而是将函数返回。
2、call和apply通常用作绑定完立即执行的函数中,而bind通常用来作用在回调函数中定义。
3、跨域方式
答案:JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。那什么是跨域呢,简单地理解就是因为JavaScript同源策略的限制,a.com域名下的js无法操作b.com或是c.a.com域名下的对象。
当协议、子域名、主域名、端口号中任意一个不相同时,都算作不同域。不同域之间相互请求资源,就算作“跨域”。有一点必须要注意:跨域并不是请求发不出去,请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。之所以会跨域,是因为受到了同源策略的限制,同源策略要求源相同才能正常进行通信,即协议、域名、端口号都完全一致。
4、 XSS接触过吗?说说XSS
答案:黑客通过 “HTML 注入 ” 篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击 。
5、js的数据类型有哪些?
答案:数字类型,字符串型,布尔型,undefined,null ,对象类型,数组
6、简单说一下ES6的symbol属性
答案:
1、Symbol属性对应的值是唯一的,解决命名冲突问题
2、不能参与其他数据运算,包括字符串拼接
3、for in遍历时,不会遍历symbol属性
4、可以定义常量
使用
let symbol=Symbol();
区别不同
Symbol let symbol=Symbol('区分标识任意值');
定义常量
const xx=Symbol('标识');
9、 如何判断Array和Object
答案:
typeof null //object
typeof undefined // undefined
typeof false // boolean
typeof 123 // number
typeof 'abc' //string
null被认为是一个空对象引用,所以,会返回object,这算是一个语言实现的错误。
typeof new Number(12); //object
typeof Number(13) //number
typeof NaN // number
解释一下:
第一个虽然Number,String,Boolean是基本数据类型,但他们可以通过new创建,而通过new创建,后台会自动转化为对象,使他们看起来像对象。因此,第一个是返回object
第二个由于没有用new,创建的就是基本数据类型,所以还是number类型
第三个NaN是属于Number类型的,这里需要注意NaN与任何数据都不相等,包括它本身。
如何判断数据?
1、instanceof操作符
var arr = [1,2,3,1];
console.log(arr instanceof Array); // true
var fun = function(){};
console.log(fun instanceof Function); // true
2、对象的constructor 属性
var arr = [1,2,3,1];
console.log(arr.constructor === Array); // true
var fun = function(){};
console.log(arr.constructor === Function); // true
3、使用 Object.prototype.toString 来判断是否是数组
Object.prototype.toString.call( [] ) === '[object Array]' // true
Object.prototype.toString.call( function(){} ) === '[object Function]' // true
4、typeof function() {} // function
5、使用 原型链 来完成判断
[].__proto__ === Array.prototype // true
var fun = function(){}
fun.__proto__ === Function.prototype // true
6、Array.isArray()
10、深拷贝和浅拷贝的区别。
答案:参考参考其他文章总结出浅拷贝和深拷贝_前端菜鸟-CSDN博客
11、说说js闭包
答案:
闭包的简介:
闭包就是能够读取其他函数内部变量的函数。只有函数内部的子函数才能读取局部变量,在本质上,闭包是函数内部和函数外部连接起来的桥梁。
当函数可以记住并访问所在词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。 - - 出自《你不知道的JavaScript(上卷)》
闭包的定义:
如果在一个内部函数里,对在外部作用域(但不是全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
闭包的特点:
可以读取自身函数外部的变量(沿着作用域链寻找)先从自身开始查找,如果自身没有才会继续往上级查找,自身如果拥有将直接调用。(哪个离的最近就用哪一个)
延长内部变量的生命周期
函数b嵌套在函数a内部
函数a返回函数b
闭包的作用:
在函数a执行完并返回后,闭包使得JavaScript的垃圾回收机制不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量,闭包需要循序渐进的过程。
闭包的构成:
闭包由俩个部分构成:
函数
以及创建该函数的环境
应用场景:
保护函数内的变量安全。函数a中只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。
在内存中维持一个变量
13、以下代码运行后会怎样?为什么?
var a = 1;
let a =1;
答案:// Identifier 'a' has already been declared (标识符“ a”已经被声明)
14、可以修改obj对象的属性吗?
答案:
const obj = {};
const指针指向的地址不可以改变
指向地址的内容是可以改变的
因为const只是保证对象的指针不改变
而对象的内容改变不会影响到指针的改变
所以对象的属性内容是可以修改的。
15、说说Promise
答案:为什么会出现promise?因为回调地狱-
就是解决嵌套而存在的
先理解什么是回调函数?
简单来说,
回调就是等我某件事做完以后才去做回调需要做的事情
首先,回调与同步异步没有什么直接联系,回调只是一种实现方式
异步请求回调:
$.get('ajax/test',function(data){
xxx
})
点击事件回调:
$('#id').click(() => xxx)
同步回调:
(a,b,sum) => {
const sum = a + b
callback(sum)
}
- 常见回调地狱,后面请求依赖前面请求
$.get(url, data1 => { console.log(data1) $.get(data1.url, data2 => { console.log(data1) }) }) 缺点一眼可见: 1 代码臃肿,可读性差 2 复用性差,容易出bug 3 review维护极其麻烦,完全违背了写出高效易懂易维护的代码
为了解决嵌套问题,于是Promise规范出现了
-
异步编程的一种解决方法 比起传统的异步解决方案(回调diyu), 更合理,可读性高,而且更贴合js单线程同步 new Promise(请求1) .then(res => 请求2(res)) .then(...) .cathc(处理异常)
- 小测试题目
new Promise((resolve) => { setTimeout(() => { console.log(1); resolve(); },1000) }).then(() => { console.log('promise'); }) // 1 // promise 因为then里面的函数都是在前一个promise对象进行resolve的时候进行
- promise实现
-
promise的本质其实就是讲回调函数写得更优雅
18、说说重排和重绘
答案:
重绘(repaint):当元素的外观属性发生变化,即元素的颜色,背景色发生改变但没有影响到dom树的位置改变的时候,会触发重绘;
重排(reflow):当页面内的元素尺寸发生了变化,导致部分或者全部DOM树,渲染树需要重新更新,会触发重排, 重排又称为回流;
重绘与重排_前端菜鸟-CSDN博客_前端重绘和重排https://blog.csdn.net/dong281500748/article/details/113879052
27、http和https的区别
答案:
http和https的区别_前端菜鸟-CSDN博客_前端http和httpshttps://blog.csdn.net/dong281500748/article/details/113879100
28、Vue中的nextTick了解吗?
答案:
-
nextTick的用法:函数(foo)作为参数
-
nextTick的用途:在下次DOM更新以后,立即执行函数(foo)
为什么要使用nextTick?因为Vue中数据是异步更新的,即数据的改变会引起虚拟DOM的变化,但不会使真实DOM立马更新的。通过将代码传入nextTick,使得代码在真实DOM数据更新后运行,从而避免因DOM数据未能同步更新而引发的错误。(以下为测试代码)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>nextTick测试</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
{{ msg }}
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
msg: 'Hello Vue!'
}
})
vm.msg = 'Hello 前端小哥'
// DOM 还没有更新
console.log(vm.$el.textContent);
Vue.nextTick(function () {
// DOM 更新了
console.log("nextTick:" + vm.$el.textContent);
})
</script>
</body>
</html>
30、fixed relative absolute的区别
position:static;
静态定位是所有元素的默认定位方式,当position属性的取值为static时,可以将元素定位于静态位置。 所谓静态位置就是各个元素在HTML文档流中默认的位置。
上面的话翻译成白话: 就是网页中所有元素都默认的是静态定位哦! 其实就是标准流的特性。
什么是相对定位?
相对定位是将元素相对于它在标准流中的位置进行定位,当position属性的取值为relative时,可以将元素定位于相对位置。没有脱离标准文档流。
什么是绝对定位
position:absolute;
脱离标准文档流的定位,可以通过边偏移属性调控位置。
什么固定定位
position:fixed
以浏览器为参考,脱离标准文档流,可用边偏移属性控制位置
31、事件冒泡/捕获
事件捕获阶段:事件从最上一级标签开始往下查找,直到捕获到事件目标(target)。
事件冒泡阶段:事件从事件目标(target)开始,往上冒泡直到页面的最上一级标签。
32、箭头函数
33. 了解过bfc吗?如何触发bfc
BFC
BFC(Block formatting context)直译为“块级格式化上下文”。它是一个独立的渲染区域,只有Block-level box(块)参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。
BFC的布局规则
一、内部的Box会在垂直方向,一个接一个地放置。
二、Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠(按照最大margin值设置)
三、每个元素的margin box的左边, 与包含块border box的左边相接触
四、BFC的区域不会与float box重叠。
五、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。
六、计算BFC的高度时,浮动元素也参与计算
哪些元素或属性能触发BFC
根元素(html)
float属性不为none
position为absolute或fixed
display为inline-block, table-cell, table-caption, flex, inline-flex
overflow不为visible
BFC的应用
1、自适应两栏布局
2、清除内部浮动
3、防止margin上下重叠
19. 如何判断对象为空
1.根据for...in遍历对象,如果存在则返回true,否则返回false
for ( let i in obj) {
return true;
}
return false
2.利用JSON自带的JSON.stringify()方法来判断
大概思路就是转化为字符串’{}'来进行判断
if (JSON.stringify(obj) === '{}') {
return true;
}
return false;
3.利用ES6中Object.keys()来进行判断 (推荐)
Object.keys()方法会返回一个由一个给定对象的自身可枚举属性组成的数组。
如果我们的对象为空,他会返回一个空数组。
Object.keys(obj).length === 0 ? '空' : '不为空'
20. 数组的方法
22. 简单叙述XHR发送请求的过程
24. 跨域的解决方案个人总结关于跨域的解决办法_前端菜鸟-CSDN博客最直接的就是后台直接改1、jsonp的方式 动态插入script标签,但是不能自定义修改header头部信息例如:var script = document.createElement('script')script.type = 'text/javascript'script.src='10.2.34:9090?user=admin&callback=handleCal...https://blog.csdn.net/dong281500748/article/details/104559881?spm=1001.2014.3001.5502
29. 说说MVVM框架
30. Vue的数据双向绑定的渲染
01. 写代码获取DOM元素:考察类选择器和属性选择器
<!-- 获取所有title属性值以baidu开头的元素 -->
<div title="baidu-video">百度视频</div>
<div title="baidu-music">百度音乐</div>
<div title="baidu-doc">百度文档</div>
<div title="google-doc">谷歌文档</div>
参考答案:
<script>
var list = document.querySelectorAll("div[title^='baidu']");
</script>
4、GET和POST的区别
5、跨域是什么?怎样解决跨域?
7、git常见命令
9、MVC/MVVM,挑一个你熟悉的说说。说的MVVM...
10、接上边,Vue的双向数据绑定怎么实现的
11、Vue中v-if和v-show的区别
12、单页应用如何在浏览器中实现的?单页应用的优缺点
13、聊到了堆,说了堆排序的过程
14、算法题:反转单向链表
3. 事件冒泡和捕获机制了解多少?
1. 基本概念?
2. window.addEventListener监听的是什么阶段的事件?
4. 工作中用过防抖和节流吗?
***************************************************************