JOB:前端面试题5

1、什么是CSS Hack
    由于不同厂商的流览器或某浏览器的不同版本(如IE6-IE11,Firefox/Safari/Opera/Chrome等),对CSS的支持、解析不一样,导致在不同浏览器的环境中呈现出不一致的页面展现效果。这时,我们为了获得统一的页面效果,就需要针对不同的浏览器或不同版本写特定的CSS样式,我们把这个针对不同的浏览器/不同版本写相应的CSS code的过程,叫做CSS hack!
CSS hack的原理
    由于不同的浏览器和浏览器各版本对CSS的支持及解析结果不一样,以及CSS优先级对浏览器展现效果的影响,我们可以据此针对不同的浏览器情景来应用不同的CSS。
CSS hack分类

    CSS Hack大致有3种表现形式,CSS属性前缀法、选择器前缀法以及IE条件注释法(即HTML头部引用if IE)Hack,实际项目中CSS Hack大部分是针对IE浏览器不同版本之间的表现差异而引入的。


2、简述同步和异步的区别、px和em的区别

同步:当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出现假死状态,当这个AJAX执行完毕后才会继续运行其他代码页面假死状态解除。“async:false” 意思是:“同步”

异步:这个AJAX代码运行中的时候其他代码一样可以运行。async值为true (异步)


px:绝对

em:相对父元素

rem:相对根元素

1px=显示器或手机屏幕上物理的最小一个点(不同的设备这个点大小不是绝对一样的)

1em=16px这是现代几乎所有浏览器的默认值


3、实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制

考察点1:对于基本数据类型和引用数据类型在内存中存放的是值还是指针这一区别是否清楚
考察点2:是否知道如何判断一个变量是什么类型的
考察点3:递归算法的设计

function clone(obj){
	var o;
	switch(typeof obj){
		case "undefined":
			break;
		case "string":
			o=obj+"";
			break;
		case "number":
			o=obj-0;
			break;
		case "object"://object具体 分两种情况 对象(Object)或数组(Array)
			if(obj===null){
				o=null;
			}else{
				if(Object.prototype.toString.call(obj).slice(8,-1)==="Array"){
					o=[];
					for(var i=0;i<obj.length;i++){
						o.push(clone(obj[i]));//调用自身克隆数组对象内部成员
					}
				}else{
					o={};
					for(var k in obj){
						o[k]=clone(obj[k]);//调用自身克隆对象内部成员
					}
				}
			}
			break;
		default;
			o=obj;
			break;
	}
	return o;

4、如何消除一个数组里面重复的元素?

	<script type="text/javascript">
	var arr='aabbdeeefaaaa';
	var arrNew={};
	var arrreturn=[];
		function sub(arr){
			//var l=Math.floor();
			for(var i =0; i<arr.length ; i++){
					if(!arrNew[arr.charAt(i)]){
						arrNew[arr.charAt(i)]=1;
					}else{
						arrNew[arr.charAt(i)]+=1;
					}				
			}
			console.log(arrNew);
					for(obj in arrNew){
						if(arrNew[obj]=1){
							arrreturn.push(obj);
						}
					}
			console.log(arrreturn);
		}
	sub(arr);
	</script>

5、在Javascript中什么是伪数组?如何将伪数组转化为标准数组?

伪数组:

1),具有length属性
2),按索引方式存储数据
3),不具有数组的push,pop等方法

例如:getElementsByTagName,document.childNodes之类的,它们都返回NodeList对象都属于伪数组。函数体内可以通过argument对象来接收传递进来的参数。

用Array.prototype.slice.call(fakeArray)将数组转化为真正的Array对象。


拓展:

argument对象

arguments对象访问函数的参数的时候和行参定义参数的时候的区别

function func(a,b){
b=30;
arguments[0] = arguments[1]
return a;
}
function(1,2); 30
function(1); undefined //由于函数内arguments形参改变了,a=arguments[1],arguments[1]未定义,所以a最后输出undefined





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值