美文网首页JavaScript前端面试题
Javascript面试应该注意的点

Javascript面试应该注意的点

作者: Aniugel | 来源:发表于2018-11-21 20:54 被阅读1次

    NaN(Not a Number,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。

    基本数据类型:字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。6类
    引用数据类型:对象(Object)、数组(Array)、函数(Function)。3类
    注:Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。

    JavaScript 变量的生命期从它们被声明的时间开始。

    局部变量会在函数运行以后被删除。
    全局变量会在页面关闭后被删除。

    向未声明的 JavaScript 变量分配值

    如果您把值赋给尚未声明的变量,该变量将被自动作为 window 的一个属性。
    这条语句:
    carname="Volvo";
    将声明 window 的一个属性 carname。

    非严格模式下给未声明变量赋值创建的全局变量,是全局对象的可配置属性,可以删除。
    var var1 = 1; // 不可配置全局属性
    var2 = 2; // 没有使用 var 声明,可配置全局属性
    console.log(this.var1); // 1
    console.log(window.var1); // 1
    delete var1; // false 无法删除
    console.log(var1); //1
    delete var2;
    console.log(delete var2); // true
    console.log(var2); // 已经删除 报错变量未定义

    如果在文档已完成加载后执行 document.write,整个 HTML 页面将被覆盖。
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
    </head>
    <body>
    <h1>我的第一个 Web 页面</h1>
    <p>我的第一个段落。</p>
    <button onclick="myFunction()">点我</button>
    <script>
    function myFunction()
    {
        document.write(Date());
    }
    </script>
    </body>
    </html>
    

    在 HTML 中, 全局变量是 window 对象: 所有数据变量都属于 window 对象。
    你的全局变量,或者函数,可以覆盖 window 对象的变量或者函数。
    局部变量,包括 window 对象可以覆盖全局变量和函数。
    在 JavaScript 中, 对象和函数同样也是变量。全局和局部变量即便名称相同,它们也是两个不同的变量。修改其中一个,不会影响另一个的值

    事件委托是: 利用事件冒泡的原理,让自己的所触发的事件,让他的父元素代替执行!
    闭包是什么,有什么特性,对页面有什么影响
    闭包就是能够读取其他函数内部变量的函数,使得函数不被GC回收,如果过多使用闭包,容易导致内存泄露
    变量提升:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部。
    JavaScript 只有声明的变量会提升,初始化的不会。
    JavaScript 严格模式(strict mode)不允许使用未声明的变量。在函数内部声明是局部作用域 (只在函数内使用严格模式):消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
    对象也是一个变量。不允许删除变量或对象。不允许删除函数。不允许变量重名:不允许变量重名:不允许使用八进制:不允许使用转义字符:不允许对只读属性赋值:

    "use strict";
    x = {p1:10, p2:20};      // 报错 (x 未定义)
    
    "use strict";
    var x = 3.14;
    delete x;  
    
    "use strict";
    function x(p1, p2) {}; 
    delete x;                // 报错 
    
    "use strict";
    function x(p1, p1) {};   // 报错
    
    JavaScript 中的所有数据都是以 64 位浮点型数据(float) 来存储。所有的编程语言,包括 JavaScript,对浮点型数据的精确度都很难确定:
    
    var x = 0.1;
    var y = 0.2;
    var z = x + y;//0.30000000000000004
    

    在 JavaScript 中,分号是可选的 。由于 return 是一个完整的语句,所以 JavaScript 将关闭 return 语句。| 注意:不用对 return 语句进行断行。 |

    function myFunction(a) {
        var
        power = 10;  
        return
        a * power;
    }
    //两者是一致的
    function myFunction(a) {
        var
        power = 10;  
        return;       // 分号结束,返回 undefined
        a * 
    

    在 JavaScript 中, 对象 使用 名字作为索引。如果你使用名字作为索引,当访问数组时,JavaScript 会把数组重新定义为标准对象。执行这样操作后,数组的方法及属性将不能再使用,否则会产生错误:
    循环作用域,在第一个实例中,使用了 var 关键字,它声明的变量是全局的,包括循环体内与循环体外。在第二个实例中,使用 let 关键字, 它声明的变量作用域只在循环体内,循环体外的变量不受影响

    var i = 5;
    for (var i = 0; i < 10; i++) {
        // 一些代码...
    }
    // 这里输出 i 为 10
    
    let i = 5;
    for (let i = 0; i < 10; i++) {
        // 一些代码...
    }
    // 这里输出 i 为 5
    

    使用 let 关键字声明的全局作用域变量不属于 window 对象:不能使用 window.carName 访问变量。
    使用 var 关键字声明的变量在任何地方都可以修改

    var x = 2;
    // x 为 2
    var x = 3;
    // 现在 x 为 3
    

    在相同的作用域或块级作用域中,不能使用 let 关键字来重置 var 关键字声明的变量

    var x = 2;       // 合法
    let x = 3;       // 不合法
    {
        var x = 4;   // 合法
        let x = 5   // 不合法
    }
    

    const 用于声明一个或多个常量,声明时必须进行初始化,且初始化后值不可再修改:
    // 错误写法
    const PI;
    PI = 3.14159265359;
    // 正确写法
    const PI = 3.14159265359;

    const 的本质: const 定义的变量并非常量,并非不可变,它定义了一个常量引用一个值。使用 const 定义的对象或者数组,其实是可变的。下面的代码并不会报错:
    // 创建常量对象
    const car = {type:"Fiat", model:"500", color:"white"};
    // 修改属性:
    car.color = "red";
    // 添加属性
    car.owner = "Johnson";
    void 该操作符指定要计算一个表达式但是不返回值;可以做死锚点

    事件传递有两种方式:冒泡(默认)与捕获。
    事件传递定义了元素事件触发的顺序。 如果你将 <p> 元素插入到 <div> 元素中,用户点击 <p> 元素, 哪个元素的 "click" 事件先被触发呢?在 冒泡 中,内部元素的事件会先被触发,然后再触发外部元素,即: <p> 元素的点击事件先触发,然后会触发 <div> 元素的点击事件。在 捕获 中,外部元素的事件会先被触发,然后才会触发内部元素的事件,即: <div> 元素的点击事件先触发 ,然后再触发 <p> 元素的点击事件。addEventListener() 方法可以指定 "useCapture" 参数来设置传递类型:addEventListener(event, function, useCapture);

    <body>
      <div id="div">
        <p id="demo">点击</p>
      </div>
    </body>
    <script>
      document.getElementById("demo").addEventListener("click", function () {
        alert("oooo", true)
      });
      document.getElementById("div").addEventListener("click", function () {
        alert("9999")
      }, true);
    </script>
    

    清除事件监听

    <body>
      <div id="div">
        remove
      </div>
      <p id="demo">点击</p>
    </body>
    <script>
      function demo() {
        console.log("oooooo")
      }
      document.getElementById("demo").addEventListener("click", demo);
      document.getElementById("div").addEventListener("click", function () {
        document.getElementById("demo").removeEventListener("click", demo);
      });
    </script>
    

    isNaN( )判断原理:
    首先给内部Number( )进行转换,只要Number( )转换出来是数字直接为false,否则为true isNaN(“99999”)=>false ;除以0是无穷大,无穷大是一个数字:

    {}是一个不完全空的对象,因为他的原型链上还有Object呢,而null就是完全空的对象,啥也没有,原型链也没有,所以null instanceof Object === false;[]就更不用说了,它的原型链上还比{}多一个Array。
    所以,纯粹意义上初始化一个空对象应该用null,{}更像是初始化对象,和new一个没有key的Obejct是一样的。还有就是空数组转换成布尔类型返回的是true:

    相关文章

      网友评论

        本文标题:Javascript面试应该注意的点

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