你不知道的javascript(上)第三章对象读书笔记

374 阅读2分钟

对象

语法

对象有两种定义形式: 1.声明形式和构造形式。

类型

js中一共有6中简单基本类型

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

存在性

let object = {
    a:undefined
};

console.log(object.a, object.b)
回打印出 undefined, undefined

虽然他们都打印出undefined,但是我们 如何区分对象中是否存在这个属性呢?

("a" in myObject); // true
("b" in myObject); // false
myObject.hasOwnProperty( "a" ); // true
myObject.hasOwnProperty( "b" ); // false

hasOwnProperty()会检查属性是否在myObject对象中,不会检查原型链; 而in操作符回检查属性是否在对象及其原型链中

针对hasOwnProperty,这里有一个值得注意的点,在使用for...in...遍历对象的时候

如果你只要考虑对象本身的属性,而不是它的原型,那么使用 getOwnPropertyNames() 或执行 hasOwnProperty() 来确定某属性是否是对象本身的属性(也能使用propertyIsEnumerable)。

小结(摘自文章)

  • JavaScript 中的对象有字面形式(比如 var a = { .. })和构造形式(比如 var a = new Array(..))。

  • 字面形式更常用,不过有时候构造形式可以提供更多选项。

  • 许多人都以为“JavaScript 中万物都是对象”,这是错误的。对象是 6 个(或者是 7 个,取 决于你的观点)基础类型之一。对象有包括 function 在内的子类型,不同子类型具有不同 的行为,比如内部标签 [object Array] 表示这是对象的子类型数组。

  • 对象就是键 / 值对的集合。可以通过 .propName 或者 ["propName"] 语法来获取属性值。访 问属性时,引擎实际上会调用内部的默认 [[Get]] 操作(在设置属性值时是 [[Put]]), [[Get]] 操作会检查对象本身是否包含这个属性,如果没找到的话还会查找 [[Prototype]] 链(参见第 5 章)。

  • 属性的特性可以通过属性描述符来控制,比如 writable 和 configurable。此外,可以使用 Object.preventExtensions(..)、Object.seal(..) 和 Object.freeze(..) 来设置对象(及其 属性)的不可变性级别。

  • 属性不一定包含值——它们可能是具备 getter/setter 的“访问描述符”。此外,属性可以是 可枚举或者不可枚举的,这决定了它们是否会出现在 for..in 循环中。

  • 你可以使用 ES6 的 for..of 语法来遍历数据结构(数组、对象,等等)中的值,for..of 会寻找内置或者自定义的 @@iterator 对象并调用它的 next() 方法来遍历数据值。