JavaScript基础自检之变量和类型

339 阅读3分钟

这个记录(或说笔记),参照一名【合格】前端工程师的自检清单这篇文章,根据里面所提的某些问题,进行归纳和回答。总结内容,有很多来来自各位前辈的文章,在这谢谢各位!为方便查找,我把其他文章贴在下面:

  1. JavaScript基础自检之原型和原型链
  2. JavaScript基础自检之变量和类型
  3. JavaScript基础自检只作用域闭包

JavaScript对象的底层数据结构是什么?

我认为应该是数组和链表,不知道这个回答对不对。有错误,请各位指出来。

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

Symbol,是ES6新引入的基础数据类型之一。类似字符串但又不是,可做对象中的key,且是唯一不重复的。 Symbol在ES5的实现,可参考这篇文章:ES6 系列之模拟实现 Symbol 类型

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

JavaScirpt中的变量是没有类型的,类型所存储(或指向)的值又类型。JavaScript中的值类型:

  • 基本数据类型
    null、undefined、number、boolean、string以及symbol。
  • 引用数据类型
    object

变量值存储于内存中,分别为堆和栈。其中,基本数据类型存储于栈中;而复合数据类型的变量存储于栈中,是一个指向值的指针,真正的值存储于堆中。

基本类型对应的内置对象,以及它们之间的拆箱和装箱操作。

undefined和null都是单一值,也就不会有拆箱和装箱;下面我们来说基本类型中三种类型(number、boolean以及string)对应的装箱和拆箱。

拆箱和装箱

拆箱:将对象转换为基本类型值;
装箱:将基本类型值转换为对应的对象类型。

  • 装箱
    • 隐式装箱
          var num = 123;
          console.log(num.toFixed());
      
      上面的代码中,num(number类型)是没有toFixed这个方法的,这里引擎进行了装箱操作,将num转换为Number对象,再调用toFixed方法
    • 显式装箱
          // Number
          var num = new Number(123);
          num.toFixed(); // 输出 '123'
          
          // String
          var str = new String(123);
          console.log(str); // 输出:String { '123' }
          
          // Boolean
          var boolean = new Boolean(null);
          console.log(boolean); // 输出:Boolean { false }
      
  • 拆箱
      // number
      var num = new Number(123);
      var obj = {
          [num]: '122',
      }
      console.log(obj); // 输出:{ '123': '122'}
      
      // string
      var str = new String(123);
      var obj = {
          [str]: '123',
      }
      console.log(obj); // 输出: { '123': '123' }
    
      // Boolean
      var boolean = new Boolean(1);
      var obj = {
          [boolean]: '123',
      }
      console.log(obj); // 输出: { 'true': '123' }
      
      // symbol
      var dd = Symbol('werwe');
      var obj = {
          [dd]: '123',
      }
      console.log(obj); // 输出:{"Symbol(werwe)": '123'}
    

判断JavaScript数据类型的方式。

  • typeof
  • instanceof
  • Object.prototype.toString.call()
  • constructor

隐式类型发生转换的场景以及转换原则

  • 发生的场景
    • 基本运算:加减乘除
    • 相等运算符:==
  • 转换原则
    • ToPrimitive转换
      一般发生在对象转换为基础类型。这个过程的转换过程,取决于ToPrimitive的第二个参数。第二个参数的默认值为Number(另一个可选值为String)。如果为Number,则会按照下图流程进行转换;如果为String,则只是toString先调用。

    • ToNumber

      参数
      undefined NaN
      null 0
      boolean 真 转换为 1,假转换为 0
      字符串 数字或NaN
      对象 ToPrimitive转换得到基础类型值,再调用ToNumber进行转换
    • ToString

      参数
      undefined 'undefined'
      null 'null'
      boolean 真 转换为 'true',假转换为 'false'
      数字 对应数字的字符串形式
      对象 ToPrimitive转换得到基础类型值,再调用ToString进行转换

-------------------------------- 完---------------------------------------