同花顺前端开发笔试题目

489 阅读7分钟

1、JS包括哪些数据类型,请分别编写3种以上类型的判断函数

数据类型:基本类型和引用数据类型

基本类型:Number String Boolean Null Undefined Symbol(ES6新增,表示独一无二的值) BigInt(es10新增)

引用类型:Array Object Function

判断方式:

1、typeof可以判断Number String Boolean Undefined Symbol BigInt,其它的不行

    console.log(typeof 1) //number
    console.log(typeof "1") //string
    console.log(typeof true) //boolean
    console.log(typeof Symbol()) //symbol
    console.log(typeof undefined) //undefined
    console.log(typeof 10n) //bigint

2、constructor可以判断数据的类型,尤其是typeof无法检测出来的数据类型

    console.log(null === null) //true
    console.log(([]).constructor === Array) //true
    console.log(({}).constructor === Object) //true

3、最实用的一种判断数据类型的方法,就是利用原型

    console.log(Object.prototype.toString.call(1).split(" ")[1].replace(']','')) //Number
    console.log(Object.prototype.toString.call('1').split(" ")[1].replace(']','')) //String
    console.log(Object.prototype.toString.call(true).split(" ")[1].replace(']','')) //Boolean
    console.log(Object.prototype.toString.call(null).split(" ")[1].replace(']','')) //Null
    console.log(Object.prototype.toString.call(undefined).split(" ")[1].replace(']','')) //Undefined
    console.log(Object.prototype.toString.call(10n).split(" ")[1].replace(']','')) //BigInt
    console.log(Object.prototype.toString.call(Symbol()).split(" ")[1].replace(']','')) //Symbol
    console.log(Object.prototype.toString.call([]).split(" ")[1].replace(']','')) //Array
    console.log(Object.prototype.toString.call({}).split(" ")[1].replace(']','')) //Object
    console.log(Object.prototype.toString.call(function(){}).split(" ")[1].replace(']','')) //Function

2、编写一个JS函数,实时显示当前时间,格式:“年-月-日 时:分:秒”

        // 格式:年-月-日 时:分:秒
        const currentTime = ()=>{
        const date = new Date()
        const y = date.getFullYear()
        const m = date.getMonth() + 1  //注意月份要加1才正确
        const d = date.getDate()
        const h = date.getHours()
        const min = date.getMinutes()
        const seconds = date.getSeconds()
        return `${y}年-${m}月-${d}${h}时:${min}分:${seconds}秒`
    }
    console.log(currentTime())

3、如何显示隐藏一个DOM元素

  • 不能点击,不占据空间,DOM可访问,资源会加载:display:none
  • 不能点击,占据空间,DOM可访问,资源会加载:visibility:hidden
  • 能点击,占据空间,DOM可访问:opacity:0
  • 能点击,不占据空间,DOM可访问:opacity:0;position:absolute;
  • 不能点击,占据空间,DOM可访问:position:relative;z-index:-1;
  • 不能点击,不占据空间,DOM可访问:position:absolute;z-index:-1;

4、如何添加html元素的事件处理,有几种方法

    // 1.在html结构中,给元素添加一个属性,属性名为:'on' + 事件名。比如onclick
    <div onclick="alert('飞飞最棒')">aaaaaaa</div>
    // 2.获取到DOM元素,添加点击事件
    <div id="second">第二种方法</div>
    document.getElementById("second").onclick = function(){
        alert("第二种方法")
    }
    // 3.W3C监听方式,事件监听
    <div id="third">第三种方法</div>
    var third = document.getElementById("third")
    third.addEventListener("click",()=>{
        alert("third")
    },false)

5、如何控制alert中的换行

alert("这是\n国庆节,\n但是我在学习")通过\n控制换行

6、判断一个字符串中出现次数最多的字符,统计这个次数

    function aa(s){
        const map = new Map()
        var max = 1
        for(let i=0;i<s.length;i++){
            if(!map.has(s[i])){
                map.set(s[i],1)
            }else{
                map.set(s[i],map.get(s[i])+1)
            }
        }
        map.forEach((value,item) => {
            if(value > max){
                max = value
            }
        })
        return max
    }
    console.log(aa("aaasssssssssdddd2"))//9

7、判断字符串的组成,第一个必须是字母,后面可以是字母、数字、下划线,要求总长度为5-20

    function isStr(ss){
        var reg = /^[a-zA-Z][a-zA-Z0-9_]{4,19}$/
        if(reg.test(ss)){
            console.log("符合规则")
        }else{
            console.log("不符合命名规则")
        }
    }
    isStr("a12324")

8、编写一个函数解析url,将其解析为一个对象,如var url = 'www.baidu.com?key0=0&key1=1&key2=2'

    function parseQueryString(url){
        let obj = {}
        var arr = url.split("?")[1].split("&");
        arr.forEach(element => {
            let key = element.split("=")[0]
            let value = element.split("=")[1]
            obj[key] = value
        });
        return obj
    }
    console.log(parseQueryString("www.baidu.com?key0=0&key1=1&key2=2&key3=3"))

9、页面中有如下结构,要求闭包方式写一段js从文本框中取出值,并在span中显示出来

    (function(){
        var input_value = document.getElementById('field').children[0].value
        var allSpan = document.getElementsByTagName('span')
        for(let i=0;i<allSpan.length;i++){
            if(allSpan[i].className === 'red' )
            allSpan[i].innerHTML = input_value 
        }
    })()
    //闭包的原理就是:函数内部的变量用完立即销毁

10、在IE6.0下不支持position:fixed;请写一个JS使其固定在页面的右下角

思路:利用absolute随滚动条一直调整top值

    //html结构
    <div id="box"></div>
    
    //style样式
        html,body {
            height: 2000px;
        }
        #box {
            position: absolute;
            width: 100px;
            height: 100px;
            background-color: red;
        }
        
    // clientWidth:可视区宽度 offsetWidth:盒模型的宽度
    window.onscroll = window.onresize = window.onload = () => {
        var getDiv = document.getElementById("box");
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
        getDiv.style.left = document.documentElement.clientWidth - getDiv.offsetWidth + 'px';
        getDiv.style.top = document.documentElement.clientHeight - getDiv.offsetHeight + scrollTop + 'px';
    }

11、鼠标移到页面中的任意标签,显示出这个标签的基本矩形轮廓

        function mouseBorder(t){
        // 获取t的所有孩子,包括元素节点和文本节点
        var c = t.childNodes
        for(let i=0;i<c.length;i++){
            var d= c[i];
            // nodeType=1代表该节点是元素节点 2为属性节点 3为文本节点
            if(d.nodeType==1){
                d.onmouseover = function(){
                    this.style.border = '1px solid red'
                    this.style.backgroundColor = 'yellow'
                }
                d.onmouseout = function(){
                    this.style.border=""
                    this.style.backgroundColor = 'transparent'
                }
                mouseBorder(d)
            }
        }
    }
    mouseBorder(document.body)

12、js的基础对象有哪些?window和document的常用方法和属性列出来

基本对象:Function Array Boolean Date Math Number String RegExp Global

Window:

方法:setInterval/setTimeout/clearInterval/clearTimeout/alert/confirm/open

属性:name/parent/screenLeft/screenTop/self/top/status

Document:

方法:createElement/execCommand/getElementId/getElementByName/getElementByTagName

属性:cookie/doctype/domain/documentElement/readyState/URL

13、对象深拷贝的方法,手写深拷贝

思路:递归赋值,拷贝各个层级的属性,赋给一个全新的对象

    function deepClone(sourceObj){
        let objClone = Array.isArray(sourceObj) ? [] : {}
        if(sourceObj && typeof sourceObj === 'object'){
            for(key in sourceObj){
                if(sourceObj.hasOwnProperty(key)){
                    // 判断sourceObj的子元素是否为对象
                    if(sourceObj[key] && typeof sourceObj[key] === 'object'){
                        objClone[key] = deepClone(sourceObj[key])
                    }else{
                        objClone[key] = sourceObj[key]
                    }
                }
            }
        }
        return objClone
    }

方法二:利用JSON的stringfy和parse实现,不过有以下几个缺点:

  • 如果obj里面有时间对象,则通过该方法转换后时间知识以字符串的形式存在的。
  • 如果obj里面有正则表达式、Error对象,转换后的结果只是空对象
  • 如果obj里面有函数、undefined,则转换后会把函数或者undefined丢失
  • 如果obj里面有Nan\Infinity\则转换后会是null

14、JS如何定义class,如何扩张prototype

方法一:构造函数法

function Cat(){
    this.name = '大毛';
}
//生成实例使用new关键字,类的属性和方法定义在构造函数的prototype上
Cat.prototype.makeSound = function(){
    alert("喵喵喵");
}

方法二:Object.create()法,用这个方法,类就是一个对象,不是函数

var Cat = {
    name:'大毛',
    makeSound:function(){
        alert("喵喵喵");
    }
}
//直接用Object.create()生成实例,不需要new
var cat1 = Object.create(Cat)

方法三:极简主义法 首先,定义一个类,在这类里面定义一个构造函数,用来生成实例。

var Cat = {
    createNew : function(){
        
    }
}

然后,在createNew()里面定义一个实例对象,把实例对象作为返回值

var Cat = {
    createNew : function(){
        var cat = {};
        cat.name = '大毛';
        cat.makeSound = function(){
            alert("喵喵喵")
        };
        return cat;
    }
}

最后,使用的时候调用Cat的createNew的方法就可以得到实例对象

var cat1 = Cat.createNew();
cat1.makeSound();

15、什么是ajax,ajax的交互模型?同步和异步的区别?如何解决跨域?

  • 1.Ajax是什么?

Ajax是一种使用现有技术集合,技术包括HTML/XHTML/CSS/JS/XMLHTTPRequest,用于浏览器与服务器之间使用异步数据传输,做到局部请求以实现局部刷新。

  • 2.Ajax的作用?

局部刷新页面、页面加载后从服务器请求数据、页面加载后从服务器接收数据、向后台服务器发送数据

  • 3.Ajax交互模型(流程):
  1. 启动,获取XMLHttpRequest对象
  2. open,打开url通道,并设置异步传输
  3. send,发送数据到服务器
  4. 服务器接收数据并处理,处理完成后返回结果
  5. 客户端接收服务器端返回
function getData(){
    var request = new XMLHttpRequest();
    request.open('get','https://api.muxiaoguo.cn/api/lishijr/')
    request.send()
    request.onreadystatechange = function(){
        if(request.readyState === 4 && request.status === 200){
            var res = JSON.parse(request.responseText);
            console.log(res)
        }
    }
}
  • 4.同步和异步的区别?

同步:阻塞模式,脚本停留并等待服务器发送回复后再继续

异步:非阻塞模式,脚本允许页面继续其进程并处理可能的回复

  • 5.解决跨域的方式?

方法一:JSONP原理

JSONP的优点是兼容性好,但是JSONP请求一定需要对方的服务器支持才可以。缺点是只支持get方法,具有局限性。原理是通过回调的形式实现跨域,通过script标签实现跨域请求,然后在服务端输出JSON数据并执行回调函数。

<script src="jsonp.txt">
    //3.1script标签src不存在跨域,可以引入任意扩展名的文件,如果里面存在js代码,可以直接使用
    // script引入本地的文件,但是没有名字没办法使用
</script> 
//jsonp.txt是自己键的一个文件,里面是数据 
fn(['zhangsan','lisi','wangwu','zhaoliu','sunqi']);
//在另一个文件访问的时候可以通过如下代码
<script>
    function fn(data){
    	console.log(data);//['zhangsan', 'lisi', 'wangwu', 'zhaoliu', 'sunqi'] 
}
</script>

方法二:CORS解决跨域

实现CORS的关键是服务器,只要服务器实现了CORS接口,就可以跨源通信。在响应头添加Access-Control-Allow-Origin属性,指定同源策略的地址。

header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Method:POST,GET');

方法三:Nginx

浏览器在访问受限时,可通过不受限的代理服务器访问目标站点。proxy代理是前端用的最多的解决跨域的方法。即配置一台和浏览器相同端口的服务器,浏览器访问代理服务器,代理服务器向目标服务器发送请求,由于服务器之间不存在跨域问题,代理服务器就可以拿到请求数据,又因为浏览器和代理服务器的端口一致,不存在跨域问题,因此浏览器不会拦截从代理服务器拿到的数据,顺利拿到请求数据。