javascript语言精粹md

31 阅读5分钟
第三章 对象
1.对象字面量
  • 一个对象字面量就是由一对花括号以及括号中的零或多个 “名/值” 对组成的整体。其中,逗号用于分割多个 “名/值” 对。
var a = {
   "first-name": "jerome",
   first_name: 'Howard'
}

在上述代码块中,等号右边的就是对象字面量。

  • 属性名可以是包括空字符串在内的任何字符串。
  • 在对象字面量中,如果属性名是一个合法 的JavaScript标识符且不是保留字,贝IJ并不强制要求用引号括住属性名。所以用引号括住 “first-name"是必需的,但是否括住first_name则是可选的(js中的标识符中包含连接符-是不合法的,但允许包含下划线_)逗号用来分隔多个“名 /值”对。
  • 属性的值可以从包括另一个对象字面量在内的任意表达式中获得。对象是可嵌套的:
var flight = (

number: 815,

departure: {

IATA: ”SYD”,

time: "2004-09-22 14:55”,
}
);
2.检索---其实就是获取
  • 要检索对象里包含的值,可以采用在口后缀中括住一个字符串表达式的方式。如果字符串 表达式是一个字符串字面量,而且它是一个合法的JavaScript标识符且不是保留字,那么也可以用.表示法代替。优先考虑使用・表示法,因为它更紧凑且可读性更好。
  • 其实就是两种展示方法 一个是[] 一个是点
  • 如果你尝试检索一个并不存在的成员属性的值,将返回undefined。
stooge["middle-name"] // undefined

||运算符可以用来填充默认值:

var middle = stooge [ 'Middle-name" ] | | “(none)";

尝试从undefined的成员属性中取值将会导致TypeError异常。这时可以通过&&运算符 来避免错误

flight.equipment // undefined

flight.equipment.model // throw nTypeErrorH

flight.equipment && flight.equipment.model // undefined
更新
  • 对象之前已经存在属性名,就会被替换,如果没有就是新增
引用
  • 在 JavaScript 中,对象通过引用来传递。它们永远不会被复制:
var x = stooge;

x.nickname = 1 Curly';

var nick = stooge.nickname;

//因为x和stooge是指向同一个对象的引用,所以nick为*Curly10

var a={},b={},c={};

// a、b和c每个都引用一个不同的空对象。 a = b = c = {);

// a、b和c都引用同一个空对象。
原型
  • 每个对象都会连接到一个原型对象,并且可以从中继承属性。在通过对象字面量创建一个新对象时,该对象会连接到Object.prototype,它是 JavaScript 中的标配对象。如果不想让对象连接到Object.prototype,也可以选择另一个对象作为它的原型。

  • 原型连接,就是将一个对象连接到另一个原型对象上,连接的桥梁就是 prototype 属性。通过原型连接,形成一条查找属性的规则:如果要获取对象的某个属性值,但该对象无此属性,那么 JavaScript 会试着从原型对象中获取属性值。如果也没有,那么会再从它的原型中寻找,依此类推,直到该过程最后到达终点 Object.prototype。如果终点也不存在,那么结果就是 undefined 值。这个过程称为委托。

  • 原型关系是一种动态的关系。如果我们添加一个新的属性到原型中,该属性会立即对所有基于该原型创建的对象可见。 关于原型和原型链 我会在之后专门写一下的

反射
  • typeof 操作符可确定属性的类型,它会返回属性类型的字符串形式,比如:
typeof  flight.number //'number'
typeof 1 //'number'
typeof 'str' //string
  • 通过对象.hasOwnProperty('属性名')可判断属性是否是对象独有的而不是原型上的,如果是独有的则返回true
枚举
  • 通过 for in 可枚举一个对象中所有的属性名,包括不需要使用的函数和原型中的属性。如果想过滤掉它们,可通过 hasOwnProperty 方法选择非原型中的属性,以及使用 typeof 来排除函数。

    • 属性出现的顺序是不确定的,如果要确保属性以特定的顺序出现,最好的方法就是用 for 代替 for in,并创建一个包含按顺序排列的属性名的数组:

      var i;
      var n = ['a', 'b', 'c'];
      for (i = 0; i < n.length; i += 1) {
          ...
      }
      
删除
  • delete 运算符可以用来删除对象的属性。如果对象包含该属性,那么该属性就会被移除,其语法如下:

    delete 对象.属性名 或 delete对象["属性名"]

  • 删除对象的属性可能会让来自原型链中的属性透现出来。

减少全局变量污染

JavaScript可以很随意地定义全局变量来容纳你的应用的所有资源。遗憾的是,全局变量削 弱了程序的灵活性,应该避免使用。

最小化使用全局变量的方法之一是为你的应用只创建一个唯一的全局变量:

var MYAPP = {);

该变量此时变成了你的应用的容器:

MYAPP.stooge = (

"first-name": ” Joe”, "last-name" : "Howard" };

MYAPP.flight = (

airline: "Oceanic",

number: 815, departure: ( IATA: ”SYD”, time: "2004-09-22 14:55”, city: "Sydney"
},

arrival: (

IATA: ”LAX”,

time: “2004-09-23 10:42”,

city: "Los Angeles"

}

};

只要把全局性的资源都纳入一个名称空间之下,你的程序与其他应用程序、组件或类库之 间发生冲突的可能性就会显著降低。你的程序也会变得更容易阅读,因为很明显, MYAPP. stooge指向的是顶层结构。

  • 我们会看到使用闭包来进行信息隐藏的方 式,它是另一种有效减少全局污染的方法。