对象类型-Object
可以通过new Object(), Object.create()方法,或者使用字面量标记(初始化标记)初始化对象。 一个对象初始化器,由花括号/大括号 ({}) 包含的一个由零个或多个对象属性名和其关联值组成的一个逗号分隔的列表构成。
- 语法
- 以构造函数形式来调用:new Object([value])
- 对象初始化器(Object.create())
- 对象字面量(literal)
- { [ nameValuePair1[, nameValuePair2[, …nameValuePairN] ] ] }
- 参数
- nameValuePair1, nameValuePair2, … nameValuePairN:成对的名称(字符串)与值(任何值),其中名称通过冒号与值分隔。
- value:任何值。
- 描述
- 在JavaScript中,几乎所有的对象都是Object类型的实例,它们都会从Object.prototype继承属性和方法
- Object 构造函数为给定值创建一个对象包装器,会根据给定的参数创建对象,具体有以下情况:
- 如果给定值是 null 或 undefined,将会创建并返回一个空对象
- 如果传进去的是一个基本类型的值,则会构造其包装类型的对象
- 如果传进去的是引用类型的值,仍然会返回这个值,经他们复制的变量保有和源对象相同的引用地址
- 当以非构造函数形式被调用时,Object 的行为等同于 new Object()。
对象的操作:增删改查
JS对象中属性名是不允许重复的,是唯一的
- 获取属性名对应的属性值
- 对象.属性名
- 对象[“属性名”]:属性名是字符串或者是数字格式的(字符串格式不带引号就变成了变量了)
- 如果当前属性名不存在,默认的属性值是 undefined
- 如果属性名数字格式,只能用对象[属性名]形式获取对应的属性值,不能使用点(.)的方式
- 设置/修改属性名属性值
- 对象.属性名 = 属性值
- 对象[‘属性名’] = 属性值
- 属性名不能重复,如果属性名不存在则是设置(新增)属性名属性;如果属性名已经存在则不属于设置属性名属性值,而是修改属性值。
- 删除属性
- 真删除:把属性彻底删除 => delete 对象.属性名
- 假删除:属性还在,值为空 =>对象.属性名 = null/undefined
练习题
let person={
name="张三",
age:30,
height:"185CM",
weight:"80KG",
1:100
};
// 获取属性名对应的属性值
console.log(person.name);//=>"张三"
console.log(person["age"]);//=>"30"
console.log(person.sex);//=>undefined
console.log(person[1]);//=>100
console.log(person.1);//=>SyntaxError:语法错误
//设置属性名属性值
person.GF = "韩梅梅";
person.name="李雷"
console.log(person.GF); //"韩梅梅"
console.log(person.name); //"李雷"
//删除属性
// =>真删除
delete person[1]
// =>假删除
person.name = null;
var o = new Object();
var o = new Object(undefined);
var o = new Object(null);
var o = new Object(true);// 等价于 o = new Boolean(true);
var o = new Object(Boolean());// 等价于 o = new Boolean(false);
Object 构造函数的常用方法
Object 构造函数的方法只能通过Object.xxx()调用。和对象的实例没有直接的关系,(Object.prototype === 实例.__proto__)
Object.assign: 将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。(合并对象到目标对象)
- Object.assign(target, …sources)
- target:目标对象。
- sources:源对象。
- 返回值:目标对象。
- 描述:
- 如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖
- 使用源对象的[[Get]]和目标对象的[[Set]]
- 只会拷贝源对象自身的可枚举的属性到目标对象
- String类型和 Symbol 类型的属性都会被拷贝
- 不会在那些source对象值为 null 或 undefined 的时候抛出错误
- 继承属性和不可枚举属性是不能拷贝的
- 原始类型会被包装为对象
Object.create:创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。
- Object.create(proto,[propertiesObject])
- proto:新创建对象的原型对象
- propertiesObject:可选。需要传入一个对象,该对象的属性类型参照Object.defineProperties()的第二个参数。
- 如果该参数被指定且不为 undefined,该传入对象的自有可枚举属性将为新创建的对象添加指定的属性值和对应的属性描述符
- 返回值:一个新对象,带着指定的原型对象和属性
Object.defineProperty:在对象上定义一个新属性,或者修改对象的现有属性,并返回此对象
- Object.defineProperty(obj, prop, descriptor)
- obj:要定义属性的对象。
- prop:要定义或修改的属性的名称或 Symbol 。
- descriptor:要定义或修改的属性描述符。
- 返回值:被传递给函数的对象。
- 描述:
- 该方法允许精确地添加或修改对象的属性
- 通过赋值操作添加的普通属性是可枚举的
- 默认情况下,使用 Object.defineProperty() 添加的属性值是不可修改(immutable)的
- 对象里目前存在的属性描述符有两种主要形式
- 数据描述符:数据描述符是一个具有值的属性,该值可以是可写的,也可以是不可写的
- 存取描述符:存取描述符是由 getter 函数和 setter 函数所描述的属性
- 一个描述符只能是这两者其中之一;不能同时是两者,它们共享以下可选键值:
- configurable:当且仅当值为 true 时,属性的描述符才能够被改变,同时也能从对象上被删除。默认为 false。
- enumerable:当且仅当值为 true 时,该属性才会出现在对象的枚举属性中。默认为 false。
- 数据描述符还具有以下可选键值:
- value:该属性值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。
- writable:当且仅当值为 true 时,value才能被赋值运算符改变。
- 存取描述符还具有以下可选键值:
- get:属性的 getter 函数,如果没有 getter,默认为 undefined。
- 当访问该属性时,会调用此函数
- 执行时不传入任何参数,但是会传入 this 对象
- 该函数的返回值会被用作属性的值
- set:属性的 setter 函数,如果没有 setter,默认为 undefined。
- 属性值被修改时,会调用此函数
- 该方法接受一个参数(也就是被赋予的新值),会传入赋值时的 this 对象。
- get:属性的 getter 函数,如果没有 getter,默认为 undefined。
- 描述符可拥有的键值
- 拥有布尔值的键 configurable、enumerable 和 writable 的默认值都是 false。
- 属性值和函数的键 value、get 和 set 字段的默认值为 undefined。
var o = {};
Object.defineProperty(o, 'a', {
get() { return 1; },
configurable: false
});
Object.is:比较两个值是否相同。
所有 NaN 值都相等(这与==
和===
不同)。
- Object.is(value1, value2);
- value1:被比较的第一个值。
- value2:被比较的第二个值。
- 返回值:一个 Boolean 类型标示两个参数是否是同一个值。
- 描述:
- Object.is() 方法判断两个值是否为同一个值。如果满足以下条件则两个值相等:
- 都是 undefined / null / true / false
- 都是相同长度的字符串且相同字符按相同顺序排列
- 都是相同对象(意味着每个对象有同一个引用)
- 都是数字且 都是 +0 / -0 / NaN
- 或都是非零而且非 NaN 且为同一个值
- 与
==
运算不同。==
运算符在判断相等前对两边的变量(如果它们不是同一类型) 进行强制转换 (这种行为的结果会将 “”==
false 判断为 true), 而 Object.is不会强制转换两边的值。 - 与
===
运算也不相同。===
运算符 (也包括==
运算符) 将数字 -0 和 +0 视为相等 ,而将Number.NaN 与NaN视为不相等.
- Object.is() 方法判断两个值是否为同一个值。如果满足以下条件则两个值相等:
Object.is(Number.NaN, Number.NaN);// true
if (!Object.is) {
Object.is = function(x, y) {
if (x === y) {
return x !== 0 || 1 / x === 1 / y;
} else {
return x !== x && y !== y;
}
};
}
Object.keys:返回一个数组,包含对象可枚举属性名。
- Object.keys(obj)
- obj:要返回其枚举自身属性的对象。
- 返回值:一个表示给定对象的所有可枚举属性的字符串数组。
// simple array
var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']
// array like object
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']
Object.values:返回对象可枚举值的数组。
- Object.values(obj)
- obj:被返回可枚举属性值的对象。
- 返回值:一个包含对象自身的所有可枚举属性值的数组。
var obj = { foo: 'bar', baz: 42 };
console.log(Object.values(obj)); // ['bar', 42]
Object.getOwnPropertySymbols:返回一个数组,包含对象所有的Symbol属性。
- Object.getOwnPropertySymbols(obj)
- obj : 要返回 Symbol 属性的对象。
- 返回值:在给定对象自身上找到的所有 Symbol 属性的数组。
var obj = {};
var a = Symbol("a");
var b = Symbol.for("b");
obj[a] = "localSymbol";
obj[b] = "globalSymbol";
var objectSymbols = Object.getOwnPropertySymbols(obj);
console.log(objectSymbols.length); // 2
console.log(objectSymbols) // [Symbol(a), Symbol(b)]
console.log(objectSymbols[0]) // Symbol(a)
Object 实例和 Object 原型对象(Object.prototype)的方法
hasOwnProperty:返回一个布尔值 ,表示属性是否是对象的私有属性
- obj.hasOwnProperty(prop)
- prop:要检测的属性的 String 字符串形式表示的名称,或者 Symbol。
- 返回值:用来判断某个对象是否含有指定的属性的布尔值 Boolean。
- 描述:
- 所有继承了 Object 的对象都会继承到 hasOwnProperty 方法
- 这个方法可以用来检测一个对象是否含有特定的自身属性
- 和 in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性。
- 即使属性的值是 null 或 undefined,只要属性存在,hasOwnProperty 依旧会返回 true。
o = new Object();
o.prop = 'exists';
o.hasOwnProperty('prop'); // 返回 true
o.hasOwnProperty('toString'); // 返回 false
o.hasOwnProperty('hasOwnProperty'); // 返回 false
toString / toString:返回对象的字符串表示。
返回对象的字符串表示。
- obj.toString()
- 返回值:一个表示该对象的字符串。
valueOf:返回指定对象的原始值。
- object.valueOf()
- 返回值:返回值为该对象的原始值
本文只总结了常用的方法,想要了解更过的对象和实例的方法,查询 MDN-Object