最近几日去参加一些面试,多多少少有一些收获。

现将遇到的一些面试题,做一下分析和总结。


1、使用原生JS,不能使用递归,查找dom中所有以“<com-”开头的自定义标签tagName。

 <!DOCTYPE html>
 <html lang="zh">

     <head>
         <meta charset="UTF-8" />
         <meta name="viewport" content="width=device-width, initial-scale=1.0" />
         <meta http-equiv="X-UA-Compatible" content="ie=edge" />
         <title>DOM获取自定义标签</title>
     </head>

     <body>
         <con-1>con11</con-1>
         <con-2>con22</con-2>
         <con-3>con33</con-3>

         <p>p11</p>
         <p>p12</p>
         <p>p13</p>
         <p>p14</p>

         <com-1>com11</com-1>
         <com-2>com12</com-2>
         <com-3>com13</com-3>

         <script type="text/javascript">
             //获取body下的所有内容,结果为字符串
             var str = document.getElementsByTagName('*')[0].innerHTML;
             console.log(str);

             //使用正则表达式,用于匹配字符串中对自定义标签
             var reg = /<com-.*>.*<\/com-.*/g;

             //利用字符串对象的match()方法并结合正则,获取字符串str中匹配的正则子串,结果为数组
             var res = str.match(reg);

             console.log(res);

             /*

             输出的结果:
             <com-1>com11</com-1>

             <com-2>com12</com-2>

             <com-3>com13</com-3>
              */
         </script>
     </body>

 </html>

2、将一个多维对象转换为二维对象:

    // 封装一个函数,使得对象obj转换后的结果为objTo的形式         

        var obj = {
                "data": {
                    "err": 1,
                    "msg": "错误"
                },
                "list": ["a", "b"],
                "request_id": "geo5-esd1-efor-veuq"
            };
            var objTo = {
                "data.err": 1,
                "list.0": "a",
                "list.1": "b",
                "reuqest_id": "geo5-esd1-efor-veuq"
            };            

js代码如下:

<script type="text/javascript">
            var obj = {
                "data": {
                    "err": 1,
                    "msg": "错误"
                },
                "list": ["a", "b"],
                "request_id": "geo5-esd1-efor-veuq"
            };
            var objTo = {
                "data.err": 1,
                "list.0": "a",
                "list.1": "b",
                "reuqest_id": "geo5-esd1-efor-veuq"
            };

            //封装函数
            function toObj(obj) {
                var newObj = {};

                for(let pro in obj) {
                    if(obj[pro].push != undefined) {
                        for(let i = 0; i < obj[pro].length; i++) {
                            newObj[pro + '.' + i] = obj[pro][i];
                        }
                    } else if(typeof obj[pro] == 'object') {
                        for(let j in obj[pro]) {
                            if(obj[pro][j] == '错误') {

                            } else {
                                newObj[pro + '.' + j] = obj[pro][j];
                            }
                        }
                    } else {
                        newObj[pro] = obj[pro];
                    }
                }
                return newObj;
            }
            console.log(toObj(obj));
        </script>

3、写一种方法:将一个维度比较高的对象转换为GET参数模式(URL地址拼接的带有参数的字符串)

该方法写的有点乱,如果有哪位大神有更优的解决方法,希望共勉!

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>对象转换为URL参数</title>
    </head>

    <body>
        <script type="text/javascript">
            var obj = {
                "openid": "123456",
                "userinfo": {
                    "name": "小明",
                    "sex": "男",
                    "tags": ["读书", "游戏", "旅行"],
                    "settings": {
                        "theme": "white",
                        "signature": "好好学习天天向上",
                        "size": 16
                    }
                },
                "status": 200
            };

            //封装函数
            function toURL(obj) {
                var str = '?';

                for(var key in obj) {
                    if(key == 'status') {

                    } else {
                        //判断数据类型
                        var type = typeof(obj[key]);
                        //基本类型数据拼接
                        if(type == 'string' || type == 'number' || type == 'boolean') {
                            str += key + '=' + encodeURIComponent(obj[key]) + '&';
                        } else if(type == 'object') {
                            //对象类型判断
                            for(var pro in obj[key]) {
                                var type2 = typeof(obj[key][pro]);
                                if(type2 == 'string' || type2 == 'number' || type2 == 'boolean') {
                                    str += key + '.' + pro + '=' + encodeURIComponent(obj[key][pro]) + '&';
                                } else if(type2 == 'object') {
                                    //判断对象数据是否为数组
                                    if(obj[key][pro] instanceof Array) {
                                        var arr = obj[key][pro];
                                        var strs = '';
                                        for(var k = 0; k < arr.length; k++) {
                                            strs += encodeURIComponent(strArr[k]);
                                        }
                                        str += strs;
                                    } else {
                                        for(var pros in obj[key]) {
                                            str += 'obj' + '.' + key + '=' + encodeURIComponent(obj[key][pro]) + '&';
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                //处理字符串末尾的&字符
                str = str.substring(0, str.length - 1);
                console.log(str);
            }
            toURL(obj);

        </script>
    </body>

</html>

面试奇遇 -- 原生JS的更多相关文章

  1. 【面试篇】寒冬求职季之你必须要懂的原生JS(中)

    互联网寒冬之际,各大公司都缩减了HC,甚至是采取了“裁员”措施,在这样的大环境之下,想要获得一份更好的工作,必然需要付出更多的努力. 一年前,也许你搞清楚闭包,this,原型链,就能获得认可.但是现在 ...

  2. 原生JS实现jquery的链式编程。

    这是我根据之前遇到的一个面试题,题目:用原生JS实现$("#ct").on("click",fn).attr("id"). 然后看了篇jqu ...

  3. 原生JS面试题

    面试中遇到的原生js题总结   1.js 去重1) indexOf Array.prototype.unique = function(){ var result = []; var len = th ...

  4. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  5. 常用原生JS方法总结(兼容性写法)

    经常会用到原生JS来写前端...但是原生JS的一些方法在适应各个浏览器的时候写法有的也不怎么一样的... 今天下班有点累... 就来总结一下简单的东西吧…… 备注:一下的方法都是包裹在一个EventU ...

  6. 原生JS实现"旋转木马"效果的图片轮播插件

    一.写在最前面 最近都忙一些杂七杂八的事情,复习软考.研读经典...好像都好久没写过博客了... 我自己写过三个图片轮播,一个是简单的原生JS实现的,没有什么动画效果的,一个是结合JQuery实现的, ...

  7. 再谈React.js实现原生js拖拽效果

    前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...

  8. React.js实现原生js拖拽效果及思考

    一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...

  9. 原生JS实现全屏切换以及导航栏滑动隐藏及显示——重构前

    思路分析: 向后滚动鼠标滚轮,页面向下全屏切换:向前滚动滚轮,页面向上全屏切换.切换过程为动画效果. 第一屏时,导航栏固定在页面顶部,切换到第二屏时,导航条向左滑动隐藏.切换回第一屏时,导航栏向右滑动 ...

随机推荐

  1. UVaLive 6581 && Gym 100299B What does the fox say? (模拟+STL)

    题意:给定一些动物的叫声,然后再定某些动物的叫声,让你去除这些叫声后得到的叫声. 析:先存储所有的叫声,然后用map来记录其他的叫声,在输出时再判定一下就好. 代码如下: #pragma commen ...

  2. Android笔记---常用控件以及用法

    这篇文章主要记录下Android的常用控件以及使用的方法,Android 给我们提供了大量的UI控件,合理地使用这些控件就可以非常轻松地编写出相当不错的界面,这些是Android学习的基础,没有什么业 ...

  3. 51nod 1119【杨辉三角】

    思路: = =杨辉三角的应用,组合数的应用: C(N+M,N); 逆元一发,费马小定理,OK. #include <stdio.h> #include <string.h> # ...

  4. POJ2366【二分】

    题意: 给两个序列,问两个序列中是否有两个数加起来=1e4: 思路: 直接先排序好b序列,然后枚举a序列,二分查找b序列就好了: 贴一发挫code-. //#include <bits/stdc ...

  5. bzoj 4161 Shlw loves matrixI【常系数线性齐次递推】

    并不会递推,不过板子挺好背的,只要是类似的递推都能用,但是注意c数组不能使负数 如果除了递推还有常数项的话,就用f[i]-f[i-1]的方式消掉常数项(然后多一个f[i-1]的项) #include& ...

  6. IT兄弟连 JavaWeb教程 Servlet中定义的变量的作用域类型

    在Java语言中,局部变量和实力变量有着不同的作用于,它们的区别如下: 局部变量在一个方法中定义,每当一个线程执行局部变量所在的方法时,在线程的堆栈中就会创建这个局部变量,当线程执行完该方法,局部变量 ...

  7. js页面字段的必填验证方法

    https://blog.csdn.net/fn_2015/article/details/73498462 <script type="text/javascript" s ...

  8. tcp聊天交互

    #****setver端 import socket sk = socket.socket() adress = ('127.0.0.1', 8032) sk.bind(adress) sk.list ...

  9. Codeforces Round #261 (Div. 2) E

    Description Pashmak's homework is a problem about graphs. Although he always tries to do his homewor ...

  10. 如何修改phpmyadmin上传文件大小限制

    修改php配置文件,php.ini upload_max_filesize = 100M post_max_size = 100M 一般修改这2个就行了,然后重启wampserver 如果还不行,就执 ...