- ES6 教程
- ES6 - 首页
- ES6 - 概述
- ES6 - 环境
- ES6 - 语法
- ES6 - 变量
- ES6 - 运算符
- ES6 - 决策
- ES6 - 循环
- ES6 - 函数
- ES6 - 事件
- ES6 - Cookie
- ES6 - 页面重定向
- ES6 - 对话框
- ES6 - void关键字
- ES6 - 页面打印
- ES6 - 对象
- ES6 - 数字
- ES6 - 布尔值
- ES6 - 字符串
- ES6 - Symbol
- ES6 - 新的字符串方法
- ES6 - 数组
- ES6 - 日期
- ES6 - 数学
- ES6 - 正则表达式
- ES6 - HTML DOM
- ES6 - 迭代器
- ES6 - 集合
- ES6 - 类
- ES6 - Map和Set
- ES6 - Promise
- ES6 - 模块
- ES6 - 错误处理
- ES6 - 对象扩展
- ES6 - Reflect API
- ES6 - Proxy API
- ES6 - 验证
- ES6 - 动画
- ES6 - 多媒体
- ES6 - 调试
- ES6 - 图片地图
- ES6 - 浏览器
- ES7 - 新特性
- ES8 - 新特性
- ES9 - 新特性
- ES6 有用资源
- ES6 - 快速指南
- ES6 - 有用资源
- ES6 - 讨论
ES6 - 对象
JavaScript 支持扩展数据类型。JavaScript 对象是定义自定义数据类型的好方法。
一个对象是一个实例,包含一组键值对。与原始数据类型不同,对象可以表示多个或复杂的值,并且可以在其生命周期内发生变化。这些值可以是标量值、函数,甚至是其他对象的数组。
下面将进一步讨论定义对象的语法变体。
对象初始化器
与原始类型一样,对象也有字面量语法:花括号({})。以下是定义对象的语法。
var identifier = { Key1:value, Key2: function () { //functions }, Key3: [“content1”,” content2”] }
对象的內容称为属性(或成员),属性由名称(或键)和值组成。属性名称必须是字符串或符号,值可以是任何类型(包括其他对象)。
与所有 JavaScript 变量一样,对象名称(可以是普通变量)和属性名称都区分大小写。您可以使用简单的点表示法访问对象的属性。
以下是访问对象属性的语法。
objectName.propertyName
示例:对象初始化器
var person = { firstname:"Tom", lastname:"Hanks", func:function(){return "Hello!!"}, }; //access the object values console.log(person.firstname) console.log(person.lastname) console.log(person.func())
上面的示例定义了一个对象 person。该对象具有三个属性。第三个属性指的是一个函数。
在成功执行上述代码后,将显示以下输出。
Tom Hanks Hello!!
在 ES6 中,如果要赋值的属性值与属性名称匹配,可以省略属性值。
示例
var foo = 'bar' var baz = { foo } console.log(baz.foo)
上面的代码片段定义了一个对象baz。该对象具有一个属性foo。此处省略了属性值,因为 ES6 会隐式地将变量 foo 的值赋给对象的键 foo。
以下是上述代码的 ES5 等效代码。
var foo = 'bar' var baz = { foo:foo } console.log(baz.foo)
在成功执行上述代码后,将显示以下输出。
bar
使用这种简写语法,JS 引擎会在包含的作用域中查找具有相同名称的变量。如果找到,则将该变量的值赋给属性。如果未找到,则会抛出 ReferenceError。
Object() 构造函数
JavaScript 提供了一个名为Object()的特殊构造函数来构建对象。new 运算符用于创建对象的实例。要创建对象,new 运算符后跟构造方法。
以下是定义对象的语法。
var obj_name = new Object(); obj_name.property = value; OR obj_name["key"] = value
以下是访问属性的语法。
Object_name.property_key OR Object_name["property_key"]
示例
var myCar = new Object(); myCar.make = "Ford"; //define an object myCar.model = "Mustang"; myCar.year = 1987; console.log(myCar["make"]) //access the object property console.log(myCar["model"]) console.log(myCar["year"])
在成功执行上述代码后,将显示以下输出。
Ford Mustang 1987
对象的未赋值属性为 undefined。
示例
var myCar = new Object(); myCar.make = "Ford"; console.log(myCar["model"])
在成功执行上述代码后,将显示以下输出。
undefined
注意 - 对象属性名称可以是任何有效的 JavaScript 字符串,或任何可以转换为字符串的内容,包括空字符串。但是,任何不是有效 JavaScript 标识符的属性名称(例如,具有空格或连字符,或以数字开头的属性名称)只能使用方括号表示法访问。
也可以使用存储在变量中的字符串值来访问属性。换句话说,对象的属性键可以是动态值。例如:一个变量。以下示例说明了这个概念。
示例
var myCar = new Object() var propertyName = "make"; myCar[propertyName] = "Ford"; console.log(myCar.make)
在成功执行上述代码后,将显示以下输出。
Ford
构造函数
可以使用以下两个步骤创建一个对象:
步骤 1 - 通过编写构造函数来定义对象类型。
以下是相同的语法。
function function_name() { this.property_name = value }
'this'关键字指的是当前正在使用的对象,并定义对象的属性。
步骤 2 - 使用 new 语法创建对象的实例。
var Object_name= new function_name() //Access the property value Object_name.property_name
new 关键字调用函数构造函数并初始化函数的属性键。
示例 - 使用函数构造函数
function Car() { this.make = "Ford" this.model = "F123" } var obj = new Car() console.log(obj.make) console.log(obj.model)
上面的示例使用函数构造函数来定义一个对象。
在成功执行上述代码后,将显示以下输出。
Ford F123
始终可以向先前定义的对象添加新属性。例如,考虑以下代码片段:
function Car() { this.make = "Ford" } var obj = new Car() obj.model = "F123" console.log(obj.make) console.log(obj.model)
在成功执行上述代码后,将显示以下输出。
Ford F123
Object.create 方法
也可以使用Object.create()方法创建对象。它允许您创建所需对象的原型,而无需定义构造函数。
示例
var roles = { type: "Admin", // Default value of properties displayType : function() { // Method which will display type of role console.log(this.type); } } // Create new role type called super_role var super_role = Object.create(roles); super_role.displayType(); // Output:Admin // Create new role type called Guest var guest_role = Object.create(roles); guest_role.type = "Guest"; guest_role.displayType(); // Output:Guest
上面的示例定义了一个对象 -roles 并为属性设置默认值。创建了两个新实例,它们覆盖了对象的默认属性值。
在成功执行上述代码后,将显示以下输出。
Admin Guest
Object.assign() 函数
Object.assign()方法用于将一个或多个源对象的所有可枚举自身属性的值复制到目标对象。它将返回目标对象。
以下是相同的语法。
Object.assign(target, ...sources)
示例 - 克隆对象
"use strict" var det = { name:"Tom", ID:"E1001" }; var copy = Object.assign({}, det); console.log(copy); for (let val in copy) { console.log(copy[val]) }
在成功执行上述代码后,将显示以下输出。
Tom E1001
示例 - 合并对象
var o1 = { a: 10 }; var o2 = { b: 20 }; var o3 = { c: 30 }; var obj = Object.assign(o1, o2, o3); console.log(obj); console.log(o1);
在成功执行上述代码后,将显示以下输出。
{ a: 10, b: 20, c: 30 } { a: 10, b: 20, c: 30 }
注意 - 与复制对象不同,当对象合并时,较大的对象不会维护属性的新副本。相反,它持有原始对象中包含的属性的引用。以下示例解释了这个概念。
var o1 = { a: 10 }; var obj = Object.assign(o1); obj.a++ console.log("Value of 'a' in the Merged object after increment ") console.log(obj.a); console.log("value of 'a' in the Original Object after increment ") console.log(o1.a);
在成功执行上述代码后,将显示以下输出。
Value of 'a' in the Merged object after increment 11 value of 'a' in the Original Object after increment 11
删除属性
您可以使用 delete 运算符删除属性。以下代码显示了如何删除属性。
示例
// Creates a new object, myobj, with two properties, a and b. var myobj = new Object; myobj.a = 5; myobj.b = 12; // Removes the ‘a’ property delete myobj.a; console.log ("a" in myobj) // yields "false"
在成功执行上述代码后,将显示以下输出。
false
代码片段从对象中删除了属性。该示例打印 false,因为 in 运算符在对象中找不到该属性。
比较对象
在 JavaScript 中,对象是引用类型。两个不同的对象永远不相等,即使它们具有相同的属性。这是因为它们指向完全不同的内存地址。只有共享公共引用的那些对象在比较时才会返回 true。
示例 1 - 不同的对象引用
var val1 = {name: "Tom"}; var val2 = {name: "Tom"}; console.log(val1 == val2) // return false console.log(val1 === val2) // return false
在上面的示例中,val1 和 val2 是两个不同的对象,它们指向两个不同的内存地址。因此,在比较相等性时,运算符将返回 false。
示例 2 - 单个对象引用
var val1 = {name: "Tom"}; var val2 = val1 console.log(val1 == val2) // return true console.log(val1 === val2) // return true
在上面的示例中,val1 的内容被赋值给 val2,即 val1 中属性的引用与 val2 共享。由于对象现在共享对属性的引用,因此对于指向两个不同内存地址的两个不同的对象,相等运算符将返回 true。因此,在比较相等性时,运算符将返回 false。
对象解构
术语解构指的是分解实体的结构。JavaScript 中的解构赋值语法使从数组或对象中提取数据到不同的变量成为可能。以下示例说明了这一点。
示例 1
解构对象时,变量名和对象属性名必须匹配。
<script> let student = { rollno:20, name:'Prijin', cgpa:7.2 } //destructuring to same property name let {name,cgpa} = student console.log(name) console.log(cgpa) //destructuring to different name let {name:student_name,cgpa:student_cgpa}=student console.log(student_cgpa) console.log("student_name",student_name) </script>
上述代码的输出将如下所示:
Prijin 7.2 7.2 student_name Prijin
示例 2
如果变量和赋值在两个不同的步骤中,那么解构对象语法将用()括起来,如示例({rollno} = student)所示:
<script> let student = { rollno:20, name:'Prijin', cgpa:7.2 } // destructuring to already declared variable let rollno; ({rollno} = student) console.log(rollno) // assign default values to variables let product ={ id:1001,price:2000} //discount is not product property let {id,price,discount=.10} = product console.log(id) console.log(price) console.log(discount) </script>
上述代码的输出将如下所示:
20 1001 2000 0.1
示例 3
以下示例显示了使用rest 运算符进行解构以及如何解构嵌套对象。
<script> // rest operator with object destructuring let customers= { c1:101, c2:102, c3:103 } let {c1,...others} = customers console.log(c1) console.log(others) //nested objects let emp = { id:101, address:{ city:'Mumbai', pin:1234 } } let {address} = emp; console.log(address) let {address:{city,pin}} = emp console.log(city) </script>
上述代码的输出将如下所示:
101 {c2: 102, c3: 103} {city: "Mumbai", pin: 1234} Mumbai