JavaScript 的所有其他对象都继承自Object
对象,即那些对象都是Object
的实例。
Object
对象的原生方法分成两类:Object
本身的方法:直接定义在Object对象的方法Object
的实例方法:定义在Object原型对象Object.prototype上的方法Object
本身是一个函数,可以当作工具方法使用,将任意值转为对象。Object
构造函数的首要用途,是直接通过它来生成新对象。 虽然用法相似,但是Object(value)
与new Object(value)
两者的语义是不同的,Object(value)
表示将value
转成一个对象,new Object(value)
则表示新生成一个对象,它的值是value
。
Object.keys
方法(只返回可枚举的属性,更常用)和Object.getOwnPropertyNames
方法都用来遍历对象的属性。Object.prototype.valueOf()
:返回当前对象对应的值。JavaScript 自动类型转换时会默认调用这个方法,可以用自定义的obj.valueOf覆盖Object.prototype.valueOfObject.prototype.toString()
:返回当前对象对应的字符串形式。数组、字符串、函数、Date 对象都分别部署了自定义的toString
方法,覆盖了Object.prototype.toString
方法。Object.prototype.toLocaleString()
:返回当前对象对应的本地字符串形式。Object.prototype.hasOwnProperty()
:判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性。Object.prototype.isPrototypeOf()
:判断当前对象是否为另一个对象的原型。Object.prototype.propertyIsEnumerable()
:判断某个属性是否可枚举。JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等等。
{
value: undefined,
writable: true,
enumerable: true, //是否可遍历
configurable: true, //是否可配置
get: undefined,
set: undefined
}
一旦定义了取值函数get
(或存值函数set
),就不能将writable
属性设为true
,或者同时定义value
属性,否则会报错。
Object.getOwnPropertyDescriptor() | - 获取属性描述对象。- 第一个参数是目标对象,第二个参数是一个字符串,对应目标对象的某个属性名。- 只能用于对象自身的属性,不能用于继承的属性。 |
---|---|
Object.getOwnPropertyNames() | 返回一个数组,成员是参数对象自身的全部属性的属性名,不管该属性是否可遍历。 |
Object.defineProperty(),Object.defineProperties() | - 通过属性描述对象,定义或修改一个属性,然后返回修改后的对象 |
属性描述对象的各个属性称为“元属性”。
value | - 目标属性的值- 只要writable和configurable有一个为true,就允许改动value |
---|---|
writable | - 布尔值,决定了目标属性的值是否可以被改变- 如果原型对象的某个属性的writable为false,那么子对象将无法自定义这个属性。【除非覆盖属性描述对象忽视原型链】 |
enumerable | - 表示目标属性是否可遍历 |
configurable | - 决定了是否可以修改属性描述对象 |
有时需要冻结对象的读写状态,防止对象被改变。JavaScript 提供了三种冻结方法,最弱的一种是Object.preventExtensions
,其次是Object.seal
,最强的是Object.freeze
Object.preventExtensions() | 使得一个对象无法再添加新的属性 |
---|---|
Object.isExtensible() | 检查是否可以为一个对象添加属性 |
Object.seal() | - 使得一个对象既无法添加新属性,也无法删除旧属性- 实质是把属性描述对象的configurable属性设为false |
Object.isSealed() | 检查一个对象是否使用了Object.seal方法 |
Object.freeze() | 使得一个对象无法添加新属性、无法删除旧属性、也无法改变属性的值,使得这个对象实际上变成了常量 |
Object.isFrozen() | 检查一个对象是否使用了Object.freeze方法 |
BUG:可以通过改变原型对象,来为对象增加属性;
如果属性值是对象,上面这些方法只能冻结属性指向的对象,而不能冻结对象本身的内容
Array
是 JavaScript 的原生对象,同时也是一个构造函数,可以用它生成新的数组。
valueOf(),toString() | - valueOf方法是一个所有对象都拥有的方法,表示对该对象求值- toString方法也是对象的通用方法,数组的toString方法返回数组的字符串形式。 |
---|---|
push(),pop() | 增加or删除数组最后一个元素,会改变原数组 |
shift(),unshift() | 增加or删除数组第一个元素,会改变原数组 |
concat() | 用于多个数组的合并。它将新数组的成员,添加到原数组成员的后部,然后返回一个新数组,原数组不变。 |
reverse() | 颠倒排列数组元素,返回改变后的的数组 |
slice() | 提取目标数组的一部分,返回一个新数组,原数组不变。 |
splice() | 删除原数组的一部分成员,并可以在删除的位置添加新的数组成员,返回值是被删除的元素。 |
sort() | 默认按字典顺序对数组成员排序,arr.sort([compareFunction])用来指定按某种顺序进行排列的函数。 |
map() | 将数组的所有成员依次传入参数函数,把每一次的执行结果组成一个新数组返回 |
forEach() | 同map相似,但不返回值,只操作数据 |
filter() | 过滤数组成员,满足条件的成员组成一个新数组返回。 |
reduce(),reduceRight() | 依次处理数组的每个成员,最终累计为一个值 |
indexOf(),lastIndexOf() | 返回给定元素在数组中第一次/最后一次出现的位置 |
所谓“包装对象”,指的是与数值、字符串、布尔值分别相对应的Number
、String
、Boolean
三个原生对象。这三个原生对象可以把原始类型的值变成(包装成)对象。
作为构造函数,它主要用于生成布尔值的包装对象实例。
if (new Boolean(false)) {
//所有对象对应的布尔值都是true
console.log('true');
} // true
if (new Boolean(false).valueOf()) {
//返回实例对应的初始值
console.log('true');
} // 无输出
Boolean
对象除了可以作为构造函数,还可以单独使用,将任意值转为布尔值。这时Boolean
就是一个单纯的工具方法。
Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false
Boolean('') // false
Boolean(NaN) // false
Boolean(1) // true
Boolean('false') // true
Boolean([]) // true
Boolean({
}) // true
Boolean(function () {
}) // true
Boolean(/foo/)