zoukankan      html  css  js  c++  java
  • 面试常考的js题目(三)

    1、查找两个节点的最近的一个共同父节点,可以包括节点自身

    function commonParentNode(oNode1, oNode2) {
        if(oNode1.contains(oNode2)){
            return oNode1;
        }else{
            return commonParentNode(oNode1.parentNode, oNode2)
        }
        
    }
    //取任意一个结果开始都ok
    

    2、获取 url 中的参数

      1. 指定参数名称,返回该参数的值 或者 空字符串
      1. 不指定参数名称,返回全部的参数对象 或者 {}
      1. 如果存在多个同名参数,则返回数组
    function getUrlParam(sUrl, sKey) {
        var arr={};
        sUrl.replace(/??(w+)=(w+)&?/g,function(match,p1,p2){
            //console.log(match,p1,p2);
            if(!arr[p1]){
               arr[p1] = p2;
            }else{
               var  p =arr[p1];
               arr[p1]=[].concat(p,p2);
            }
        })
        if(!sKey){
            return arr;
        }else{
            return arr[sKey]?arr[sKey]:'';
        }
    }
    
    

    3、修改 this 指向 封装函数 f,使 f 的 this 指向指定的对象

    function bindThis(f, oTarget) {
        return function(){
            return f.apply(oTarget,arguments);
        }
    } 
    

    为什么有匿名函数,是因为apply call 是绑定之后是立即调用的,所以需要匿名函数包装且需要传入原函数的参数argumengts. bind 会创建一个新函数,即函数副本

    4、根据包名,在指定空间中创建对象
    输入描述:
    namespace({a: {test: 1, b: 2}}, 'a.b.c.d')
    输出描述:
    {a: {test: 1, b: {c: {d: {}}}}}

    
    function namespace(oNamespace, sPackage) {
        var pN = sPackage.split('.');
        var result = oNamespace;
        while(pN.length>0){
            if(oNamespace[pN[0]]){
                if(Object.prototype.toString.call(oNamespace[pN[0]])!=='[object Object]'){
                    oNamespace[pN[0]]={};
                }
            }else{
                oNamespace[pN[0]]={};
            }
            oNamespace = oNamespace[pN[0]];
            pN.shift();
        }
        return result;
    }
    

    5、如果第二个参数 bUnicode255For1 === true,则所有字符长度为 1
    否则如果字符 Unicode 编码 > 255 则长度为 2

    function strLength(s, bUnicode255For1) {
        var len = s.length;
        if (bUnicode255For1){
            return len;
        }else{
            for(var i = 0; i < s.length; i++){
                if(s.charCodeAt(i)>255){
                    len++
                }
            }
            return len;
        }
    }
    

    6、统计字符串中每个字符的出现频率,返回一个 Object,key 为统计字符,value 为出现频率

    • 不限制 key 的顺序
    • 输入的字符串参数不会为空
    • 忽略空白字符
    function count(str) {
        var obj = {};
        str.replace(/[S]/g,function(match){
            obj[match]= ++obj[match]||1;
        })
        return obj;
    }
    

    7、用 JavaScript 实现斐波那契数列函数,返回第n个斐波那契数。 f(1) = 1, f(2) = 1 等

    function fibonacci(n) {
      
        if(n==1||n==2){
            return 1;
        }
        return fibonacci(n-1)+fibonacci(n-2);
    }
    

    **8、为数组添加一个滤除重复项的方法 **

    keys: indexof(NAN)每次返回的都是-1

    //方法一: 利用filter函数的 先判断是否是Nan
    Array.prototype.uniq = function () {
    	return this.filter(function(item,index){
    		return item!=item?this.flag= this.flag==undefined:this.indexOf(item)==index
    	},this)
    }
    
    //方法二: 循环判断是否是Nan
    Array.prototype.uniq = function () {
        var result=[];
        var flag = true;
        for(var i=0;i<this.length;i++){
            if(result.indexOf(this[i])===-1){
                if(this[i]!=this[i]){
                    if(flag){
                        result.push(this[i]);
                        flag=false
                    }
                }else{
                   result.push(this[i]); 
                }
                
            }
        }
        return result;
    }
     
    

    9、css 中经常有类似 background-image 这种通过 - 连接的字符,通过 javascript 设置样式的时候需要将这种样式转换成 backgroundImage 驼峰格式,请完成此转换功能

    • 以 - 为分隔符,将第二个起的非空单词首字母转为大写
    • -webkit-border-image 转换后的结果为 webkitBorderImage
    function cssStyle2DomStyle(sName) {
        var arr = [];
        sName.replace(/(-)?(w+)/g,function(match,p1,p2){
            if(arr.length>=1){
                var pUpper = p2[0].toUpperCase() + p2.substring(1);
                arr.push(pUpper)
            }else{
                arr.push(p2);
            }
        })
        return arr.join('');
       
    }
    

    10、按所给的时间格式输出指定的时间
    格式说明

    对于 2014.09.05 13:14:20
    yyyy: 年份,2014
    yy: 年份,14
    MM: 月份,补满两位,09
    M: 月份, 9
    dd: 日期,补满两位,05
    d: 日期, 5
    HH: 24制小时,补满两位,13
    H: 24制小时,13
    hh: 12制小时,补满两位,01
    h: 12制小时,1
    mm: 分钟,补满两位,14
    m: 分钟,14
    ss: 秒,补满两位,20
    s: 秒,20
    w: 星期,为 ['日', '一', '二', '三', '四', '五', '六'] 中的某一个,本 demo 结果为 五

    function formatDate(dateObj, format){
        var obj = {
            yyyy: dateObj.getFullYear(),
            yy: (''+dateObj.getFullYear()).slice(-2),
            MM: ('0'+(dateObj.getMonth()+1)).slice(-2),
            M: dateObj.getMonth()+1,
            dd: ('0'+dateObj.getDate()).slice(-2),
            d: dateObj.getDate(),
            HH:  ('0'+dateObj.getHours()).slice(-2),
            H: dateObj.getHours(),
            hh: ('0'+(dateObj.getHours()%12)).slice(-2),
            h: dateObj.getHours()%12,
            mm: ('0'+dateObj.getMinutes()).slice(-2),
            m: dateObj.getMinutes(),
            ss: ('0'+dateObj.getSeconds()).slice(-2),
            s: dateObj.getSeconds(),
            w:  ['日', '一', '二', '三', '四', '五', '六'][dateObj.getDay()]
        }
        var newDate = format.replace(/([w]+)/g,function(match,p1){
            console.log(p1,obj[p1]);
            return obj[p1];
        })
        
        return newDate;
        
    }
    

    11、判断输入是否是正确的邮箱格式

    function isAvailableEmail(sEmail) {
        var reg=/^([w+.-]+)@w+([.]w+)+$/;
        return reg.test(sEmail)
    }
    
    function isAvailableEmail(sEmail) {
        var reg = /^[w.]+@[w]+(.[w]{2,4})+$/;
        return reg.test(sEmail);
    }
    

    12、将 rgb 颜色字符串转换为十六进制的形式,如 rgb(255, 255, 255) 转为 #ffffff

    • rgb 中每个 , 后面的空格数量不固定
    • 十六进制表达式使用六位小写字母
    • 如果输入不符合 rgb 格式,返回原始输入
    function rgb2hex(sRGB) {
        return sRGB.replace(/^rgb((d+),s*(d+),s*(d+))$/,function($0,$1,$2,$3){
            console.log($0,$1,$2,$3)
            return '#'+toHex($1)+toHex($2)+toHex($3);
        });
        function toHex(num){
            return ('0'+(+num).toString(16)).slice(-2)
    
        }
        
       
    }
    
    
  • 相关阅读:
    NopCommerce代码结构
    至于你信不信,我反正是信了——以类为单位的编程思想
    男人的小金库藏在哪里?——公共数据集Model
    老婆使用说明书——注册系统的逻辑与结构
    ASP.NET学习参考站点
    学了N年英语,你学会翻译了吗?——最基本的数据库连接
    编程也讲禅,您读过《金刚经》吗?——ADO.NET核心类的灭度与SQLHelper的诞生——十八相送(上)
    文件夹病毒专杀工具
    不想当将军的学生,不是好程序员——数据访问层DAL——程序结构的思考
    html的标签一共有多少个?
  • 原文地址:https://www.cnblogs.com/csuwujing/p/9773193.html
Copyright © 2011-2022 走看看