【这些年我似是非懂的 Javascript】Day 29 - 物件 # Part 5 # 特性存取的秘密

今天要来分享特性存取的秘密~

[[GET]]

你知道当你在存取一个物件里面的特性时会发生什麽事情吗?

const obj ={
    a: 16
}

obj.a; // 16

obj.a 是一个特性存取的动作,但是他不只是单纯只是找 obj 内有无 a 这个特性而已...
难道...
他会往外找!?

...

没有! 你想太多了xD
其实他会对他执行一个 [[GET]] 的作业,基本上他会先看你这个物件有没有你要找的特性,有的话他就回传该值,没有的话...

就会发生很可怕的事...
就是书上说在第十章的 [[Prototype]]串链 会提到xDD 所以现在我也不知道

反正他有一个重要的结果是他如果找不到任何方法找到该值他就会回传 undefined

看起来就是找有的东西比找没有的东西来的麻烦许多~
你说是吧!?

[[Put]]

既然有 Get 那有个 Put 也不稀奇(?

基本上这边就是当你要 assign 值给一个特性时他会做些啥?

  1. 该特性是一个存取器描述器吗? 如果是就呼叫他的设值器
  2. 该特性是 writable 为 false 的一个资料描述器吗? 在 严格模式就喷爆你,不是就不喷你。
  3. 如果是writable 为 true 的话,就照正常方式把值给那个现存的特性。

所以我说 存取器描述器资料描述器 那麽多专业名词到底是三...?

  • 存取器描述器
    当他有取值器或是设值器,他就是一个"存取器描述器"。 简单来说就是 getset 啦。
  • 资料描述器
    定义一个属性时,他没有取值器或是设值器时他就是资料描述器。 简单来说看起来就是纯资料啦。

那如果跟上面的 [[Get]]一样找不到相关的特性,会怎麽做?
这部分也是属於之後第十章的 [[Prototype]]的范畴xDD
我们之後来看看~

存在 (Existence)

前面有说假使像是存取该不存在的特性时,他会回传 undefined,但是有一种可能像是这样。

const obj={
    a: undefined
}

obj.a; // undefined

嗯...
他就是把 undefined 丢进存在的特性当值,那我们到底要怎麽区分他到底存不存在呢?

可以使用以下两种方式

const obj={
    a: undefined
}

('a' in obj); // true
('b' in obj); // true

obj.hasOwnProperty(a); // true 
obj.hasOwnProperty(b); // false 

以上是今天的文章
感谢收看

最近越来越忙,铁人赛也到了尾声,
可惜今天还是来不及写到迭代 Orz


参考来源:

你所不知道的 JS|范畴与 Closures,this 与物件原型 (You Don't Know JS: this & Object Prototypes))


<<:  JavaScript 进阶笔记一 (变数)

>>:  第 28 型 - 路由 (Router) - Resolve / 延迟载入 (Lazy Router)

Day14 - 结果今天只做小蛇,小蛇还不贪

class Snake { constructor() { // 蛇头位子 this.head = ...

JavaScript Day 18. 原始型别与物件型别

JavaScript 日常系列写着写着,就此进入了我的苦手范围QQ,之後的主题应该都是我的修罗场,考...

[Day13] THM Res

今天这一题是针对 Redis 服务的攻击,对於打腻 Web 的人应该会觉得满有趣的(?)。 网址:h...

Day08 - 套用 Html Helper - 复杂型别 object + collection

Case01 跟 Day05 范例差不多,差异如下: Controller 於 Get 时,先写死固...

[Day 25] Final Project (1/5) — 目标、计画说明

目标:资料飞轮 在 [Day 02] Why MLOps — 从"地平说" 走向...