前端面试题学习整理
一 SVN与Git的最主要的区别?
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
二 类型判断
1.typeof
对于原始类型来说,除了null 都可以显示正确的类型判断;
对于对象来说,除了函数(显示 function)都会显示 object。
2.instanceof 判断对象的类型--因为内部机制是通过原型链来判断的。(对于原始类型来说,想直接通过instanceof来判断类型是行不通的)
3.类型转换--在js中类型转换只有三种情况,
转换为布尔值
转换为数字
转换为字符串
转Boolean -- 在条件判断时,除了undefined,null,false,NaN,'',0,-0,其他所有值都是true,包括所有对象。
对象转原始类型 -- 对象在转换类型的时候,会调用内置的 [[ToPrimitive]] 函数,对于该函数来说,算法逻辑如下
·如果已经是原始类型了,那就不需要转换了,
·调用 x.valueOf() ,如果转换为基础类型,就返回转换的值;
·调用 x.toString() ,如果转换为基础类型,就返回转换的值;
·如果都没有返回原始类型,就会报错。
在重写 Symbol.toPrimitive, 该方法在转原始类型时调用优先级最高。
三 四则运算符:
1.运算中其中一方为字符串,那么就会把另一方也转换为字符串。
2.如果一方不是字符串或者数字,那么会将它转换为数字或字符串。
3.另外对于表达式: 'a' + + 'b' // -> "aNaN"
因为 + 'b' 等于 NaN, 所以结果是 "aNaN",
4.对于除了加法的运算符来说,只要其中一方是数字,那么另一方就会被转换为数字
4 * '3' // 12
4 * [] // 0
4 * [1,2] // NaN
比较运算符
1.如果是对象,就通过 toPrimitive 转换对象
2.如果是字符串,就通过 unicode 字符索引来比较
let a = {
valueOf(){
return 0
},
toString(){
return '1'
}
}
a > -1 // true
在以上代码中,因为a是对象,所以会通过 valueOf 转换为原始类型在比较值。