zires 博客

[QA] - objects in javascript

May 12, 2018

Q: 如何构建一个对象?

var obj = {
  key: value
  // ...
}

// 或者使用构造形式
var obj = new Object();
obj.key = value

Q: JavaScript中一切皆是对象吗?

这种说法是错误的。

js中的基本类型就不是对象,在js中一共有六种主要类型:

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

例如:

typeof ''
// 返回的是string

Q: JavaScript中的内置对象有哪些?

内置对象是对象的子类型,包括:

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

如果理解了这些其实都是对象,那么下面的代码就不会感到奇怪了:

var date = new Date()
typeof date // 'object'
date.hello = 'world' // 居然可以类似json一样,属性赋值
date.hello // 'world'

Q: JavaScript中的内置对象其实就是“类”吗?

这种说法也是错误的。

其实称呼它们为内置对象并不准确,应该叫内置函数比较恰当:

typeof String // 'function'

Q: 直接写的字符串和用String构造出来的字符串是一样的吗?

只能说字面上的值是一样的。

var strPrimitive = "I am a string"; 
typeof strPrimitive; // "string" 
strPrimitive instanceof String; // false

var strObject = new String( "I am a string" ); 
typeof strObject; // "object"
strObject instanceof String; // true

// 所以才有

strPrimitive == strObject // true
strPrimitive === strObject // false

Q: 在对象中,属性名永远都是字符串吗?

对的。如果不是字符串,也会被先转换成字符串。

Q: 属性描述符是什么?

所有的属性都具备了属性描述符。

var obj = {
  a: 2
}

Object.getOwnPropertyDescriptor( obj, "a" )

// {
//    value: 2,
//    writable: true,
//    enumerable: true,
//    configurable: true
// }
  • writeable

    决定了是否可以修改属性的值

  • enumerable

    决定了属性是否会出现在对象的属性枚举中,比如说 for..in 循环。

  • configurable

    决定了是否可以通过defineProperty(..)来修改属性描述符。

    除了无法修改,configurable:false 还会禁止删除这个属性。

Q: 对象中的[[Get]]操作行为是什么样子的?

对象默认的内置 [[Get]] 操作首先在对象中查找是否有名称相同的属性,如果找到就会返回这个属性的值。

如果没有找到名称相同的属性,按照 [[Get]] 算法的定义会遍历可能存在的 [[Prototype]] 链。

如果无论如何都没有找到名称相同的属性,那 [[Get]] 操作会返回值 undefined。

Q: 如何自定义对象的gettersetter方法?

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

obj.a = 2;
obj.a; // 4

Q: 如何判断对象中是否存在一个属性?

var myObject = { a:2
};

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

in 操作符会检查属性是否在对象及其 [[Prototype]] 原型链中。

hasOwnProperty(..) 只会检查属性是否在 myObject 对象中。


Zires

Hi~,i am zires, an IT engineer, live in Shanghai. You can get in touch with me via Github stackoverflow