深入理解javascript对象系列第一篇——初识对象
对象创建
有以下三种方式来创建对象,包括new构造函数、对象直接量和object.create()函数
【1】new构造函数
使用new操作符后跟object构造函数用以初始化一个新创建的对象
var person = new object();
// 如果不给构造函数传递参数可以不加括号 var person = new object;
person.name = 'liu';
person.age = 28;
console.log(person); // {name: "liu", age: 28}
如果传入的参数是一个对象,则返回这个对象
var o = {name: 'o'};
var o2 = new object(o);
console.log(o === o2); // true
如果传入的参数是一个原始类型的值,则返回该值对应的包装对象
console.log(new object('foo')); // string {0: "f", 1: "o", 2: "o", length: 3, [[primitivevalue]]: "foo"}
console.log(new object(1)); // number{[[primitivevalue]]: 1}
console.log(new object(true)); // boolean{[[primitivevalue]]: true}
若object()函数不通过new而直接使用,则相当于转换方法,可以把任意值转换为对象
[注意]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操作符相同的基本过程,于是也可以叫做语法糖
对象字面量是由若干名值对组成的映射表,名值对中间用冒号分隔,整个映射表用花括号括起来
不同属性之间用逗号分隔,属性名可以是任意字符串,属性值可以是任意类型表达式,表达式的值是属性值
[注意]一般地,对象字面量的最后一个属性后的逗号将忽略,但在ie7-浏览器中导致错误
//等价于var person = new object();
var person = {};
[注意]一般地,对象字面量的最后一个属性后的逗号将忽略,但在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
实例方法
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]"
判断为空
判断对象是否为空,有以下三种方法
1、for-in语句
let isempty = (obj) => { for(let i in obj){ return false } return true } console.log(isempty({}))//true console.log(isempty({a:1}))//false
2、json.stringify方法
let isempty = (obj) => { return json.stringify(obj) === '{}' } console.log(isempty({}))//true console.log(isempty({a:1}))//false
3、object.keys方法
let isempty = (obj) => { return !object.keys(obj).length } console.log(isempty({}))//true console.log(isempty({a:1}))//false
上一篇: 云计算等将为ICT产业带来新一轮增长空间
下一篇: Google能成为下一个世界围棋冠军吗?
推荐阅读
-
深入理解JavaScript中的对象复制(Object Clone)
-
深入理解javascript对象系列第一篇——初识对象
-
深入理解ajax系列第一篇之XHR对象
-
深入理解JavaScript中的对象
-
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现_基础知识
-
JavaScript的深入理解:变量对象(Variable Object)
-
JavaScript String对象代码实例深入理解
-
JavaScript词法作用域与调用对象深入理解_javascript技巧
-
深入理解ajax系列第一篇之XHR对象
-
JavaScript创建对象的多种方式以及优缺点的深入理解