概述
计算机程序 = 数据结构 + 算法
计算机程序的运行需要对数据进行操作,能够表示操作的值(Literals)的类型(Types) 称为数据类型。
ES3 定义了 6 种语言类型,其中包括 5 种原始数据类型和 1 种引用数据类型。
- 原始数据类型:Undefined、Null、Boolean、String、Number
- 引用数据类型:Object
Undefined
Undefined 类型表示 “未定义”。它仅有一个值 undefined
,并且该值不是 JavaScript 的关键字和保留字,它是一个合法的标识符。
Null
Null 类型表示“空值”,它只有一个值 null
。null
是 JavaScript 的关键字,不能作为标识符使用。
Boolean
Boolean 类型表示一个逻辑实体,它仅有两个值 true
和 false
。
String
字符串是由零个或多个 Unicode 字符(UTF-16)组成的有限有序序列的集合,最大长度为2^53-1。
字符串中每个字符被认为在序列中占据一个位置(索引),这些位置用非负整数表示,索引从 0 开始,依此类推。
字符串的长度就是其中的字符数;空字符串不包含任何字符,因此长度为零。
字符串可以当作只读数组,通过索引访问 'hello'[0]
。
Number
Number 类型使用 IEEE 754 标准来表示整数(32bit-4byte)和浮点数值(64bit-8byte)。
有限大小,其中一半是正数,一半是负数;对于每个有限正数,都有一个相应的负数具有相同的大小。
特殊的数值
NaN
NaN(Not-a-Number) 表示非数值,这个数值用于表示执行一些不合法的数学运算失败后返回的结果,此时不会抛出异常,例如 0/0
、1/"xxx"
。
任何涉及 NaN 的操作(如 NaN/10)都会返回 NaN。
NaN 与任何值都不相等,包括 NaN 本身。
console.log(NaN == NaN) // false
console.log(NaN/10) // NaN
console.log(0/0) // NaN
Infinity
Infinity 表示无穷大,分为正无穷和负无穷。正数除以 0 返回 Infinity,负数除以 0 返回 -Infinity。
console.log(1/0) // Infinity
console.log(-1/0) // -Infinity
+0/-0
JavaScript 中存在正零(+0)和负零(-0)两个数值,且正零和负零是严格相等的。
console.log(+0 == -0) // true
console.log(+0 === -0) // true
Object
对象是由一组零个或多个属性(properties)组成的无序集合。
每个属性都包含以下内容:
- 一个名称:属性名称可以是 String 值或 Symbol 值(ES6)。
- 一个值:属性值可以是任何数据类型值。
- 一组属性(attributes):每个 properties 具有 0 个或多个特征(attributes)描述属性,这些特征决定了如何使用每个属性。
属性是包含其他数据类型值的容器
var boy = {
// 属性:表示对象的基础数据
name: 'sgl',
age: '25',
// 属性:表示对象具备的功能
loveMe: function() {
console.log('love me very much')
}
}
属性的特征属性
image- ReadOnly: 只读属性。为 true 时,该属性不允许修改,任何执行 JS 代码试图修改该属性值的行为都是无效的。
- DontEnum:不能枚举。为 true 时,该属性不会出现在 for-in 枚举中。
- DontDelete:不能删除。为 true 时,该属性不允许删除,尝试删除属性的操作将会被忽略。
- Internal: 内部属性,在 JS 程序中无法访问,用来实现 JS 语法的内部逻辑。
内部属性
image- [[Prototype]]:指向当前对象的原型
-
[[Class]]:当前对象的类型,调用
Object.prototype.toString
方法,返回的就是内部属性 [[Class]] 的值 - [[Value]]:对象的值
- [[Get]]:当读取属性值时,内部调用的就是该方法,获取指定属性的值。会遍历原型链查找。
- [[Put]]:当设置属性值时,内部调用的就是该方法,设置指定属性的值。首先判断 [[CanPut]] ,如果为 false,则不允许修改。否则执行修改操作,无指定属性时,执行创建属性并赋值操作。
- [[CanPut]]:判断属性是否可以进行 [[Put]] 操作。会判断 ReadOnly 特征属性的值。
- [[HasProperty]]:判断对象是否存在指定属性。会遍历原型链查找
- [[Delete]]:通过 delete 操作符删除对象指定属性,内部调用的就是该方法,删除操作执行前,会获取 DontDelete 特征属性的值,判断是否允许删除。
-
[[DefaultValue]]:获取对象的默认值方法,默认值为一个原始值。算法如下:
String/Date 类型:会首先调用toString
方法,判断是否返回原始值,如果不能返回,再调用valueOf
方法。如果都不能返回原始值,则抛出运行时错误。
Number 与 其他 Object 类型:会首先调用valueOf
方法,判断是否返回原始值,如果不能返回,再调用toString
方法。如果都不能返回原始值,则抛出运行时错误。 - [[Construct]]:指向对象的构造器
- [[Call]]:当调用函数时,内部执行的就是该方法。函数必须具有该内部属性。
- [[HasInstance]]:判断当前对象是否存在指定实例
- [[Scope]]:作用域链
- [[Match]]:测试正则表达式是否匹配并返回MatchResult值
网友评论