1、Object.keys()用来遍历对象的属性
var obj = {
key1: 1,
key2: 2,
}
Object.keys(obj) // ['key1', 'key2']
2、delete命令
删除对象属性,删除成功后返回true
var obj = { p: 1 };
delete obj.p // true
obj.p // undefined
Object.keys(obj) // []
删除一个不存在的属性,不会报错,而且会返回true
var obj = {}
delete obj.p // true
只有一种情况返回false,就是对象属性存在且不得删除
var obj = Object.defineProperty({}, 'p', {
value: 1,
configurable: false
});
delete obj.p // false
delete只能删除对象本身的属性,无法删除继承的属性
var obj = {}
delete obj.toString // true
obj.toString // function toString() { [native code] }
3、in运算符
in运算符用于检查对象是否包含某个属性,如果包含返回true,否则返回false
in运算符不能识别哪些是自身属性,哪些是继承的属性
可以使用对象的hasOwnProperty方法判断是否是对象自身的属性
var obj = { p: 1 };
'p' in obj //true
'toString' in obj // true
4、for...in遍历
for...in用来遍历对象的全部属性,它有两个注意点
(1).它遍历的属性是所有可遍历的属性,会跳过不可遍历的属性
(2).它不仅遍历对象自身的属性,还遍历继承的属性
var obj = { a: 1, b: 2, c: 3 };
for (var i in obj) {
console.log(i); // a b c
}
只想遍历对象自身的属性时,可结合hasOwnProperty方法
var obj = { name: 'zhangsan' };
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key) // name
}
}
5、Object.prototype.valueOf()方法,该方法默认返回对象本身
var obj = { a: 1 };
obj.valueOf() // { a: 1 }
obj.vlaueOf() === obj // true
6、Object.prototype.toString()方法,默认情况下返回类型字符串
var obj = {};
obj.toString() // "[object Object]"
数组、字符串、函数、Date 对象都分别部署了自定义的toString方法,覆盖了Object.prototype.toString方法。
[1, 2, 3].toString() // "1,2,3"
var f = function () {}
f.toString() // "function () {}"
(new Date()).toString() // "Mon May 24 2021 16:24:41 GMT+0800 (中国标准时间)"
Object.prototype.toString.call(value)可精准判断一个值是什么类型
数值:返回[object Number]
字符串:返回[object String]
布尔值:返回[object Boolean]
undefined:返回[object Undefined]
null:返回[object Null]
数组:返回[object Array]
arguments 对象:返回[object Arguments]
函数:返回[object Function]
Error 对象:返回[object Error]
Date 对象:返回[object Date]
RegExp 对象:返回[object RegExp]
其他对象:返回[object Object]
Object.prototype.toString.call(2) // "[object Number]"
Object.prototype.toString.call('') // "[object String]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(Math) // "[object Math]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call([]) // "[object Array]"
利用这个特性,可以写出一个比typeof运算符更准确的类型判断函数
var type = function (obj) {
var t = Object.prototype.toString.call(obj);
return t.match(/\[object (.*?)\]/)[1].toLowerCase();
}
type({}); // "object"
type([]); // "array"
type(5); // "number"
type(null); // "null"
type(); // "undefined"
type(/abcd/); // "regexp"
type(new Date()); // "date"
7、Object.prototype.hasOwnProperty()方法接受一个字符串作为参数,返回一个布尔值,表示该实例对象自身是否具有该属性。
var obj = { p: 1 }
obj.hasOwnProperty('p') // true
obj.hasOwnProperty('toString') // false
8、属性描述对象
{
// value是该属性的属性值,默认为undefined
value: 123,
// writable是一个布尔值,表示属性值value是否可改变,默认为true
writable: true,
// enumerable是一个布尔值,表示该属性是否可遍历,默认为true
enumerable: true,
// configurable是一个布尔值,表示可配置性,默认为true
configurable: true,
// get是一个函数,表示该属性的取值函数(getter),默认为undefined
get: undefined,
// set是一个函数,表示该属性的存值函数(setter),默认为undefined
set: undefined
}
9、Object.getOwnPropertyDescriptor()方法可以获取属性描述对象。它的第一个参数是目标对象,第二个参数是一个字符串,对应目标对象的某个属性名。
let obj = { p: 'a' };
Object.getOwnPropertyDescriptor(obj, 'p')
// Object { value: "a",
// writable: true,
// enumerable: true,
// configurable: true
// }
Object.getOwnPropertyDescriptor()方法只能用于对象自身的属性,不能用于继承的属性
let obj = { p: 'a' };
Object.getOwnPropertyDescriptor(obj, 'toString') // undefined
10、Object.defineProperty()方法允许通过属性描述对象,定义或修改一个属性,然后返回修改后的对象
// 用法
Object.defineProperty(object, propertyName, attributesObject)
Object.defineProperty接受三个参数,如下:
object 属性所在对象
propertyName 字符串,表示属性名
attributesObject 属性描述对象
let obj = Object.defineProperty({}, 'p', {
value: 123,
writable: false,
enumerable: true,
configurable: true
})
obj.p // 123
obj.p = 456;
obj.p // 123
11、存取器:存值函数称为setter,使用属性描述对象的set属性;取值函数称为getter,使用属性描述对象的get属性。
let obj = {
get p() {
return 'getter';
},
set p(value) {
console.log('setter:' + value)
}
}
obj.p // 'getter'
obj.p = 123 // setter:123
// 取值函数get不能接受参数,存值函数set只能接受一个参数(即属性的值)