通用编程题
1.function maxDivisor(num1,num2){
var max=num1>num2?num1:num2,
min=num1>num2?num2:num1;
输入两个数字,输出这两个数字的最大公约数。如16,4输出4。
for(var i=min;i>=1;i--){
if(max%i==0&&min%i==0){
return i;
}
}
}
function minDivisor(num1,num2){
var max=num1>num2?num1:num2,
min=num1>num2?num2:num1;
for(var i=max;i>=max;i++){
if(i%max==0&&i%min==0){
return i;
}
}
}
如何消除一个数组里面重复的元素?
var arr1 =[1,2,2,2,3,3,3,4,5,6],
document.write(arr2);
希望获取到页面中所有的checkbox怎么做?(原生JS)
var domList = document.getElementsByTagName(‘input’)
var checkBoxList = [];
var len = domList.length; //缓存到局部变量
while (len--) { //使用while的效率会比for循环更高
if (domList[len].type == ‘checkbox’) {
checkBoxList.push(domList[len]);
}
}
console.log(typeof fn);
function fn() {};
var fn;
1.变量声明
2.函数声明
因为函数声明优于变量声明。我们知道在代码逐行执行前,函数声明和变量声明会提前进行,而函数声明又会优于变量声明,这里的优于可以理解为晚于变量声明后,如果函数名和变量名相同,函数声明就能覆盖变量声明。所以以上代码将函数声明和变量声明调换顺序还是一样结果。
var f = true;
if (f === true) {
var a = 10;
}
function fn() {
var b = 20;
c = 30;
}
fn();
console.log(a);
console.log(b);
console.log(c);
输出:10 报错 30
发现function内的新声明的变量才是局部变量,而没有用var声明的变量在哪里都是全局变量。再次提醒切记只有function(){}内新声明的才能是局部变量
<!-- 实现一段脚本,使得点击对应链接alert出相应的编号 (使用闭包的方法)-->
<body>
<a href='#'> 第一个链接 </a> </br>
<a href='#'> 第二个链接 </a> </br>
<a href='#'> 第三个链接 </a> </br>
<a href='#'> 第四个链接 </a> </br>
<script type="text/javascript">
var lis = document.links;
for(var i = 0, length = lis.length; i < length; i++) {
(function(i) {
lis[i].onclick = function() {
alert(i + 1);
};
})(i);
}
</script>
</body>
alert(a);
var a = 200;
alert(a);
相当于
var a;
alert(a);
a = 200;
alert(a);
1.第一步:分析参数
2.第二步:分析变量声明
3.第三步:分析函数声明
再具体拆分步骤如下:
0.函数运行前,生成Active Object(活动对象),该对象就是一个容器,里面放所有的变量以及对应的值
1.把声明的参数放到AO里面,值全部为undefined,之后接收实参(就是外面传过来的)形成AO的属性,参数的值就是属性的值
2.分析变量声明,对于带有var的变量,
如果AO上没有此属性,则添加此属性,值是undefined
如果AO上已经有此属性,则没影响
3.分析函数声明,如function foo(){}
则把函数赋给AO.foo属性,如果此前该属性已经存在,则覆盖
注意:函数也可以直接被赋值,在JS里面,一切皆对象,函数也可以作为对象来传递。
给字符串加千分符
var str = '12345432';//->[]
function spli(str){
var iNum = str.length%3;//->0,1,2
var prev = '';
var arr = [];
var iNow = 0;
var tmp = '';
//千分号是从后向前三位三位加的,所以把三位余出来的从前面提取到
if(iNum !=0){
prev = str.substring(0,iNum);
arr.push(prev);
}
//取到多余部分后面的
str = str.substring(iNum);
for(var i=0;i<str.length;i++){
iNow++;
tmp += str[i];
if(iNow==3 && tmp){
//数组里面放的是三位的数
arr.push(tmp);
tmp = '';
iNow = 0;
}
}
return arr.join(',');
}
console.log(spli(str));
当使用者按下”Delete”按钮时, 将所按到的行(tr)删除, 请使用原生JavaScript实现。
var table = document.getElementById('table1');
table.addEventListener('click', function(event){
var tr = event.target.parentNode.parentNode;
tr.parentNode.removeChild(tr);
});
event.target 属性返回哪个 DOM 元素触发了事件。
这对比较 event.target 和 this 是非常有用的,以便判断事件是否因事件冒泡被处理。
4.希望获取到页面中所有的checkbox怎么做?(不使用第三方框架)
1
2
3
4
5
6
7
8
|
var domList = document.getElementsByTagName(‘input’)
var checkBoxList = [];
var len = domList.length; //缓存到局部变量
while (len--) { //使用while的效率会比for循环更高
if (domList[len].type == ‘checkbox’) {
checkBoxList.push(domList[len]);
}
}
|
14.输出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,则输出2014-09-26
1
2
3
4
5
6
7
8
9
10
11
|
vard=newDate();
// 获取年,getFullYear()返回4位的数字
varyear=d.getFullYear();
// 获取月,月份比较特殊,0是1月,11是12月
varmonth=d.getMonth()+1;
// 变成两位
month=month<10?'0'+month:month;
// 获取日
varday=d.getDate();
day=day<10?'0'+day:day;
alert(year+'-'+month+'-'+day);
|
16.为了保证页面输出安全,我们经常需要对一些特殊的字符进行转义,请写一个函数escapeHtml,将<, >, &, “进行转义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
function escapeHtml(str) {
return str.replace(/[<>”&]/g, function(match) {
switch (match) {
case “<”:
return “<”;
case “>”:
return “>”;
case “&”:
return “&”;
case “\””:
return “"”;
}
});
}
|
.有这样一个URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,请写一段JS程序提取URL中的各个GET参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中,如{a:’1′, b:’2′, c:”, d:’xxx’, e:undefined}。
答案:
1
2
3
4
5
6
7
8
9
|
function serilizeUrl(url) {
var result = {};
url = url.split("?")[1];
var map = url.split("&");
for(var i = 0, len = map.length; i < len; i++) {
result[map[i].split("=")[0]] = map[i].split("=")[1];
}
return result;
}
|
4.下面这个ul,如何点击每一列的时候alert其index?(闭包)
1
2
3
4
5
|
<ulid=”test”>
<li>这是第一条</li>
<li>这是第二条</li>
<li>这是第三条</li>
</ul>
|
// 方法一:
1
2
3
4
5
6
7
8
9
10
|
var a,b; (function(){ alert(a); alert(b); var a=b= 3 ; alert(a); alert(b); })(); alert(a); alert(b); |
问<span>的文本颜色是什么?yellow.浏览器对样式解析是从右往左开始解析,若遇到同名的属性,则后者会覆盖前者。
<style type="text/css"> .a1{color: red;} .a2{color:blue;} .a3{color:yellow;} </style> <span class="a3 a2 a1">测试</span>
3 请给出异步加载js方案,不少于两种。
答:1.直接document.write");
<script>
document.write("<script src="test.js"></script>");
</script>
2.动态改变已有script的src属性
<script src="" id="s1"><script>
<script>
s1.src="test.js"
</script>
3.动态创建script元素
<script>
var oHead=document.getElementsByTagName("HEAD").item(0);
var oScript=document.createElement("script");
oScript.type="text/javascript";
oScript.src="test.js";
oHead.appendChild(oScript);
</script>
2. 请用div+css写出左侧固定(width:200px),右侧自适应的页面布局。
.c_left{float:left;display:inline-block;width:200px;}
.c_right{margin-left:200px;}
如果一对兔子每月生一对兔子;一对新生兔,从第二个月起就开始生兔子;假定每对兔子都是一雌一雄,试问一对兔子,第n个月能繁殖成多少对兔子?(使用callee完成) var result=[]; function fn(n){ //典型的斐波那契数列 if(n==1){ return 1; }else if(n==2){ return 1; }else{ if(result[n]){ return result[n]; }else{ //argument.callee()表示fn() result[n]=arguments.callee(n-1)+arguments.callee(n-2); return result[n]; } } }
5、编写一个方法,去掉一个数组的重复元素
1 function unique(arr){ 2 3 var obj={}; 4 var array=[]; 5 for(var i=0;i<arr.length;i++){ 6 var key=arr[i]; 7 if(obj[key]!=1){ 8 obj[key]=1; 9 array.push(key); 10 } 11 } 12 return array; 13 14 } 15 16 var arr=[1,1,2,3,3,2,1]; 17 alert(unique(arr));
将多维数组转化成一个一位数组,例如[1,[2,3],[4,5,[6,7]]]转化成[1,2,3,4,5,6,7],答案在下面,主要就是利用递归
function test(array){ var newArray = []; for (var i=0,length = array.length - 1; i <= length; i++) { if(array[i] instanceof Array){//判断是不是数组 newArray = newArray.concat(test(array[i]));//递归调用 }else{ newArray.push(array[i]); } }; return newArray;