object
权威指南:属性名可以包含空字符串在内的任意字符串,但是对象不能存在2个相同的属性。
创建对象的三种方式:
1、对象直接量
var obj = {};
2、关键字new
var obj = new Object()
3、Object.create( ) 函数来创建
使用Object.create( ) 来创建对象,第一个参数是创建出对象的原型,所以参数一必须要传递!
通过Object.create( ) 来创建的对象,它继承了参数对象的属性,并且新创建的对象修改其属性,参数对象不会受影响!!!
let obj = Object.create({name:'lxc'})
对象的访问
1、在对象中,去访问一个不存在的属性,结果为undefined;在此基础上如果在去访问一个属性,那么会报错,因为undefined、null值都没有属性:
不能读取undefined的length属性
检测属性
检查一个属性是否存在某个对象中:
1、in运算符:左侧是属性名(字符串),右侧是 对象。如果对象的自由属性或者继承属性包含这个属性,则返回true。
下边toString是继承的属性,所以返回true
2、hasOwnProperty:查找给定的参数属性是否是对象的自有属性。
3、propertyIsEnumerable : 它是hasOwnProperty的增强版,只有检查到是自身属性 且 这个属性的可枚举性为true 时,它才返回true。
下边之所以为false,因为toString是不可枚举的
4、还有一种方法: !== undefined 检查一个属性是否为undefined
之所以用绝对不等于,因为如果使用 != 值为null、undefined的时候是一样的,都会返回true ,因为 null == undefined 返回true。。。
let a = {x:1};
console.log(a.x !== undefined) //true
对象原型:
1、原型
使用对象直接量创建的对象,Object.prototype 作为它的原型;
使用new 创建的对象 ,使用构造函数的prototype作为它们的原型;
使用Object.create( ) 第一个参数(也可以为null)作为它们的原型。
2、查看原型的方法:
ES3 : o.constructor.prototype o是new 实例化的对象
ES5 : Object.getPropertyOf( param ) 将对象作为参数传入。
3、查看某对象是否是另一对象的原型
p.isPrototypeOf( o ) p是否是o的原型
var a = {name:'lxc'}
var r = Object.create(a)
console.log(a.isPrototypeOf(r)) //true
console.log(Object.prototype.isPrototypeOf(r)) //true
序列化对象
使用JSON.stringify和JSON.parse 可对一个对象进行深拷贝
var a = {name:'lxc'}
var r = JSON.stringify(a)
var newA = JSON.parse(r)
console.log(a === newA) //false
toString()方法
该方法没有参数,在需要一个对象转换为字符串的时候,js会调用此方法。
权威指南:
一个对象转化为字符串,会调用此方法,如果返回的是一个原始值,js会将这个值转化为字符串(前提:如果这个原始值不是一个字符串)。
valueOf()方法
与toString()方法类似,js将对象转化为某种原始值的时候,调用它。尤其是转化为数字的时候。
权威指南:
在对象转化为数字的过程与转字符串类似,只不过先调用valueOf( ) 方法,如果返回一个原始值,js会把它转化为数字;不过大多数情况下,由于对象是一个复合值,所以多数对象无法真正表示一个原始值,因此默认的valueOf( ) 方法会简单的返回对象本身,而不是返回一个原始值。
如果调用调用valueOf( ) 方法返回的是对象本身,还会继续调用toString( ) 方法,返回一个原始值。
下边代码,对象a与1相加,首先a会调用valueOf()方法,如果没法转化为原始值,会调用toString( ) 方法转为原始值,再去与1相加。。。
var a = {name:'lxc'}
console.log(a +1) // [object Object]1
toLocaleString()方法
权威指南:
toLocaleString()方法返回的是表示一个对象的本地化字符串。Object中默认的toLcaleString()方法并不做任何本地化处理,它仅调用toString( )方法,并返回对应的值。但是Date和Number类对 toLcaleString()做定制,可以用它对数字、日期和时间做本地化的转换。
var a = new Date()
console.log(a.toLocaleString()) // 2019/10/31 上午9:06:32
console.log(a.toString()) // Thu Oct 31 2019 09:06:55 GMT+0800 (中国标准时间)