美文网首页笔试&&面试经验Java WebWeb前端之路
整理前端面试题(十) : Javascrip相关

整理前端面试题(十) : Javascrip相关

作者: 熠辉web3 | 来源:发表于2017-08-31 00:41 被阅读452次

    1. 请将一个URL的search部分参数与值转换成一个json对象?

     function getJsonFromUrlSearch ( search ) {
    
        var item;
        var result = {};
        
        if( search.indexOf( '&' ) < 0){
            item = search.split( '=' );
            result[ item[ 0 ] ] = item[ 1 ];
            return JSON.stringify( result );
        }
    
        var splitArray = search.split( '&' );
        
        for( var i = 0; i < splitArray.length; i++ ){
            item = splitArray[ i ].split( '=' );
            result[ item[ 0 ] ] = item[ 1 ];
        }
    
        return JSON.stringify( result );
        
    }
    
    

    2. 请实现jQuery的Ajax请求函数:

    var $ = {
        //把对象转成http协议要求的字符串
        param: function( obj ){
    
            var html = '';
            for ( var key in obj ){
                html += key + '=' + obj[ key ] + '&';
            }
            html = html.slice( 0, -1 );
            return html;
    
        },
    
        //封装ajax方法,参数是一个对象的形式
        ajax: function( option ) {
    
            var type = option.type || 'get',
            var url  = option.url || '',
            var data = this.param( option.data || {} );
            var success = option.success;
    
            //实例化对象
            var xhr = new XMLHttpRequest();
            
            //设置请求行
            if( type == 'get' ){
                url = url + '?' + data;
                data = null;
            }
            xhr.open( type, url );
            
            //设置请求头
            if( type == 'post' ){
                xhr.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
            }
            
            //设置请求正文
            xhr.send( data );
            
            //监听并处理响应
            xhr.onreadystatechange = function() {
                if( xhr.readyState == 4 && xhr.status == 200 ){
                    success( xhr.responseText );
                }
            }
    
        }   
        
    }  
    

    3. 请简要描述web前端性能需要考虑哪方面,你的优化思路是什么?

    参考: 前端优化:雅虎35条


    4.下面的代码的结果是什么?该如何优化该代码?

    let person = {
        name : 'joe'
    }
    
    Object.defineProperty( person, 'name', {
        set: function( value ){
            person.name = value;
        },
        get: function( value ){
            return person.name;
        }
    })
    
    person.name = 'rose'; 
    console.log( person.name );
    

    答: 该代码会出现死循环, 解决办法如下面代码所示

    'use strict'
    let person = {
        name : 'joe'
    }
    let tmp ;
    
    Object.defineProperty( person, 'name', {
        set: function( value ){
            tmp = value;
        },
        get: function(){
            return tmp;
        }
    })
    
    person.name = 'rose';
    console.log( person.name );  //rose
    

    5.Promise对象有哪些状态?

    • pending:初始状态, 不是成功或失败状态
    • fulfilled (也叫resolved): 意味着操作成功完成
    • rejected: 意味着操作失败

    Promise对象只能从pengding状态变成fulfilled状态, 或者pending状态变成rejected状态. 不会有其他状态之间的转变.


    6.babel和browserify的作用分别是什么?

    • babel是一个编译器, 可以把ES6, ES7或者React的JSX语法编译成为ES5的语法, 实现浏览器的兼容.
    • browserify 能够让浏览器兼容CommonJS规范的require()方法,以此让你的代码中使用require()实现模块依赖的代码能够正常执行.

    7. 请写一个函数,用来实现对象的深拷贝?

    function deepClone( obj ){
        return JSON.parse( JSON.stringify( obj ) );
    }
    

    8. 采用最少的遍历方式完成以下数组的去重?

    var arr1 = [ 1, 2, 3, 3, 4, 6, 6, 12, 12 ];
    var result = [];
    var obj = {};
    for( let i = 0; i < arr1.length; i++ ){
    
        if( !obj[ arr1[ i ] ] ){
            obj[ arr1[ i ] ] = true;
            result.push( arr1[ i ]);
        }
    
    }
    

    9. 简述readyonly与disabled的区别

    1. readonly只针对input(text/password)和textarea有效, disabled对所有的表单元素都有效
    2. 提交时,readonly的值会被提交, disabled的值不会被提交

    10.请简述下什么是同源策略?

    同源策略是Netscape公司提出的一个安全策略, 所有支持JavaScript的浏览器都会运用到这个安全策略. 所谓的同源是指域名,协议和端口都一致.只有当同源的情况下,才可以读取Cookie, LocalStorage和IndexDB,发送Ajax请求.浏览器这样做的目的是保证用户的数据安全.

    相关文章

      网友评论

      • 芸芸人海之中独独遇见你:第8题,return Array.from(set[arr])即可
        芸芸人海之中独独遇见你:@Lee_tanghui 嗯,你写的也没有任何问题,读者都能获益,很棒:+1:
        熠辉web3: @陈小源10点20删 感谢!
        熠辉web3:恩,我之前还真不知道这ES6的写法.查了下,完整的写法应该是:
        function distinct ( arr ){
        return Array.from( new Set( arr ) );
        }
      • zkhChris:大佬,第4个为什么死循环呢?
        熠辉web3: @zkhChris 不客气
        zkhChris: @Lee_tanghui 谢啦!
        熠辉web3: @zkhChris 因为执行了设置name属性的操作,所以会进入到set函数中。set函数中同时也进行了设置操作"set.name =value",所以就永远在set函数中了。
        如果把console.log(person.name)放前面也会死循环,因为永远在get函数中。这是Object.defineProperty()的特性

      本文标题:整理前端面试题(十) : Javascrip相关

      本文链接:https://www.haomeiwen.com/subject/rcyfjxtx.html