备注:为了方便阅读《Javascript高级程序设计》 以下简称为 《J高》,笔记会引用很多该书内容,同时非常感谢笨蛋的座右铭的《理解Javascript》一系列文章。

引用数据类型和原始数据类型

  • ECMA-262 把类型(type)定义为值的集合,每种原始类型定义了包含它的值的范围及其字面量表示形式
  • 5种原始数据类型:Null、Boolean、Number、String
  • 引用类型就是类(class),引用值就是对象,所以引用类型变量typeof的运算结果一定是一个object
  • 原始数据类型其值存在栈中,引用数据类型值存在堆中
  • 也就是说原始类型的值直接存在变量访问的位置,而引用类型存在变量处的值是一个指向堆的指针
  • String类型比较特殊,它是唯一没有固定大小的原始类型,不过它还是存在栈中……
  • 每一个基础类型都有其对应的引用类型number Number,string String,boolean Boolean,推测结论:基本数据类型是对应引用数据类型的子类,为了提高效率,将基础类型放在了栈内存中,所以undefined继承自null(存疑)
  • 因此所有原始类型也都是伪类,都拥有toString()等object的方法
  • object

undefined 和 null

  • Undefined 代表未赋值的基本数据类型,Null 代表未赋值的引用数据类型
  • Undefined 只有唯一值 undefined,Null下只有唯一的值 null (注意大小写 =。=)
  • 但是为了效率,null 作为引用数据类型,其值仍然存在栈中
  • 因此导致了 null == undefined
  • 《J高》里的说法是,值undefined实际是从null派生(继承)而来的,所以null == undefined
  • 《J高》:typeof(null)会返回object,这是Javascript最初实现中的一个错误,但一直沿用至今,现在null被认为是对象的占位符,但从技术上来说它仍然是原始值(“从技术上说null是原始值”,大概是因为null存在栈中)
  • null 在参与数值运算时其值会自动转换为 0 ,undefined参与任何数值运算时,结果为NaN
  • 当函数无明确返回值时,返回的值是undefined

对象和函数

  • 对象是一个无序属性的集合,这些属性的值位简单数据类型、对象或者函数。
  • 函数是对象的一种,实现上内部熟悉[[Class]]的值位 “Function” ,表明它是函数类型,除了对象的内部属性方法外,还有[[Construct]]、[[Call]]、[[Scope]]等内部属性。内部方法[[Construct]]用于实现作为构造器的逻辑,[[Call]]实现作为函数调用的逻辑。
  • Function是函数类型的用户接口
  • Object是对象类型的用户接口
  • Boolean,Number,String均为这三种简单数值类型的对象包装器
  • Date, Array, RegExp: 可以把它们看作是几种内置的扩展数据类型