zoukankan      html  css  js  c++  java
  • 你不知道的JS系列 ( 36 ) - [[Get]] 和 [[Put]]

    [[Get]]
    对象访问在实现上有个微妙却非常重要的细节
    var myObject = {
      a: 2
    }
    myObject.a; // 2

    myObject.a 是一次属性访问,在实现上,myObject.a 在 myObject 上实际上实现了 [[Get]] 操作(有点像函数调用:[[Get]]() )。首先在对象中查找是否有名称相同的属性,如果找到就会返回这个属性的值。如果没有找到,按照 [[Get]] 算法的定义会执行另外一种非常重要的行为,就是遍历可能存在的原型链。如果无论如何都没有找到,会返回值 undefined

    var myObject = {
      a: 2
    }
    myObject.b; // undefined
    [[Put]]
    你可能认为给对象的属性赋值会触发 [[Put]] 来设置或者创建这个属性,但是实际上并不完全这样。[[Put]] 被触发是,实际上的行为取决于许多因素,包括对象中是否存在这个属性。如果已经存在这个属性
    1、属性是否是访问描述符,如果是并且存在 setter 就调用 setter
    2、属性的数据描述符 writable 是否是 false,是会调用失败,严格模式会抛出异常
    3、如果都不是,将该值设置为属性的值

    如果对象中不存在这个属性,[[Put]] 操作会更加复杂

  • 相关阅读:
    Leetcode 83. Remove Duplicates from Sorted List
    Leetcode 61. Rotate List
    Leetcode 24. Swap Nodes in Pairs
    增强式学习
    散布矩阵
    特征选择
    CouchDB
    echarts和matplotlib
    特征缩放
    K-means、SLC、EM
  • 原文地址:https://www.cnblogs.com/wzndkj/p/12563707.html
Copyright © 2011-2022 走看看