对象


  1. 对象以及基本的数据类型

  2. 对象的内容

    对象的存取使用默认的 [[GET]] 和 [[SET]] ,必要的时候也会检查原型链。
    可以进行人为使用 Getter 和 Setter 干预对象的存取

  3. 对象的属性(注意不可枚举的) + 属性值的操作

    对象的属性描述符可是确定对象的属性特点,有四个方法层层递进设置对象的不可变级别

  4. 对象的方法

    属性不一定包含值,他们或许是存在 getter 或者 setter 的访问描述符,
    属性是可枚举或者不可枚举的,这决定了他们 是否可以在遍历时被找到

  5. 对象的遍历

    建议使用 for ... of 遍历数组,使用 for .... in 遍历对象

数据类型


  1. JavaScript 的数据类型分类
  • 简单基本类型(本身并不是对象) JavaScript 万物皆对象不正确

    string、boolean、number、null、undefined

     typeof null == 'object'  其实是语言本身的一个 bug, 需要明确的是 null 是基本类型
    
  • 复杂类型(作为对象的子类型存在复杂类型本身也是对象,更像是对象的子对象

    函数(可调用的对象)、数组(具备额外行为的对象)

  1. JavaScript 内置对象 *** 内置对象只是一些内置函数/或者称之为内置的构造函数 ***

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

       有些内置函数看起来很像基础类型,其实他们并不是同一个东西,只是类型之间可以相互转化和拥有更加复杂的关系
      
  • 举例说明 (可以自动转换的类型

        “I am a string” 只是一个字面量,若需要获取其长度,语言会自动将其转为 String 类型后进行操作
    

    结论:
    1. 字面量和对象是有很大的不同
    2. 必要时语言本身或者人为可以很方便的进行转换

  • 内置函数分类详解

    null 和 undefined 没有构造函数的形式,只有文字形式

    Date 只有构造形式,没有文字形式

    Object、Array、Function、RegExp、无论使用文字形式或者是字面量形式,他们都是对象,不是字面量。

    String、Number、Boolean 可是使用文字或者对象形式,但是应首选更为简单的文字形式

Error 一般是抛出异常时自动被创建,也可以 new Error() 进行创建,很少用到

对象的内容 (对象的属性值 是作为引用的存在)


  1. 对象的内容及其值的存储和引用 (属性作为指针指向使用

对象的内容为对象中的属性和值

** 对象值的存储多种多样,对象容器内只存储对象的属性,其属性相当于指针,指向存储值的地方**

  1. 对象的属性名称(对象赋值对象取值时的属性名称)

    *** 目前可采用各种花样的对象的取值与赋值 ***

    es6 新增可计算的 对象赋值 功能

    对象取值可使用 可计算的属性

    举例:

     var myObj = {
            [Symbol.Someting]: "hello world"    // 可计算的赋值
     }
     myObj[myObj] = 'baz'   // 特殊的计算赋值
     myObj[true]  =   'bool'
    
     myObj[Symbol.Someting]  // hello world
     myObj["[object Object]"]     //  "baz"      可计算的取值
    myObj["true"]    // "bool"                       特殊的取值
    
  2. 对象的属性与方法 (** 当函数作为对象的属性值存在时 **)

    函数作为对象的属性值存在时:最多扯上 this 的隐式绑定
    ** 因为对象的值是引用,引用。。**
    ** 所以该函数与对象只存在引用关系,**
    ** 若内部有this,最多加一层 this 的 隐式绑定,其他无任何瓜葛。**
    ** 并且这个函数可以随时被外层访问到**

  • 对象的属性是一个函数,到底应该称呼其为属性值好还是方法好??

    因为对象的属性值都是引用,所以当一个对象的属性值是函数时,其实本身并没有和对象产生任何关系,只是多了一个引用地址 。所有函数还是函数本身。

对象的扩展

  1. 复制对象 ** 专开一个章节专门讲复制对象 **

  2. 对象和数组的关系

    • 数组不接受非数值下标的数据存储,写了非数值下标的存储不会报错,但没用。

       var myArr = ['foo', 42, 'bar'];
       myArr.koo = 'baz';
       myArr.length    // 3  不接受非数值类型的下标
      

对象的属性详解 (可枚举和不可枚举的对象属性 + 属性值的操作)


使用 delete 可以删除对象的属性,若此属性是对象的最后一个属性,且该对象无其他引用。则删除对象的最后一个属性后,该对象会被垃圾回收

  1. 属性的四个描述符

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

使用 defineProperty(...) 可以为对象 添加或者设置 属性的描述信息,

configurable: false 是不可逆的

  1. 对象的不可变性(通过属性描述符设置对象不可变)四个方法,层层递进 有级别限制

    • 对象常量 ( writable: fasle 和 configurable: false 可以创建一个真正的常量属性 ) 不可修改,重定义,删除
      var myObj = {}
      Object.defineProperty(myObj, "FAVORITE_NUMBER", {
      value: 2,
      writable: false,
      configurable: fasle
      })
  • 禁止扩展( Object.preventExtensions(...) )
    表现特点:

      禁止添加新的属性,但是可以删除
    
  • 密封 ( Object.seal(...) ) 在禁止扩展的基础上 + 设置对象属性的 configurable: false
    表现特点

     禁止添加属性,禁止删除属性,禁止重新配置属性,但是可以修改属性
    
  • 冻结( Object.freeze(...) ) 密封 + writable: false

    禁止任何操作
    

对象的方法详解


  1. [[GET]] 和 [[PUT]] 用于对象属性值的 获取和设置

    var myObj = { a: 2 }
    myObj.a // 2
    

myObj.a 实际上是实现了[[GET]]操作,并且会遍历可能存在的原型链

  1. Getter 和 Setter 访问描述符

     var myObj = {
       get a() {
           return this._a;
       },
       set a(val) {
           this._a = val * 2;
       }
     }
    

[[GET]] 和 [[PUT]] 是语言内置且默认的属性值的存取方法, Getter 和 Setter 是提供给人为的数据存取的方法,且人为的操作优先级更高

不同之处

Getter 和 Setter 是 访问控制符
writable、configurable 等是 属性修饰符

  1. 属性存在性的检查

可枚举属性(是否可以出现在对象的属性遍历中) 表示 是否可出现在 for in 循环中

   var obj = {}
   Object.defineProperty(obj, "a", {
          value: 2,
          enumerable: false
    })
    "a" in obj     // true
    obj.a    // 2
    obj.hasOwnProperty("a")    // true

    看: 不可枚举的属性是可以访问其值,且可以使用 in 操作符判真。
          只是不能 被遍历到而已

** 遍历时 对象会 使用 propertyIsEnumerable(....)检验 属性的 enumable 的属性,并决定其是否可遍历 **
  1. 存在性检查的 五个 方法详解 是否可枚举 + 是否检测原型链

    • propertyIsEnumerable(...) 用于检查给定的属性名称 是否可枚举 + 不检测原型链 返回 boolean 值

    • Object.key() 返回一个数组 只包含可枚举属性 不检测原型链

    • Object.getOwnPropertyNames(...) 包含不可枚举的属性 + 不检测原型链

    • in 操作符 包含不可枚举属性 + ** 检测原型链**

  • hasOwnProperty(..) 包含不可枚举属性 + 不检测原型链

对象的遍历


对象遍历和数组遍历的不一致性

数组的下标是确定且有序的,对象的属性的顺序是不确定的

  • 数组循环建议使用 for ... of 遍历

    for ... of 会自动调用系统的迭代器( 具体表现为: 使用指针 + next() 进行数据访问 )

。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • 作者:clearbug原文地址:http://www.cnblogs.com/craftsman-gao/p/48...
    IT程序狮阅读 791评论 1 8
  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 2,592评论 9 22
  • TCP与UDP TCP和UDP都是传输层的协议: TCP是传输控制层协议,是面向连接、可靠的,点对点的;UDP是用...
    HanTZ阅读 1,480评论 0 9
  • 你是否记得初夏的味道 春日才过地上飘落的花瓣 裹着夏所独有的阳光 像是才烤出的甜甜圈 你是否记得中夏的颜色 毛孔宣...
    桂枝枝阅读 146评论 0 0