zoukankan      html  css  js  c++  java
  • 不容忽视的js面试题

    1、全局变量和局部变量(变量提升和连等赋值问题)

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

    上面代码运行结果如下:

    上面代码中声明了两个变量,a 使用关键字var声明的。代表它是一个局部变量。而b则是一个全局变量。调用在该作用域未声明的变量,是会报错的。而一个变量只声明,但未定义赋值的时候,才会是undefined。很明显,变量a在全局作用域未曾声明,并不存在,所以会报错!

    首先连等操作符是从右向左赋值的,b = 5; var a = b; 变量a是用var进行声明并赋值的所以是局部变量, 变量b是未用var声明的变量在javscritp中是一个隐式全局变量。所以在外面consoloe.log(b) 是5, console.log(a) 报错 a is no defined.

    2、数组求和

    Array.prototype.sum = function () {
        for (var sum = i = 0; i < this.length; i++)sum += parseInt(this[i]);
        return sum ;
    };
    

    3、数组求最大值

    Array.prototype.maxNum = function () {
        for (var i = 0, maxValue = Number.MIN_VALUE; i < this.length; i++)parseInt(this[i]) > maxValue && (maxValue = this[i]);
        return maxValue;
    };
    

     4、

    var a = 100;    
    function test(){    
      var b = 2 * a; 
      var a = 200;      
      var c = a / 2;
      console.log(b);    
      console.log(c);    
    }    
    test()
    

    上面代码运行结果如下:

    当全局变量和局部变量同名的时候,全局变量是不会主用于同名局部变量的作用域的。也就是说var a=100是不会作用于test这个函数中的。

    引用:
    1.全局变量和它的作用域
      全局变量是指在程序开头的说明部分定义和说明的量。它的作用域分为两种情况:
    (1)在全局变量和局部变量不同名时,其作用域是整个程序。
    (2)在全局变量和局部变量同名时,全局变量的作用域不包含同名局部变量的作用域。
    2.局部变量和它的作用域
      凡是在子程序内部使用的变量,必须在子程序中加入说明。这种在子程序内部说明的变量称为局部变量。局部变量的作用域是其所在的子程序。形式参数也只能在子程序中有效。因此也属于局部变量。局部变量的作用域分为两种情况:
    (1)当外层过程序的局部变量名和嵌套过程中的局部变量不同名时,外层过程的局部变量作用域包含嵌套过琛。
    (2)当外层过程的局部变量名和嵌套过程内的局部变量名同名时,外层局部变量名的作用域不包含此过程。

    5、

    console.log(0.1 + 0.2 === 0.3);
    

    上面代码运行结果:false

    6、

    console.log(0 || "1" && 2);
    

     上面代码运行结果:2

    7、

    console.log(2 in [1,2]);
    

     上面代码运行结果:false

    关键字:in

    判断对象是否为数组/对象的元素/属性:

    格式:(变量 in 对象)

      当“对象”为数组时,“变量”指的是数组的“索引”;

      当“对象”为对象是,“变量”指的是对象的“属性”。

    var arr = ["a","b","2","3","str"];  
    var a= ("b" in arr);  
    var b= (4 in arr);
    console.log(a);
    console.log(b);

     8、

    var a=[1,2],b=[3],c=6;
    function test(a1,b1,c1){
        a1=[];
        b1[0]=4;
        c1=7;
    }
    test(a,b,c);
    console.log(a);
    console.log(b);
    console.log(c);
    

     上面代码运行结果如下:

    9、事件循环

    function printing() {
       console.log(1);
       setTimeout(function(){console.log(2)},1000);
         setTimeout(function(){console.log(3)},0);
         console.log(4);
    }
    printing();
    

    上面代码运行结果如下:

      浏览器有一个事件循环用于检查事件队列,处理延迟的事件。UI事件(例如,点击,滚动等),Ajax回调,以及提供给 setTimeout() 和 setInterval()的回调都会依次被事件循环处理。当调用 setTimeout() 函数时,即使延迟的时间被设置为0,提供的回调也会被排队。回调会乖乖地待在队列中,直到指定的时间用完后,它才开始执行动作。

      因此,即使 setTimeout() 回调被延迟0毫秒,它仍然会被排队,并且直到函数中其他非延迟的语句被执行完了之后,才会执行。所以运行的结果是:1 4 3 2。

    10、

    var f = function g(){
      return 23;
    }
    typeof g()

    上面代码运行结果如下:

      函数定义的方法有两种:(1)直接声明,比如 function g(){} (2) 匿名函数(表达式声明)比如:var f = function(){}

      题目中的函数定义方法属于匿名函数,即右边的函数体赋值给了变量f,只有f() 才会调起函数,而右侧的函数体的g变量已经无法在函数体外进行访问,即g is not defined。

    function g(){
      return 'qqq'
    }
    var f = function g(){
       return 23;  
    }
    g();

    上面代码运行结果如下:qqq

    11、delete

    (function(x){
        delete x;
        return x;
    })(1)

    上面代码运行结果如下:1

    delete的删除机制:delete一般用来删除对象的属性和方法的,不能够删除函数传递的参数。

    delete无法删除用var、let、const声明的变量。

  • 相关阅读:
    数位dp
    可持久化Trie
    网络流
    欧拉定理
    点、边双,圆方树
    [USACO5.3]窗体面积Window Area
    6.2三道模拟
    BZOJ2054 疯狂的馒头
    [USACO5.1]夜空繁星Starry Night
    [USACO5.1]乐曲主题Musical Themes
  • 原文地址:https://www.cnblogs.com/jing428/p/6909904.html
Copyright © 2011-2022 走看看