• 面试题(1)之 杂七杂八


    1、变量声明的作用域

    function fn () {
        var a = b = c = 1;
    }
    // var a = b = c = 1; => var a = ( b = ( c = 1 ));
    
    // b,c是全局变量
    // 赋值是从右往左进行的,也就是说这一行先执行b=1
    // 这时候b就是全局变量了,没有被var过。
    // 然后是var a = b;
    (function () {
            var  a  =  b  =  1;
    })();
    console.log("a defined? "  +  (typeof  a  !==  'undefined'));
    console.log("b defined? "  +  (typeof  b  !==  'undefined'));

    分析:a 和 b 都定义在自调用函数中,并且都是通过var关键字创建,

    对于sj初学者来说,a 和 b 在函数内部,属于局部变量,所以 a 和 b 的数据类型为undefined。

    这是因为初学者把var a = b = 1 ,错误的理解为以下语句:

    var a = 1;
    var b = 1;

    很显然,这是错误的!实际还是哪个程序执行是自右向左的,实际解析情况如下:

    b = 1; // var声明的是局部变量,若是不带var,变量默认是全局的。
    var a = b;

    因此(不在严格模式下),此段代码输出结果为:

    a defined? false
    b defined? true

    2、arguments 对象

    function test(x, y, z) {  
      alert(test.length);
      alert(arguments.length);
      alert(arguments.callee === test);
      alert(arguments[2]);
    }
    test(10, 20); // 3 2 true undefined

    [JavaScript 之 arguments 对象](https://www.cnblogs.com/houfee/p/10911976.html)

    3、变量提升 和 函数名优先原则

    var x = 30;
    function test() {
      alert(x);
      var x = 10;
      alert(x);
      x = 20;
      function x() { };
      alert(x);
    }
    test(); // function x(){...} 10 20
    // 进入函数作用域以后,函数声明 和 变量声明提升,而且函数名优先

    4、对象的隐式转换

    "5" + {
        toString: function(){return this;},
        valueOf: function(){return "valueOf";}
     }
    // "5valueOf"

    “+” 此时是做为链接符号存在的。

    ECMAScript262中规定,首先对"+"前后的两个表达式进行求值,即调用valueof方法。

    再调用 typeof 对他们的类型进行判断,如果有一个类型为 string 的则都将转化为string。

    不为 string 类型,调用 toString 方法。

    所以后面的 对象 会被转化为string类型。

    5、事件冒泡 和 阻止默认事件

    使用event.stopPropagation()起到阻止捕获和冒泡阶段中当前事件的进一步传播。

    使用event.preventDefault()可以取消默认事件。

    6、列举几个常用的事件对象属性

    • ev.type 获取当前事件名

    • ev.target 获取事件目标最最先触发事件的元素

    鼠标事件对象:

    • 事件对象.clientX / 事件对象.clientY

      鼠标在浏览器可视区域中的坐标

    • 事件对象.offsetX / 事件对象.offsetY

      获取鼠标在指定的元素的区域中的坐标

    • 事件对象.pageX / 事件对象.pageY

      获取鼠标在整个文档区域中的坐标

    键盘事件对象的属性:

    • 事件对象.altKey

      检测是否按下键盘上的 Alt键。 按下返回 true

    • 事件对象.ctrlKey

      检测是否按下键盘上的 Ctrl键。 按下返回 true

    • 事件对象.shiftKey

      检测是否按下键盘上的 Shift键。 按下返回 true

    • 事件对象.keyCode

      返回被敲击的键生成的 Unicode 字符码(ascii码),返回ascii码表对应的十进制的数字

    7、获取本月天数

    let date = new Date()
    let year = date.getFullYear()
    let month = date.getMonth() + 1
    let d = new Date(year, month, 0)
    console.log(d.getDate())
  • 相关阅读:
    bzoj 3238
    bzoj 3473 后缀自动机多字符串的子串处理方法
    bzoj 2998 第k小字串
    bzoj 3672 利用点分治将CDQ分治推广到树型结构上
    bzoj 3671 贪心
    NOIP模拟题——nan
    NOIP模拟题——kun(栈)
    hduP2586——How far away ?
    DP习题
    NOIP模拟题——来自风平浪静的明天
  • 原文地址:https://www.cnblogs.com/houfee/p/10419326.html
Copyright © 2020-2023  润新知