面试遇到的一些题

https://segmentfault.com/a/1190000004923482

 

题目一:
不用jquery等框架/库,查找一个页面上有多少种标签,每种标签的个数,伪代码实现亦可

http://blog.csdn.net/loving_m/article/details/52700553

先说说document.all是什么意思先

document.all是页面内所有元素的一个集合。例如:      
document.all(0)表示页面内第一个元素
document.all可以判断浏览器是否是IE  
  if(document.all){  
    alert("is   IE!");  
  }
也可以通过给某个元素设置id属性(id=aaaa),然后用document.all.aaaa调用该元素(不一定是id值,class、name都可以)
//方法一
//通过all获取 比较数组值、key计算
var nodeArr=new Array();//新建数组用于存放要计算的所有标签name和初始数量(=0){'tagname':0[,...]};
function mynodenum(){
    var a=document.all;
    var nodeName;
    for (var i=0;i< a.length;i++){
        nodeName=a[i].tagName;//节点名称
        nodeArr[nodeName]=0;//只获取标签名作为数组的键,对应的值 初始数量值为0
    }
    //判断页面中的标签是否存在于上面得到的获取的标签的数组中 用于计算某个标签的数量
    for (var i=0;i< a.length;i++){
        for(var key in nodeArr){
            if(a[i].tagName==key){//如果存在
                  nodeArr[key]++;//则该标签的数量加1
                  break;//跳出这次循环
            }
        }
    }
}
mynodenum();
console.log(nodeArr);
//方法二
//通过all获取,利用getElementsByTagName计算数量
var nodeArr2=new Array();//新建数组用于存放要计算的所有标签name和初始数量(=0){'tagname':0[,...]};
function mynodenum2(){
    var a=document.all;
    var nodeName;
    for (var i=0;i< a.length;i++){
        nodeName=a[i].tagName;//节点名称
        nodeArr2[nodeName]=0;//只获取标签名作为数组的键,对应的值 初始数量值为0
    }
    for (var key in nodeArr2){
        nodeArr2[key] = document.getElementsByTagName(key).length;
    }
}
mynodenum2();
console.log(nodeArr2);
//方法三(segmentfault上看到的递归做法:链接https://segmentfault.com/a/1190000004923482)
var map = {};
function dfs(node) {
    if(node.nodeType === 1) {
        var tagName = node.tagName;
        map[tagName] = map.hasOwnProperty(tagName) ? map[tagName] + 1 : 1;
        var children = node.childNodes;
        for(var i = 0, len = children.length; i < len; i++) {
            dfs(children[i]);
        }
    }
}
dfs(document.body);//仅body标签内的元素
console.log(map);

题目一:
typeof []
答案:object

typeof null   -->  "object"
null instanceof Object   --> false
typeof NaN  -->number
typeof {}   -->  "object"
typeof /pop/g   -->  "object"
typeof undefined  -->"undefined"
typeof function() {}  -->"function"
typeof(Number.MIN_VALUE);  -->"number"
typeof(Infinity);  -->"number"
typeof(window);  -->"object"
typeof(document);  -->"object"
typeof(eval);  -->"function"
typeof(Date);  -->"function"
typeof(sss);  -->"undefined"
typeof(undefined);  -->"undefined"

题目二:
你知道的http的状态码有哪些,代表什么意思

https://segmentfault.com/a/1190000004356398#articleHeader18

整体范围已定义范围分类
100~199 100、101 信息提示
200~299 200~206 成功
300~399 300~305 重定向
400~499 400~415 客户端错误
500~599 500~505 服务器错误

题目三:
cookie跟session的区别?(cookie和session的共同之处在于:cookie和session都是用来跟踪浏览器用户身份的会话方式。)
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗

考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能

考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、所以个人建议:

将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中

题目四:有一个数组譬如有十个数字,一秒钟打印一个怎么实现?

var num = [1, 2, 3, 4, 5, 6],
    len = num.length,
    index = 0;
var timer = setInterval(function () {
    if(index >= len) {
        clearInterval(timer);
    } else {
        console.log(num[index]);
    }
    index++;
}, 1000);

题目五:
position有哪些值?absolute相对于什么定位?
position 属性值的含义:
static
元素框正常生成。块级元素生成一个矩形框,作为文档流的一部分,行内元素则会创建一个或多个行框,置于其父元素中。
relative
元素框偏移某个距离。元素仍保持其未定位前的形状,它原本所占的空间仍保留。
absolute
元素框从文档流完全删除,并相对于其包含块定位。包含块可能是文档中的另一个元素或者是初始包含块。元素原先在正常文档流中所占的空间会关闭,就好像元素原来不存在一样。元素定位后生成一个块级框,而不论原来它在正常流中生成何种类型的框。
fixed
元素框的表现类似于将 position 设置为 absolute,不过其包含块是视窗本身。
资料:http://www.w3school.com.cn/css/css_positioning.asp
绝对定位的元素的位置相对于最近的已定位祖先元素,如果元素没有已定位的祖先元素,那么它的位置相对于最初的包含块。
资料:http://www.w3school.com.cn/css/css_positioning_absolute.asp

position的值为absolute、fixed的元素脱离文档流,static、relative没有脱离文档流

题目六:一个数组,求出里面连续和最大的一段的起始下标,譬如[1, 3, -4, 4, 2]最大连续和为6 下表为3, 4

var arr = [1, 3, -5, 4, 2, -9, 3, 6],
        sum = arr[0],
        sumIndex = {l: 0, r: 0};
        max = [],
        retIndex = {l: 0, r: 0};
        max[0] = arr[0];
        for(var i = 1, len = arr.length; i < len; i++) {
            max[i] = Math.max(sum + arr[i], max[i-1], arr[i]);
            if(max[i] === sum + arr[i]) {
                retIndex.l = sumIndex.l;
                retIndex.r = sumIndex.r = i;
            } else if(max[i] === arr[i]) {
                retIndex.l = i;
                retIndex.r = i;
            } else {
                retIndex.l = sumIndex.l;
                retIndex.r = sumIndex.r;
            }
            if(sum + arr[i] >= 0) {
                sum = sum + arr[i];
                sumIndex.r = i;
            } else {
                sum = arr[i];
                sumIndex.l = i;
                sumIndex.r = i;
            }
        }
        console.log(max[len - 1] + ' ' +  retIndex.l + ' ' +  retIndex.r);

题目七:实现一个once函数 参数是一个函数 返回值也是个函数 只能执行一次 下次执行就是undefined 例如:

function once(cb) {
    var flag = 1;
    return function() {
        if(flag) {
            cb.apply(cb.caller, arguments);
            flag = 0;
        }
    }
}
var foo = once(function() { console.log(123); });
foo();//123
foo();//undefined
foo();//undefined

 

为什么这段代码输出结果是十个10呢?

for(i=0;i<10;i++){
    setTimeout("console.log(i)",0);
}

为什么输出结果是十个10呢?还有,前面先输出的304是什么?每次输出那个值都不一样。

解:

每循环一次就注册一个延迟函数,js是单线程的,在循环中注册延迟函数就可能会发生这种情况,循环先发生,延迟函数要等到循环完了才能执行,循环完了取到的i自然是10咯。每生成一个timeout都会有一个id,304是最后一个计时器的id如果想实现这样的功能,可以用闭包来处理,下面的函数就可以输出1到10了

for(i=0;i<10;i++){
    setTimeout(
        (function(i){
            return function(){
                console.log(i)
            }
        })(i), 0);
}

304 应该是你那时候运行最后一个settimeout时返回的timeout 的timeoutID(用来clearTimeout的。)

 

解决方法是闭包,这篇文章有详细解读你的例子https://segmentfault.com/a/1190000002778015

前面先输出的304是什么?

timeoutID: 标示当前的计时器,可以用于清除该定时器 
window.clearTimeout(timeoutID)

 

括号字符串是否合法

某个字符串只包括(,判断其中的括号是否匹配正确,比如(()())正确,((())()错误,不允许使用栈

// isBracketBalance(str)函数是一个用于判断字符串中括号是否平衡匹配的函数
    // @prarmeter: str是将要被判断的字符串
    // 如果匹配返回true
    // 如果不匹配则返回false
    function isBracketBalance(str)
    {
        var leftBracketNum = 0,  // 用于保存左括号个数的变量
            strLength = str.length; // 把字符串的长度付给一个变量增加程序的性能
            
        // 通过for循环来读取字符串中的一个一个的字符
        for(var i = 0; i < strLength; i++)
        {
            var temp = str.charAt(i); // 付给临时变量增加程序的性能
            if(temp === '(') // 如果是左括号,则leftBracketNum++
            {
                leftBracketNum++;
            }
            if(temp === ')') // 如果是右括号,则leftBracketNum--
            {
                leftBracketNum--;
            }
        }
        
        // 最后判断leftBracketNum,如果为0表示平衡否则不平衡
        if(leftBracketNum === 0)
        {
            return true;
        }else{
            return false;
        }
    }

 

产生随机数

function randomsort(a, b) {  
        return Math.random()>.5 ? -1 : 1;  
//用Math.random()函数生成0~1之间的随机数与0.5比较,返回-1或1  
}  
var arr = [1,2,3,4];  
var arr2 = arr.sort(randomsort);  
alert(arr2);  

 

posted @ 2016-10-05 23:50  chenxj  阅读(106)  评论(0)    收藏  举报