语言类型

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

内置对象

  • String
  • Number
  • Boolean
  • Object
  • Function
  • Array
  • Date
  • RegExp
  • Error
  1. var str = "I am a string";

原始值"I am a string"并不是对象而是字面量,并且是一个不可变的值。如果要对这个字面量上进行一些操作,比如获取长度、访问其中某个字符等,那需要将其转换为 String 对象

内容

属性访问

  1. var myObject = {
  2. a: 2,
  3. };
  4. myObject.a; //2
  5. myObject["a"]; //2

. 操作符要求属性名满足标识符的命名规范[".."] 语法可以接受任意 UTF-8/Unicode 字符串作为属性名。

可计算属性名

ES6 增加了可计算属性名,可以使用 [] 包裹表达式来当做属性名。

  1. var prefix = "foo";
  2. var myObject = {
  3. [prefix + "bar"]: "hello",
  4. [prefix + "baz"]: "world",
  5. };
  6. myObject["foobar"]; //hello
  7. myObject["foobaz"]; //world

属性与方法

函数用于不会属于一个对象,对象只是拥有函数的引用。将其称为(对象的)方法不妥。

数组

  1. var myArray = ["foo", "42", "bar"];
  2. myArray["3"] = "barz";
  3. myArray.length = 4;
  4. myArray[3]; //barz
  5. myArray.bar = "barz";
  6. myArray.length; //4
  7. myArray.bar; //barz

复制对象

  1. function anotherFunction() {}
  2. var anotherObject = {
  3. c: true,
  4. };
  5. var anotherArray = [];
  6. var myObject = {
  7. a: 2,
  8. b: anotherFunction,
  9. c: anotherObject,
  10. d: anotherArray,
  11. };
  12. //深复制
  13. var newObj = JSON.parse(JSON.stringify(myObject));
  14. newObj.a; //2
  15. newObj.b === anotherFunction; //false
  16. newObj.c === anotherObject; //false
  17. newObj.d === anotherArray; //false
  18. //ES6 浅复制
  19. var newerObj = Object.assign({}, myObject);
  20. newerObj.a; //2
  21. newerObj.b === anotherFunction; //true
  22. newerObj.c === anotherObject; //true
  23. newerObj.d === anotherArray; //true

属性描述符

  1. var myObject = {};
  2. Object.defineProperty(myObject, "a", {
  3. value: 2,
  4. writable: true,
  5. configurable: true,
  6. enumerable: true,
  7. });
  8. myObject.a; //2
  1. Writable 决定是否可以修改属性的值
  2. Configurable 决定是否可以使用 defineProperty(..) 方法来修改属性描述符,同时还会禁止使用 delete object.a 删除属性(delete 仅用于删除属性,不要看做释放内存的工具)
  3. Enumerable 决定属性是否出现在对象属性的枚举中。

不变性

  1. 对象常量 writeable:falseconfigurable:false
  2. 禁止拓展 Object.preventExtensions(..) 禁止向对象中添加新属性
  3. 密封 Object.seal(..) 调用禁止拓展并把所有属性标记为 configurable:false
  4. 冻结 Object.freeze(..) 调用密封并把所有属性标记为 writeable:false

Getter Setter

  1. var myObject = {
  2. get a() {
  3. return this._a_;
  4. },
  5. };
  6. Object.defineProperty(myObject, "a", {
  7. set: function (val) {
  8. this._a_ = val * 2;
  9. },
  10. });
  11. myObject.a = 2;
  12. myObject.a; //4

存在性

  1. var myObject = {
  2. a: 2,
  3. };
  4. "a" in myObject; //true
  5. "b" in myObject; //false
  6. myObject.hasOwnProperty("a"); //true
  7. myObject.hasOwnProperty("b"); //false

in 操作符会检察属性是否在对象及其[[Prototype]]原型中, hasOwnProperty 只会检查属性是或否在 myObject 对象中。

枚举

  1. var myObject = {};
  2. Object.defineProperty(myObject, "a", { enumerable: true, value: 2 });
  3. Object.defineProperty(myObject, "b", { enumerable: false, value: 3 });
  4. // for..in 循环可以用来遍历对象的可枚举属性列表
  5. for (var k in myObject) {
  6. console.log(k, myObject);
  7. }
  8. // "a" 2
  9. myObject.propertyIsEnumerable("a"); //true
  10. myObject.propertyIsEnumerable("b"); //false
  11. Object.keys(myObject); // ["a"]
  12. Object.getOwnPropertyNames(myObject); // ["a","b"]

遍历

遍历属性的值

  • ES5: forEach(..) every(..) some(..)
  • ES6: for..of (迭代器)
  1. var myArray = [1, 2, 3];
  2. for (var v of myArray) {
  3. console.log(v);
  4. }
  5. //1
  6. //2
  7. //3
  8. var it = myArray[Symbol.iterator]();
  9. it.next(); //{value: 1, done: false}
  10. it.next(); //{value: 2, done: false}
  11. it.next(); //{value: 3, done: false}
  12. it.next(); //{value: undefined, done: true}

定义一个迭代器 Symbol.iterator

  1. var myObject = {
  2. a:2,
  3. b:3
  4. };
  5. Object.defineProperty(myObject,Symbol.iterator,{
  6. enumerable:false,
  7. writable:false,
  8. configurable:true,
  9. value:function(){
  10. var o = this;
  11. var idx = 0;
  12. var ks = Object.keys(o);
  13. return {
  14. next: function(){
  15. return {
  16. value: o[ks[idx++]],
  17. done:(idx > ks.length)
  18. };
  19. }
  20. }
  21. }
  22. });