对象可以通过两种形式定义:声明形式和构造形式。

对象的文字形式大概是这样:
var myObj = {key: value// ...
};构造形式大概是这样:
var myObj = new Object();
myObj.key = value;

构造形式和文字形式生成的对象是一样的。唯一的区别是,在文字声明中你可以添加多个键/值对,但是在构造形式中你必须逐个添加属性。

3.1 类型

对象是JavaScript基础。在JavaScript中一共有六种主要类型:

  • string
  • number
  • boolean
  • null
  • undefined
  • object

注意,简单基本类型(string,boolean,number,null和undefined)本身并不是对象。

有一种常见的错误说法是“JavaScript中万物皆是对象”,这显然是错误的。

内置对象

JavaScript中还有一些对象子类型,通常被称为内置对象。

  • String
  • Number
  • Boolean
  • Object
  • Function
  • Array
  • Date
  • RegExp
  • Error

这些内置对象从表现形式来说很像其他语言中的类型或者类,比如Java中的String类。

但是在JavaScript中,它们实际上只是一些内置函数。这些内置函数可以当作构造函数来使用,从而可以构造一个对应子类型的新对象。

原始值"I am a string"并不是一个对象,它只是一个字面量,并且是一个不可变的值。如果想要在这个字面量上执行一些操作,比如获取长度,访问其中某个字符等,那需要将其转换为String对象。

幸好,在必要时语言会自动把字符串字面量转换成一个String对象,也就是说你并不需要显式创建一个对象。

思考下面的代码:var strPrimitive = 'I am a string';
console.log(strPrimitive.length);
console.log(strPrimitive.charAt(3));

使用以上两种方法,我们都可以直接在字符串字面量上访问属性或者方法,之所以可以这样做,是因为引擎自动把字面量转换成String对象,所以可以访问属性和方法。

同样的事也会发生在数值字面量上,如果使用类似43.359.toFixed(2)的方法, 引擎会把42转换成new Number(42)。对于布尔变量同样如此。

3.2 内容

当我们说到“内容”时,似乎在暗示这些值实际上被存储在对象内部,但是这只是它的表现形式。在引擎内部,这些值的存储方式是多种多样的,一般并不会存在对象容器内部。存储在对象容器内部是这些属性的名称,它们就像指针一样,指向这些值真正的存储位置。

3.2.1 可计算属性名

ES6增加了可计算属性名,可以在文字形式中使用[]包裹一个表达式来当作属性名:

var prefix = "foo";var myObj = {[prefix + "bar"]: "hello",[prefix + "baz"]: "world"
};myObj["foobar"]; //hello
myObj["foobaz"]; //world

3.2.2 属性描述符

在ES5之前,JavaScript语言本身并没有提供可以直接检测属性特征的方法,比如判断属性是否是可读。

但是从ES5开始,所有的属性都具备了属性描述符。

思考下面的代码:var myObj = {a: 2
};Object.getOwnPropertyDescriptor(myObj, "a");// {
//  value: 2,
//  writable: true,
//  enumerable: true,
//  configurable: true
// }

在创建普通属性时属性描述符会使用默认值,我们也可以使用Object.defineProperty(...)来添加一个新属性或者修改一个已有属性并对特性进行配置。

举例来说:

var myObj = {};Object.defineProperty(myObj, "a", {value: 2,writable: true,configurable: true,enumerable: true
});

【JavaScript 上卷】对象相关推荐

  1. 你不知道的javascript上卷

    你不知道的javascript上卷 作用域 javascript是一门编译语言,它不是提前编译的,编译结果也不能在分布式系统中移植.编译的步骤一般如下: 分词/词法分析 词法分析是有状态的判断一个分词 ...

  2. JavaScript 复制对象与Object.assign方法无法实现深复制

    在JavaScript这门语言中,数据类型分为两大类:基本数据类型和复杂数据类型.基本数据类型包括Number.Boolean.String.Null.String.Symbol(ES6 新增),而复 ...

  3. javascript 遍历对象

    javascript 遍历对象 <!DOCTYPE html> <html lang="en"><head><meta charset=& ...

  4. javascript定义对象写法(个人整理)

    javascript定义对象的几种简单方法 1.构造函数方式,全部属性及对象的方法都放在构造方法里面定义 优点:动态的传递参数 缺点:每创建一个对象就会创建相同的方法函数对象,占用大量内存 funct ...

  5. javascript笔记:深入分析javascript里对象的创建(上)续篇

    今天回来一看我的博客居然有这么多人推荐真是开心极了,看来大家对我的研究有了认可,写博客的动力越来越大了,而且我发现写javascript在博客园里比较受欢迎,写java的受众似乎少多了,可能博客园里j ...

  6. JavaScript Date 对象

    JavaScript Date 对象 JavaScript Date 对象 http://www.w3school.com.cn/jsref/jsref_obj_date.asp 日期处理 Date ...

  7. JavaScript Object对象

    原文:JavaScript Object对象 Object对象 1. 介绍 Object对象,是所有JavaScript对象的超类(基类).Object.prototype(Obecjt的原型)定义了 ...

  8. JavaScript 自定义对象

    原文:JavaScript 自定义对象 在Js中,除了Array.Date.Number等内置对象外,开发者可以通过Js代码创建自己的对象. 目录 1. 对象特性:描述对象的特性 2. 创建对象方式: ...

  9. JavaScript系列-----对象基于哈希存储(Key,Value之Key篇) (1)

    1.Hash表的结构 首先,允许我们花一点时间来简单介绍hash表. 1.什么是hash表 hash表是一种二维结构,管理着一对对<Key,Value>这样的键值对,Hash表的结构如下图 ...

  10. javascript BOM对象详解

    javascript BOM对象详解 目标:本章节将分为9点详细介绍有关BOM对象的知识点 1.什么是BOM 2.BOM的构成 3.顶级对象window 4.window对象常见事件(页面加载事件和体 ...

最新文章

  1. 也许,这样理解 HTTPS 更容易!
  2. Python字典推导式将cookie字符串转化为字典
  3. boost::iostreams::filtering_ostream用法的测试程序
  4. 剪切粘贴时总是上次的内容_Quicker 1.4版本更新内容
  5. Swift和Objective-C混编 1
  6. Java 类加载总结
  7. Hadoop不适合哪些场景 哪些场景适合?
  8. CF 554B 找相同行
  9. 【Adobe美术基础】字体安装
  10. 2010.3.13郊野公园小记,以及参观托驼峰航线纪念碑
  11. Mac添加中国法定节假日安排
  12. 前端开发工程师学习路线图(收藏版)
  13. 深入理解Redis跳跃表的基本实现和特性
  14. 用 “类别混搭” 法实现移动游戏的创新
  15. 听吐的微信提示音终于能改了
  16. 《构架师的12项修炼》读书笔记
  17. 如何给网站设置自定义图标(标签页显示,收藏夹显示)
  18. DSF data model
  19. 工程伦理(2021春)第三章课后习题答案
  20. dream of/dress up/drink to等动词词组

热门文章

  1. 上班族薪酬计算方法变更 节假日加班费降低
  2. 赛拉图行车、保养、维修常见问题解答
  3. 驱动人生2014 v6.0.9.70 绿色版
  4. 一首非常好听的歌moonlight shadow
  5. 比较著名的大地震列表
  6. 202009计算机应用基础考前模拟试题,2009年10月自考00018计算机应用基础历年真题及答案...
  7. 安卓 Handler 消息机制之MessageQueue源码
  8. error PRJ0019: A tool returned an error code from Performing Post-Build Event...
  9. Unity_虚拟现实_自我见解
  10. Day 36: 关系型数据库和MySQL概述