js
说一说typeof
和instanceof
的区别
typeof
用于检测数据类型,返回6种值:number,string,boolean,undefined,object,function
数组和null
类型都返回object
;NaN
返回number
instanceof
用于判断某个变量是否是某个对象的实例,返回值为true
或false
;区别数组和对象
A instanceof B
的意思是 A 对象是不是 B 构造函数构造出来的,A 对象
的原型链上有没有 B 的原型
==
和===
的区别
==
在比较的时候,只比较定义的两个量的值,仅仅比较两个变量的值,不管数据类型
===
在比较的时候,比较值和数据类型.必需同时满足才为true
深拷贝和浅拷贝的区别
假设B复制A,修改A,看B的变化
B改变,则是浅拷贝,反之则是深拷贝
浅拷贝只是增加一个指针智爱香已存在的内存地址
深拷贝是增加一个指针并申请了一个新的内存,使这个增加的指针指向这个新的内存
参数是number类型,返回长度是参数num的任意字符串
[1,2,3,4,5,[4,3,8,7,[2,5,9]]0,6];扁平化对此数组去重排序
[1,2,6,9,0,2,3,5,0,7,1],将数组内的0移到数组最后位置
如何获取对象的属性值
for(var key in obj){
console.log(obj[key])
}
css
盒子模型(怪异模式和标准模式)
你所知道的选择器
id选择器#id
,class 选择器.class
,标签选择器tag
,通配符选择器*{}
,父子选择器/派生选择器最外面的结构 外面的结构 里面的结构{}
,直接子元素选择div > em{}
,并列选择器div.select{}
.分组选择器div,p,em{}
,伪类选择器
BFC
如何触发一个盒子的 bfc
1)position:absolute;
2)display:inline-block;
3)float:left/right; //浮动
4)overflow:hidden; //溢出盒子的部分要隐藏展示
所解决问题:margin 塌陷,margin 合并
em
和rem
的区别
同步和异步的区别
右边宽度固定,左边自适应
第一种:
<style>
body{
display: flex;
}
.left{
background-color: orange;
height: 200px;
flex: 1;
}
.right{
background-color: red;
height: 200px;
width: 100px;
}
</style>
<body>
<div class="left"></div>
<div class="right"></div>
</body>
第二种:
<style>
div {
height: 200px;
}
.left {
float: right;
width: 200px;
background-color: orange;
}
.right {
margin-right: 200px;
background-color: red;
}
</style>
<body>
<div class="left"></div>
<div class="right"></div>
</body>
水平居中
第一种
#container{
position:relative;
}
#center{
width:100px;
height:100px;
position:absolute;
top:50%;
left:50%;
transform: translate(-50%,-50%);
}
第二种
#container{
position:relative;
}
#center{
width:100px;
height:100px;
position:absolute;
top:50%;
left:50%;
margin:-50px 0 0 -50px;
}
第三种
#container{
position:relative;
}
#center{
position:absolute;
margin:auto;
top:0;
bottom:0;
left:0;
right:0;
}
第四种
#container{
display:flex;
justify-content:center;
align-items: center;
}
vue
谈一谈Vue生命周期的了解
watch
和computed
的区别
- computed不支持异步; watch支持异步
- 如果一个属性是由其他属性计算而来的,这个属性依赖其他属性,是一个多对一或者一对一,一般用computed;
firstName: 'Foo',
lastName: 'Bar',
fullName: 'Foo Bar'
watch: {
firstName: function (val) {
this.fullName = val + ' ' +this.lastName
},
lastName: function (val) {
this.fullName = this.firstName + '' + val
}
}
fullName: function () {
return this.firstName + ' ' +this.lastName
}
- watch更加适用于监听某一个值的变化并做对应的操作;监听的函数接收两个参数,第一个参数是最新的值;第二个参数是输入之前的值;
new Vue({
el: '#id',
template: `<div>
// ...
</div>`,
data: {
firstName: 'Leo',
lastName: 'Alan',
obj1: {
a: 0
}
},
watch: {
// 监听firstName,当firstName发生变化时就会执行该函数
firstName () {
// 执行需要的操作...
// 注:初始化不会执行,只有当被监听的值(firstName)发生变化时才会执行
},
// 监听lastName
lastName: {
handler (newName, oldName) {
// 执行需要的操作...
},
immediate: true // true: 初始化时就会先执行一遍该监听对应的操作
},
obj1: {
handler () {
// 执行需要的操作...
},
deep: true // 该属性默认值为false.
// 当被监听的值是对象,只有deep为true时,对应属性的值(obj1.a)发生变化时才能触发监听事件,但是这样非常消耗性能
},
// 监听对象具体的属性, deep就不需要设置为true了
'obj1.a': {
handler () {
// 执行需要的操作...
}
}
}
})
给数组添加值,能否监听到
vue能监听到数组变化的方法:push(),pop(),shift(),unshift(),splice(),sort(),reverse();vue通过重写数组的某些方法来监听数组变化
组件之间的传值,子组件可以反向给父组件传值吗?
- 父传子:子组件通过 props方法获取父组件传递过来的值(props中可以定义能接收的数据类型,如果不符合会报错。),子组件不能修改数据
- 子传父:子组件通过$emit方法
- 兄弟组件传值:vuex
数据双向绑定的原理
通过Object.defineProperty()劫持数组为其设置getter和setter后,在数据变动时发布消息给订阅者,触发相应监听回调
路由的两种模式
- hash ——即地址栏URL中的#符号
比如这个URL:http://www.abc.com/#/hello, hash 的值为#/hello。它的特点在于:hash 虽然出现URL中,但不会被包含在HTTP请求中,对后端完全没有影响,因此改变hash不会重新加载页面。 - history ——利用了HTML5 History Interface 中新增的pushState() 和replaceState() 方法。(需要特定浏览器支持)
es6
es6用过哪些
var,let,const 三者的区别
var:变量声明提升;可重复定义;可挂载到window(定义的变量名与window里的属性名相同);存在闭包问题(全局作用域 window和函数作用域(函数执行产生的作用域))
let:没有变量声明提升;不能重复定义;不会挂载到window;块级作用域{};
暂时性死区:发生在欲编译阶段 ,一定要先定义后使用;
解决了闭包
const 存的是常量,不可以改变