zoukankan      html  css  js  c++  java
  • 随笔,记录JavaScript中的面试题

    我不知道我的js水平怎么样,但是今天有点受打击,看到很多题有坑。看了一些面试题,我记录下今天遇到的坑吧。

    问题1:作用域

    考虑以下代码,输出结果是什么?

    (function() {
     
    var a = b = 5;
     
    })();
     
    console.log(b);

    答案是5。

    这道题我知道,陷阱在于var a = b =5,如果是声明,应该是var a,b =5;这样a,b的值都为5,由于a,b的都在函数作用域里面,所以外部是输出不出来的,则会显示b = undefined。而这里,由于js的特性,所以这里相当于

    var a,
    b = 5

    这里的b = 5是个隐式变量!!!所以相当于window.b = 5,所以外部是可以访问到的。

    问题2:创建“内置”方法

    给String对象定义一个repeatify方法。该方法接收一个整数参数,作为字符串重复的次数,最后返回重复指定次数的字符串。例如:

    console.log('hello'.repeatify(3));

    输出应该是:

    hellohellohello.

    看到这道题,我就在想,这道题的目的在于解决hello这个字符串,然后要复制3个这个字符串,那么这个特别向我刚看到的一个函数,一会再贴。

       String.prototype.repeatify = String.prototype.repeatify || function ( times ) {
                    var str = '';
                    for ( var i = 0 ; i < times ; i++ ) {
                        str += this;
                    }
                    return str;
                };
                console.log ( 'hello'.repeatify(3) );

    这里应该考察的是对proptotype,也就是原型的理解。解释下,加深影响!!String.prototype.repeatify相当于给String的原型添加一个自定义的repeatify方法,function(time)这个函数则是方法,

    首先定义个str,也就是一个空字符串,用来接受传参。repeatify(3)就是要复制3份输出,那么就遍历下吧,有几次,就加几份,这里传入参数3次,那么for循环3次,让str加上this,这里的this就是指代的自身,就是str。等于str=str+str+str,最后return,将str作为值输出,记得今天看到一句话,函数就是找值!!!!!这句话很重要,就是要用值做别的事情!!

    还有个关键点,就是||判断!!!如果有该方法,那就跳过,使用原方法。

    问题3 :声明提前

    下面这段代码的结果是什么?为什么?

    function test () {
           console.log( a );  //undefined
           console.log( foo() );  // 2
           var a = 1;
           function foo() {
               return 2;
           }
       }
       test();

    答案我已经敲出来啦!原来我也不差,这里我需要解释一下,为什么第一个a是undefined呢?很简单啦,这里是声明提升,相当于var a提前到console.log( a );上面去啦,这里a其实并没有赋值,所以就是undefined了;那么为啥函数就可以返回2呢?!因为console.log( foo() );是函数调用,所以在函数体呢,写哪里都是可以的。

    问题4:JavaScript中的this

    下面代码的运行结果是什么并做解释。

    var fullname = 'John Doe';
    
        var obj = {
    
            fullname: 'Colin Ihrig',
    
            prop: {
    
                fullname: 'Aurelio De Rosa',
    
                getFullname: function() {
    
                    return this.fullname;
    
                }}};
    
        console.log( obj.prop.getFullname() );  // Aurelio De Rosa
    
        var test = obj.prop.getFullname;
    
        console.log( test() );  // John Doe

    答案我也写出来,也比较简单,主要是对this的考察,听说面试的时候是必考this的!所以,我还要看更多的例子呀。

    记住一个关键点就是:Javascript中关键字this所指代的函数上下文,取决于函数是怎样被调用的,而不是怎样被定义的。

    所以就简单啦,第一个this调用的是prop里的fullname,而第二个test是定义在全局(window)中的,所以就是在全局的调用啦,那么就调用在全局定义的fullname咯。还是不难的哈,希望我以后有个徒弟,能看到这些笔记,也是我的一个成长记录,我要成为伟大的工程师,而不是一个半吊子或者只知道写代码的码农!我要理解其中的原理,这才是我活着的意义,扯远了。。下一个!

    问题5:call()和apply()

    修复前一个问题,让最后一个console.log() 打印输出Aurelio De Rosa.

    考察call和apply。。。我有点无力,因为这个我还真的搞不明白啊,我需要好好看看啦。

    这个问题可以通过运用call()或者apply()方法强制转换上下文环境。

    console.log(test.call(obj.prop));

    这里。。我就捂脸看书去吧。。

    还有个问题!!今天碰到了!!哎呀妈呀,我做错啦,思考了好久,终于在网上求助找到了答案

    var a = {n:1};  
    var b = a; 
    a.x = a = {n:2};  
    alert(a.x);// --> undefined  
    alert(b.x);// --> Object {n:2}

    为啥这里的a.x是undefined呢?我是想了很久没想明白。。。现在明白了,a.x = a = {n:2};由于.运算符优先于=,所以其实这行代码解析为:

    1、a.x(在a中创建一个x对象,值为null),同时由于 b = a,所以b中也有一个x为null

    2、a = {n:2};这啥意思呢?就是说由于a对象中有n,所以直接修改它的值(哎呀,这让我想到了,创建的字符串、数组是不可修改的!!而对象。。想改就改,没人权啊!)

    3、由于b中有x了,那么就把{n:2}添加到b中。

    赋值结果就是:

    a => {n: 2,x: undefined }
    b => {n: 1, x: {n: 2 } }  

    还有有点绕的啊!不过呢,我还是搞清楚了!啦啦啦~

    查完回来——.(点)、()(小括号)、[](中括号)这三个在js中是运算级最高的!

  • 相关阅读:
    在线微博数据可视化
    SAP系统和微信集成的系列教程之六:如何通过OAuth2获取微信用户信息并显示在SAP UI5应用中
    SAP系统和微信集成的系列教程之五:如何将SAP UI5应用嵌入到微信公众号菜单中
    Jerry在2020 SAP全球技术大会的分享:SAP Spartacus技术介绍的文字版
    索引的正确“打开姿势”
    15个问题告诉你如何使用Java泛型
    华为云FusionInsight MRS:千余节点滚动升级业务无中断
    你的开发好帮手:下一代云原生开发工具技术
    云图说|读请求太多怎么办?一键读写分离来帮忙
    FusionInsight MRS:你的大数据“管家”
  • 原文地址:https://www.cnblogs.com/luohaoran/p/5943284.html
Copyright © 2011-2022 走看看