引入
关于JavaScript到底是不是面向对象的编程语言,目前其实争议还挺大。许多保守的人会说JavaScript是一种基于对象的语言,而不说是面向对象的语言。
但不管怎么样,对于前端开发者、工程师而言,可能没必要区分得如此清楚,对这类重视工程能力的语言“使用者”而言,只需要知道——
JavaScript拥有对象这一数据类型,
没有类却可以用构造器做出类能做的事
今天我们就来了解一下JS的对象数据类型,包括
描述
访问
修改
检查
1. 描述对象
JavaScript的对象其实可以理解成是一种无序的集合数据类型,有键值对:
var juejin = { name: '掘金酱', ifgood: True, birth: 2020, height: 1.70, weight: 55, score: null };
如上代码块。JavaScript用一个{}
括住一个个键值对,以此来表示一个对象。
键值对以xxx: xxx
形式申明,用,
隔开。
注意:
键不需要加“”,键很像是一个变量名,值则要区分数据类型,是字符串的话少不了加“”
最后一个键值对不需要在末尾加,
,如果加了,有的低版本浏览器将报错。
2. 访问
上面代码块描述了一个juejin对象,申明了一个name
属性,值是'掘金酱'
,ifgood
属性是布尔值True,birth
属性,值是2020
,以及其他一些属性。(掘金仿真人总得有身高体重吧)。
最后,把这个对象赋值给变量juejin
后,就可以通过变量juejin
来获取小明的属性了:
juejin.name; // '掘金酱' juejin.birth; // 2020
Question:之前提到的“键(即我们的属性名)像是变量名”,且此处访问属性也是采用.+属性名来完成的。那这个属性名的命名规则一定要按照变量名命名规则来吗?
Answer:当然不是,你只需要给属性名加上引号就行了:
var juejin = { name: '掘金酱', 'good?': 'yes!' };
但是访问的时候也不能用.来访问,需要用中括号来访问:
xiaohong['middle-school']; // 'No.1 Middle School' xiaohong['name']; // '小红' xiaohong.name; // '小红'
我们发现正常的变量名做属性时也可以用[]来访问。
3. 修改
JavaScript的对象是动态类型,我们可以自由地给一个对象添加或删除属性:
var zhangwei = { name: '张伟' }; zhangwei.age; // undefined zhangwei.age = 18; // 新增一个age属性 zhangwei.age; // 18 delete zhangwei.age; // 删除age属性 zhangwei.age; // undefined delete zhangwei['name']; // 删除name属性 zhangwei.name; // undefined delete zhangwei.school; // 删除一个不存在的school属性也不会报错
4. 检查
如果我们要检测zhangwei
是否拥有某一属性,可以用in
操作来获取结果:
'name' in zhangwei; // true 'homeland' in zhangwei; // false
值得注意的是,如果in判断出一个属性存在,有可能这个属性是对象继承得到的:
'toString' in zhangwei; // true
toString
定义在object
对象中,而所有对象最终都会在原型链上指向object
,所以xiaoming
也拥有toString
属性。
因此如果我们需要判断一个属性是否是对象自身拥有的,就可以使用hasOwnProperty()方法(这个名字可谓非常形象了)
var zhangwei = { name: '张伟' }; zhangwei.hasOwnProperty('name'); // true zhangwei.hasOwnProperty('toString'); // false