《一名【合格】前端工程师的自检清单》学习学习

JavaScript基础

看到最近很火的这个文章,所以该整理下吗?


来源:一名【合格】前端工程师的自检清单

变量和类型

  1. JavaScript规定了几种语言类型?

    分为引用类型(堆区)和初始类型(栈区)

    引用类型:Object

    初始类型: numberstringbooleannullundefinedSymbol(独一无二的值,es6)

  2. JavaScript对象的底层结构是什么

    任何一个对象都有__proto__这个属性,

    只有函数对象有prototype这个属性,在Js,一切皆对象

    实例化对象的时候会做3件事

    1 先创建一个空的对象 nullobj={}

    2 获得指向 obj.proto=Animal.prototype 将__proto__指向构造函数的prototype

    3 完成对象的初始化

  3. Symbol类型在实际开发中的应用、可手动实现一个简单的Symbol

    3.1 Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。

    3.2 Symbol函数前不能使用new命令,否则会报错。

    3.3 Symbol函数可以接受一个字符串作为参数,表示对 Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。

    无参数
    var s1 = Symbol();
    var s2 = Symbol();
    s1 === s2  // false
    有参数
    var s3 = Symbol('s3')
    var s4 = Symbol('s4')
    复制代码

    3.4 Symbol值不能与其他类型的值进行运算,会报错。

    3.5 作为属性名的Symbol

     let mySymbol = Symbol();
        
        // 第一种写法
        let a = {};
        a[mySymbol] = 'Hello!';
        
        // 第二种写法
        let a = {
          [mySymbol]: 'Hello!'
        };
        
        // 第三种写法
        let a = {};
        Object.defineProperty(a, mySymbol, { value: 'Hello!' });
        
        // 以上写法都得到同样结果
        a[mySymbol] // "Hello!"   
    复制代码

    3.6 消除魔术字符串

    魔术字符串指的是,在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。 ...

    更多可以看es6语法 es6

  4. JavaScript中的变量在内存中的具体存储形式

    javascript在内存中分为栈区和堆区,栈区是有序的,先进后出,堆是无序的,里面存放的数据通过指针获取。栈的存取速度大于堆。 基础数据存储在栈区,引用类型数据存放在堆区,比如Object在堆区

    var a = {a:15,b:20}
    var b = a
    b.a = 30 
    alert(a.a)  // 30
    复制代码
  5. 基本类型对应的内置对象,以及他们之间的装箱拆箱操作

    基本类型中的内置对象有 String()Number()Boolean()symbol()

    引用类型的有 RegExp()Date()Error()Array()Function()Object()

    基本类型的装箱拆箱操作:

    装箱转换是指将一个值类型隐式地转换成一个object 类型,或者把这个值类型转换成一个被该值类型应用的接口类型interface-type。把一个值类型的值装箱,也就是创建一个object 实例并将这个值复制给这个object。

    拆箱转换是指将一个对象类型显式地转换成一个值类型,或是将一个接口类型显式地转换成一个执行该接口的值类型。

    强制转换: Number()强制转为数值型 、String()强制转为字符串 Boolean()parseInt()parseFloat() 隐式转换:

    • 算数运算符都是隐式调用number函数进行转换
    • 比较运算符结果一定是boolean类型值,比较运算符调用number,如果转化不了,返回false
      • 特殊 null==undefined为真
    • 逻辑运算符的与和或的结果不一定是boolean类型值,判断结果为判断的值 eg:console.log(0&&123);先判断为假,故输出为0 console.log("123"&&"234");先判断前面为真的时候,再判断后面的结果,判断值为234
  6. 理解值类型和引用类型

  7. nullundefined的区别

    相似处:都属于false

    null表示"没有对象",即该处不应该有值

    undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。

    不同点:

    null用法:

    • 作为函数的参数,表示该函数的参数不是对象
    • 作为对象原型链的终点。

    undefined用法:

    • 变量被声明了,但没有赋值时,就等于undefined。
    • 调用函数时,应该提供的参数没有提供,该参数等于undefined。
    • 对象没有赋值的属性,该属性的值为undefined。
    • 函数没有返回值时,默认返回undefined。
  8. 至少可以说出三种判断JavaScript数据类型的方式,以及他们的优缺点,如何准确的判断数组类型

    var a = "iamstring.";
    var b = 222;
    var c= [1,2,3];
    var d = new Date();
    var e = function(){alert(111);};
    复制代码

    8.1 常见:typeof

    alert(typeof a)   ------------> string
    alert(typeof b)   ------------> number
    alert(typeof c)   ------------> object
    alert(typeof d)   ------------> object
    alert(typeof e)   ------------> function
    复制代码

    typeof 返回类型都是字符串形式,且无法细分判断数组和内置对象如:Date、Array返回的都是Object

    8.2 已知数据类型的判断instanceof

    alert(c instanceof Array) ---------------> true
    alert(d instanceof Date)  ---------------> false
    alert(f instanceof Function) ------------> true
    alert(f instanceof function) ------------> false
    注意:instanceof 后面一定要是对象类型,并且大小写不能错,该方法适合一些条件选择或分支。
    复制代码

    8.3 根据对象的constructor判断

     alert(c.constructor === Array) ----------> true
     alert(d.constructor === Date) -----------> true
     alert(e.constructor === Function) -------> true
     注意: constructor 在类继承时会出错
    复制代码

    8.4 通用但很繁琐的方法:prototype

     alert(Object.prototype.toString.call(a) === ‘[object String]’) -------> true;
     alert(Object.prototype.toString.call(b) === ‘[object Number]’) -------> true;
     alert(Object.prototype.toString.call(c) === ‘[object Array]’) -------> true;
     alert(Object.prototype.toString.call(d) === ‘[object Date]’) -------> true;
     alert(Object.prototype.toString.call(e) === ‘[object Function]’) -------> true;
     alert(Object.prototype.toString.call(f) === ‘[object Function]’) -------> true;
    复制代码
  9. 可能发生隐式类型转换的场景以及转换原则,应如何避免或巧妙应用

    同 5

  10. 出现小数精度丢失的原因,JavaScript可以存储的最大数字、最大安全数字,JavaScript处理大数字的方法、避免精度丢失的方法

原型和原型链

转载于:https://juejin.im/post/5cc68cf1f265da03ab233384

你可能感兴趣的:(《一名【合格】前端工程师的自检清单》学习学习)