1、闭包的理解
2.TCP/IP
3、堆和栈的理解
4、http协议的理解
5、this指向
6、浅说XSS和CSRF
7、虚拟dom
8、promise的原理
9、_proto_和prototype的关系及区别
10、vue生命周期created与mounted
vue中父子组件传值,解决钩子函数mounted只运行一次的问题
11、mvc与mvvm的理解
12、前端性能优化之重排和重绘
13、清除浮动的最常用的四种方法,以及优缺点
14、css3动画
15、Object.defineProperty
Object.defineProperty看vue的数据双向绑定
16、js中sort()方法原理及使用
17、vuex原理
18、判断数据类型
19、vue-router简介
20、promise的使用和原理
21、new()实现了什么
22、简述三次握手和四次挥手
23、vue的自定义指令
function Sum(value) {
function add(t) {
value = value + t;
return add;
}
add.valueOf = function() {
return value;
}
return add;
}
Sum(1)(2)(3).valueOf(); //6
// 题1
let a = {}
console.log(a.b) //undefined
let b = []
console.log(b.c) //undefined
// 题2
var go = console;
var langue = {
name: '',
php() {
var t = this; //this指向langue
go.info(t.name) //即 langue.name 输出空
},
python: () => {
let t = this; //箭头函数不改变this的指向,this指向window
go.info(t.name) //即 window.name 因为window存在name这个属性,输出的也是空
}
}
langue.php();
langue.python();
// 1、普通函数的this指向:指向直接调用者,也就是是最终调用它的对象,没有直接调用者,this指向window
// 2、箭头函数的this指向:指向上下文里对象的this指向,如果没有上下文对象,this指向window
// 箭头函数不改变this的指向
// 题3
Object.prototype.getLength = function() {
return Object.keys(this).length;
}
let data = {
a: 1,
b: 2
}
if(typeof data === 'object' && data.getLength()) {
for(var key in Object.keys(data)) {
console.log(key, data)
}
}
//结果
// a {a: 1, b: 2}
// b {a: 1, b: 2}
// getLength {a: 1, b: 2}
// for in 遍历:主要用于遍历对象的可枚举属性,包括自有属性、继承自原型的属性
// 解决:
// 方法一: 只遍历对象自身的属性,而不遍历继承于原型链上的属性,使用hasOwnProperty 方法过滤一下。
if(typeof data === 'object' && data.getLength()) {
for(var key in data) {
if(data.hasOwnProperty(key)){
console.log(key, data)
}
}
}
//方法二:使用for of 遍历
// Object.entries() 方法返回一个给定对象自身可枚举属性的键值对数组,
// 其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性)。
// 通俗点就是 Object.entries() 可以把一个对象的键值以数组的形式遍历出来,结果和 for...in 一致,但不会遍历原型属性。
if(typeof data === 'object' && data.getLength()) {
for(var key of Object.entries(data)) {
console.log(key, data)
}
}