一、对象
JavaScript简单类型有数字、字符串、布尔值、null、undefined,其他所有的值都是对象(数组、函数、正则表达式都是对象)。
数字、字符串、布尔值虽然拥有方法(包装对象),但并不是对象。
包装对象:
每当读取一个基本类型值的时候,后台会创建一个对象的基本包装类型的对象,从而能够调用一些方法来操作这些数据。
var s1 = 'abcdefg' ;var s2 = s1.substring(2) ;
后台自动完成下列处理:
创建String类型的一个实例 在实例上调用指定的方法 销毁这个实例所以上面代码等同于:
对象字面量
var flight = { airline: "Oceanic", number: 815, departure: { IATAL: "SYD", time: "2004-09-22 14:55", city: "Sydney" }, arrival: { IATA: "LAX", time: "2004-09-23 10:42", city: "Los Angeles" }}
检索
[] : flight['number']. : flight.number
更新
通过赋值语句更新,如果属性名已经存在于对象中,则被替换;如果对象中没有那个属性名,则添加。
stooge['first-name'] = 'Jerome'
引用
对象赋值通过引用来传递,它们永远不会被拷贝。
var a = { name: 'a'}var b = ab.name = 'b'console.log(a.name) // b
这里牵扯出 JavaScript 深拷贝和浅拷贝的问题
上例是浅拷贝使用Object.create可以进行深拷贝
var a = { name: 'a'}var b = Object.create(a)b.name = 'b'console.log(a.name) // a
自定义方法深拷贝见下:
var deepCopy= function(source) { var result={}; for (var key in source) { result[key] = typeof source[key]==='object'? deepCoyp(source[key]): source[key]; } return result; }
此时 var b = deepCopy(a) 得到的 b 就和 a 没有引用关系,即修改 b 不会影响 a了
原型
每个对象都连接到一个原型对象,并且从中继承属性。所有通过对象字面量创建的对象都连接到 Object.prototype 这个JavaScript中标准的对象。
创建一个对象时,可以选择某个对象作为它的原型:
var o = {o1:1,o2:function(){alert(1)}}function F(){}F.prototype = ovar f = new F()
反射
使用 hasOwnProperty 检查属性是否是对象独有的,它并不会检查原型链。
flight.hasOwnProperty('number'); //true
枚举
for in 可以遍历对象中所有的属性名(见深拷贝部分)
删除
delete 可以删除对象属性,不会触及原型链中的任何对象
减少全局变量污染
最小化使用全局变量的一个方法是创建唯一一个全局变量:
var App = {}App.stooge = { "first-name": "Joe", "last-name": "Howard"}App.flight = { airline: "Oceanic", number: 815}
新闻热点
疑难解答
图片精选