本文为【JavaScript 漫游】专栏的第 009 篇文章,对 ES5 规范中 Object
对象的方法进行了总结。
Object
方法Object
构造函数Object
的静态方法,包括 Object.keys
和 Object.getOwnPropertyNames
方法Object
的实例方法,包括 Object.prototype.valueOf
、Object.prototype.toString
、Object.prototype.toLocaleString
和 Object.prototype.hasOwnProperty
方法其中,Object.prototype.toString
方法可以用于判断数据类型,笔者计划在学习到 instanceof
方法后,再对 typeof
、Object.prototype.toString
和 instanceof
方法对数据类型的判断进行统一总结。
Object
方法
Object
本身是一个函数,可以当作工具方法使用,将任意值转为对象。这个方法常用于保证某个值一定是对象。
如果参数为空、undefined
或 null
,Object
方法会返回一个空对象。
var obj = Object();
// 等同于
var obj = Object(undefined);
var obj = Object(null);
obj instanceof Object // true
如果参数是原始类型的值,Object
方法会返回其对应的包装对象的实例。
var obj = Object(1);
obj instanceof Object // true
obj instanceof Number // true
var obj = Object('foo');
obj instanceof Object // true
obj instanceof String // true
var obj = Object(true);
obj instanceof Object // true
obj instanceof Boolean // true
如果参数本来就是对象,那就不会发生转换。
Object
构造函数
Object
不仅可以当作工具函数使用,还可以当作构造函数使用,即前面可以使用 new
命令。
Object
构造函数的首要用途,是直接通过它来生成新对象。
var obj = new Object();
Object
构造函数和 Object
工具函数的用法几乎一模一样。使用时接受一个参数,参数为空、null 或 undefined 时返回一个空对象,参数为原始类型的值时返回其对应的包装对象的实例,参数为对象时直接返回该对象。
但是它们两者的语义是不同的,Object(value)
表示将 value
转成一个对象,new Object(value)
则表示新生成一个对象,它的值是 value
。
Object
的静态方法
Object.keys
方法用于遍历对象自身的属性。
var obj = {
p1: 123,
p2: 456
};
Object.keys(obj) // ["p1", "p2"]
Object.getOwnPropertyNames
方法同样用于遍历对象自身的属性。
var obj = {
p1: 123,
p2: 456
};
Object.getOwnPropertyNames(obj) // ["p1", "p2"]
对于一般的对象来说,Object.keys
方法和 Object.getOwnPropertyNames
返回的结果是一样的。只有涉及不可枚举属性时,才会有不一样的结果。Object.keys
方法只返回可枚举的属性,Object.getOwnPropertyNames
方法还返回不可枚举的属性名。
var a = ['Hello', 'World'];
Object.keys(a) // ["0", "1"]
Object.getOwnPropertyNames(a) // ["0", "1", "length"]
除了这两个方法,Object
还有不少其他静态方法,笔者会在后面进行记录。
Object
的实例方法
Object
实例对象的方法,主要有以下六个。
Object.prototype.valueOf
方法:返回当前对象对应的值Object.prototype.toString
方法:返回当前对象对应的字符串形式Object.prototype.toLocaleString
方法:返回当前对象对应的本地字符串形式Object.prototype.hasOwnProperty
方法:判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性Object.prototye.isPrototypeOf
方法:判断当前对象是否为另一个对象的原型Object.prototype.propertyIsEnumerable
方法:判断某个属性是否可枚举valueOf
方法返回对象的值,默认是返回对象本身。它可以被重写,重写的 valueOf
方法会覆盖 Object.prototype.valueOf
方法。
var obj = new Object();
obj.valueOf = function () {
return 2;
};
1 + obj // 3
toString
方法返回对象的字符串形式,默认返回类型字符串。它同样可以被重写,像 Array
、Date
等对象都有重写 toString
方法。
var o1 = new Object();
o1.toString() // "[object Object]"
var o2 = {a:1};
o2.toString() // "[object Object]"
var obj = new Object();
obj.toString = function () {
return 'hello';
};
obj + ' ' + 'world' // "hello world"
[1, 2, 3].toString() // "1,2,3"
'123'.toString() // "123"
(function () {
return 123;
}).toString()
// "function () {
// return 123;
// }"
(new Date()).toString()
// 'Sat Feb 03 2024 14:31:39 GMT+0800 (中国标准时间)'
toLocaleString
方法与 toString
的返回结果相同,也是返回一个值的字符串形式。这个方法的主要作用是流出一个接口,让各种不同的对象实现自己版本的 toLocalString
,用来返回针对某些地域的特定的值。
var person = {
toString: function () {
return 'Henry Norman Bethune';
},
toLocaleString: function () {
return '白求恩';
}
};
person.toString() // Henry Norman Bethune
person.toLocaleString() // 白求恩
hasOwnProperty
方法接受一个字符串作为参数,返回一个布尔值,表示该实例对象自身是否具有该属性。
var obj = {
p: 123
};
obj.hasOwnProperty('p') // true
obj.hasOwnProperty('toString') // false