javascript中的难点是函数、对象和继承,前面已经介绍过函数系列。从本系列开始介绍对象部分,本文是该系列的第一篇——初识对象javascript
javascript的基本数据类型包括undefined、null、boolean、string、number和object。对象和其余基本类型值不一样的是,对象是一种复合值:它将许多值(原始值或者其余对象)聚合在一块儿,可经过名字访问这些值html
因而,对象也可看作是属性的无序集合,每一个属性都是一个名值对。属性名是字符串,所以咱们能够把对象当作是从字符串到值的映射java
关于复合值和原始值的详细区别移步至此浏览器
有如下三种方式来建立对象,包括new构造函数、对象直接量和Object.create()函数ide
【1】new构造函数函数
使用new操做符后跟Object构造函数用以初始化一个新建立的对象spa
var person = new Object(); //若是不给构造函数传递参数能够不加括号 var person = new Object; person.name = 'bai'; person.age = 29;
//建立无属性的空对象 var cody1 = new Object(); var cody2 = new Object(undefined); var cody3 = new Object(null); console.log(typeof cody1,typeof cody2, typeof cody3);//object object object
若是该参数是一个对象,则直接返回这个对象 prototype
var o1 = {a: 1}; var o2 = new Object(o1); console.log(o1 === o2);// true var f1 = function(){}; var f2 = new Object(f1); console.log(f1 === f2);// true
若是是一个原始类型的值,则返回该值对应的包装对象设计
//String {0: "f", 1: "o", 2: "o", length: 3, [[PrimitiveValue]]: "foo"} console.log(new Object('foo')); //Number {[[PrimitiveValue]]: 1} console.log(new Object(1)); //Boolean {[[PrimitiveValue]]: true} console.log(new Object(true));
若Object()函数不经过new而直接使用,则至关于转换方法,能够把任意值转换为对象code
[注意]undefined和null会转换为一个空对象
var uObj = Object(undefined); var nObj = Object(null); console.log(Object.keys(uObj));//[] console.log(Object.keys(nObj));//[]
若是Object()的参数是一个对象,则直接返回原对象
var o = {a:1}; var oObj = Object(o); console.log(Object.keys(oObj));//['a']
利用这一点,能够写一个判断变量是否为对象的函数
function isObject(value) { return value === Object(value); } isObject([]) // true isObject(true) // false
【2】对象字面量
javascript提供了叫作字面量的快捷方式,用于建立大多数原生对象值。使用字面量只是隐藏了与使用new操做符相同的基本过程,因而也能够叫作语法糖
对象字面量是由若干名值对组成的映射表,名值对中间用冒号分隔,整个映射表用花括号括起来
不一样属性之间用逗号分隔,属性名能够是任意字符串,属性值能够是任意类型表达式,表达式的值是属性值
//等价于var person = new Object(); var person = {};
var person = { name : 'bai', age : 29, 5 : true };
使用对象字面量的方法来定义对象,属性名会自动转换成字符串
//同上 var person = { 'name' : 'bai', 'age' : 29, '5' : true };
[注意]通常地,对象字面量的最后一个属性后的逗号将忽略,但在IE7-浏览器中致使错误
//IE7-浏览器中报错 SCRIPT1028: 缺乏标识符、字符串或数字 var person = { name : 'bai', age : 29, 5 : true, };
【3】Object.create()
ES5定义了一个名为Object.create()的方法,它建立一个新对象,第一个参数就是这个对象的原型,第二个可选参数用以对对象的属性进行进一步描述
var o1 = Object.create({x:1,y:1}); //o1继承了属性x和y console.log(o1.x);//1
能够经过传入参数null来建立一个没有原型的新对象,但经过这种方式建立的对象不会继承任何东西,甚至不包括基础方法。好比toString()和valueOf()
var o2 = Object.create(null); // o2不继承任何属性和方法 var o1 = {}; console.log(Number(o1));//NaN console.log(Number(o2));//Uncaught TypeError: Cannot convert object to primitive value
若是想建立一个普通的空对象(好比经过{}或new Object()建立的对象),须要传入Object.prototype
var o3 = Object.create(Object.prototype); // o3和{}和new Object()同样 var o1 = {}; console.log(Number(o1));//NaN console.log(Number(o3));//NaN
Object.create()方法的第二个参数是属性描述符
var o1 = Object.create({z:3},{ x:{value:1,writable: false,enumerable:true,configurable:true}, y:{value:2,writable: false,enumerable:true,configurable:true} }); console.log(o1.x,o1.y,o1.z);//1 2 3
对象是属性的无序集合,由键名和属性值组成
【键名】
对象的全部键名都是字符串,因此加不加引号均可以,若是不是字符串也会自动转换成字符串
var o = { 'p': 'Hello World' }; var o = { p: 'Hello World' };
var o ={ 1: 'a', 3.2: 'b', 1e2: true, 1e-2: true, .234: true, 0xFF: true, }; //Object {1: "a", 100: true, 255: true, 3.2: "b", 0.01: true, 0.234: true} o;
[注意]若是键名不符合标识符命名规则,则必须加上引号,不然会报错
//Uncaught SyntaxError: Unexpected identifier var o = { 1p: 123 } var o = { '1p': 123 }
【属性值】
属性值能够是任何类型的表达式,最终表达式的结果就是属性值的结果
var o ={ a: 1+2 } console.log(o.a);//3
若是属性值为函数,则一般把这个属性称为“方法”
var o = { p: function (x) { return 2 * x; } }; o.p(1);//2
因为对象的方法就是函数,所以也有name属性。方法的name属性返回紧跟在function关键字后面的函数名。若是是匿名函数,ES5环境会返回undefined,ES6环境会返回方法名
var obj = { m1: function f() {}, m2: function () {} }; obj.m1.name // "f" obj.m2.name //ES5: undefined obj.m2.name //ES6: "m2"
若是不一样的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其余全部变量
var o1 = {}; var o2 = o1; o1.a = 1; console.log(o2.a);// 1 o2.b = 2; console.log(o1.b);// 2
若是取消某一个变量对于原对象的引用,不会影响到另外一个变量
var o1 = {}; var o2 = o1; o1 = 1; console.log(o2);//{}
valueOf()
valueOf()方法返回当前对象
var o = new Object(); o.valueOf() === o // true
toString()
toString()方法返回当前对象对应的字符串形式
var o1 = new Object(); o1.toString() // "[object Object]" var o2 = {a:1}; o2.toString() // "[object Object]"
通常地,使用Object.prototype.toString()来获取对象的类属性,进行类型识别,详细状况移步至此
toLocaleString()
toLocaleString()方法并不作任何本地化自身的操做,它仅调用toString()方法并返回对应值
[注意]Date和Number类对toLocaleString()方法作了本地化定制
var o = {a:1}; o.toLocaleString() // "[object Object]"
判断对象是否为空,有如下三种方法
一、for-in语句
let isEmpty = (obj) => { for(let i in obj){ return false } return true } console.log(isEmpty({}))//true console.log(isEmpty({a:1}))//false
二、JSON.stringify方法
let isEmpty = (obj) => { return JSON.stringify(obj) === '{}' } console.log(isEmpty({}))//true console.log(isEmpty({a:1}))//false
三、Object.keys方法
let isEmpty = (obj) => { return !Object.keys(obj).length } console.log(isEmpty({}))//true console.log(isEmpty({a:1}))//false
【1】 W3School-Javascript高级教程——引用类型 http://www.w3school.com.cn/js/pro_js_referencetypes.asp
【2】 阮一峰Javascript标准参考教程——对象 http://javascript.ruanyifeng.com/grammar/object.html【3】《javascript权威指南(第6版)》第6章 对象【4】《javascript高级程序设计(第3版)》第5章 引用类型【5】《javascript语句精粹》第3章 对象【6】《javascript面向对象精要》 第3章 理解对象【7】《你不知道的javascript上卷》第3章 对象