一些我在学习过程中觉的不错的地方,可以用来当做面试的考点或者自我提高的知识点。

js

写个阶乘函数,如:5的阶乘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
答案:
1、尾调用(一般解决方法):
function factorial(n) {
if(n === 1) return 1;
return n * factorial(n-1µ);
}
尾调用会形成一堆‘调用帧’的‘调用栈’,递归非常耗费内存,容易出现栈溢出(stack overflow)
2、尾递归(优化解决方法)
function factorial(n,total = 1) {
if(n === 1){
return total
}
return factorial(n-1,n * total);
}
factorial(5);
ps:
尾递归的好处:避免出现栈溢出错误
附加知识点: 科里化:多参数函数抓换成单参数
3、计算
var a = [function(x) { return x * *;}, 20];
计算 a[0](a[1]) 的值;
答案是 400;

判断一个对象是否是数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1、ES 5中 Array.isArray(对象)
2、自己写isArray
var isArray = Function.isArray || function(o) {
return typeof o === 'object' && Object.prototype.tostring.call(o) === '[object Array]'
}
3、instanceof操作符
检测对象的原型链是否指向构造函数的prototype对象的
var arr = [1,2,3,1];
alert(arr instanceof Array); // true
4、对象的constructor属性
除了instanceof,每个对象还有constructor的属性,利用它似乎也能进行Array的判断。
var arr = [1,2,3,1];
alert(arr.constructor === Array); // true

如何根js据脚本检查某个样式浏览器是否支持,如 textShadow

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
核心思路
var root = document.documentElement;
if ('textShadow' in root.style) {
root.classList.add('textShadow');
} else {
root.classList.add('no-textShadow');
}
检查方法
function testProp(property) {
var root = document.documentElement;
if(property in root.style) {
root.classList.add(property.toLowerCase());
return true;
}
root.classList.add('no-' + property.toLowerCase());
return false;
}
* 能解析某个css特性,不代表它已经实现(或正确实现)了这个特性!
把样式放进元素中
function testValue(id, value, property) {
var testElement = root.createElement('p');
testElement.style[property] = value;
if(testElement.style[property]) {
root.classList.add(id);
return true;
}
root.classList.add('no-' + id);
return false;
}

函数名 和 变量重名会怎样,为什么

如果变量名 和函数拥有相同的名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var a = 100;
function a (){
console.log('function a');
}
a(); // TypeError: a is not a function
这是为什么呢:
因为在js解析的过程中,
1、变量的申明和函数的申明会提升到顶部
2、函数的申明在最前面,接着是变量
3、申明和赋值是拆分开的
4、变量的赋值会覆盖函数的声明
js解析过程如下:
var a = function (){
console.log('function a')
}
var a = 100;
a();

####

1
2
3
4
5
6
7
var string = "我的账户余额:2,235,467.20";
// 请用js计算出我到底有多少钱(输出Number类型数字,代码尽量简洁,考虑通用情况)
-------------
// 使用正则表达式出金额数字,然后再将金额数字中的‘,’,替换掉
/^(([1-9]\d*)|0)(\.\d{1,2})?$/

原型链

闭包

css

多重边框的实现

1
2
3
4
5
6
1、使用多重元素模拟边框(差)
2、使用css box-shadow (优)
box-shadow: 0 0 0 10px #655,
0 0 0 15px deeppink,
0 2px 5px 15px rgba(0,0,0,.6);

开放性问题

混合应用的优势

初 中 高级工程师怎么区分 理解。

有一个新的工程 新的项目,你要怎么建立相关架构

某公司前端面试试题

函数式编程理解

某公司前端面试题

(Keep Learning Keep Writing……)