JavaScript大杂烩5 - JavaScript对象的若干问题
1. 类型检查:instanceof与typeof
这是两个相似的操作符,instanceof用于检测函数的实例类型,主要是在面向对象编程中检查new出来的对象类型,需要注意instanceof是检查function对象的,前面实现的复制继承中的例子就不适用于使用instanceof来检查继承关系了。typeof,它用于检测变量的类型,在实际情况中应用的不是很多,稍微了解一下就可以了。
在使用typeof之前,有一点需要确认,那就是string与String不是同一个类型,这个不用多说了,我们前面说过了,前一个是类似于值类型的基元类型,后一个是类似于引用类型的其对应的包装类型,而且默认使用字面量定义的基本类型都是前一种,就是"值类型"。
了解了这个,我们就可以测试如下代码了:
alert(typeof 'Frank'); // string
alert(typeof 0); // number
alert(typeof true); // boolean
alert(typeof function(){}); // function
alert(typeof {}); // object
alert(typeof null); // object
alert(typeof undefined); // undefined
上面是基本的用法,其实通常也不会有太多的人使用用,毕竟动态语言不是太关注静态的类型,而且typeof只会返回上面出现的6中类型,像String这种包装类型和Array这种内置的对象全部返回object,所以很多场合这个返回值没什么意义。
2. 对象的成员遍历:for..in,for与foreach
对象遍历很简单,上面拷贝成员的时候,使用for..in操作符,遍历对象成员(注意会查找原型上的成员),然后拷贝出来。
其实从上面对象字面量的定义方式来说,对象本质是键值对,就是常说的Map结构,是一种集合。
对于集合(内置常用有Object和Array这两个集合)的遍历,历来有这么几种方式:
1). for循环
这是预先可以知道长度的集合的推荐访问方式,Array这个超级集合的遍历属于这种方式,看个例子:
var names = ['Dong', 'Frank'];
for(var i = 0, len = names.length; i < len; i++) {
alert(names[i]);
}
2). for/in循环
这是预先无法知道长度的集合的访问方式,对象成员的遍历属于这种,看个例子:
var person = {
name: 'Frank',
age: 10
};
for(item in person) {
if (person.hasOwnProperty(item)){
alert(person[item]);
}
}
当然了预先知道长度的集合也可以使用这种方式遍历,但是JavaScript不推荐这么做,因为for..in会访问原型链上的东东。所以通常来说,我们只使用for..in遍历对象的成员,而使用for遍历Array集合。
3). 对象的forEach之类的方法
这是Array的内置方法,不多说了,简单看个例子:
['foo', 'bar', 'baz'].forEach(function(element, index, array){ console.log(element, index, array); });
这个方法很好很强大,我们经常用它。
3. hasOwnProperty
JavaScript遍历对象有一个特点,这个上面也说到了,那就是遍历成员的时候,它会沿着对象本身和原型链来查找成员,所以很多时候需要知道一个成员是否是对象自身定义的,而不是原型链上带来的,这个时候就需要使用对象的方法hasOwnProperty了。
hasOwnProperty是唯一的一个不会到原型链上查找的成员,它只会在对象本身检查是否包含某一个成员。体会下面两种遍历的区别:
// 注意,这里只是一个例子,实际编程中并不推荐修改内置的对象
Object.prototype.bar = 1;
// foo的原型指向Object的原型,形成原型链
var foo = {moo: 2};
for(var i in foo) {
alert(i); // 输出moo与bar
} for(var i in foo) {
if (foo.hasOwnProperty(i)) {
alert(i); // 只输出moo
}
}
4. 对象的特殊用途
对象是数据类型,而且是特殊的集合,这个特性使得我们可以使用对象模拟很多特殊的用途。
1). 作为Dictionary
这个不用说了,因为对象的本质就是键值对,也就是key和value可以是任何类型的广义的Dictionary。当做Dictionary自然是很方便的:
var keyValueMap = {};
keyValueMap['key1'] = { name: 'Dong'};
keyValueMap['key2'] = { name: 'Frank'};
alert(keyValueMap['key1'].name);
alert(keyValueMap['key2'].name);
2). 作为enum
键值对当然可以作为enum使用了,看个例子:
// 对象作为枚举来使用
var LanguageType = {
English: 0,
Chinese: 1
}; function showLanguage(languageType) {
// 枚举的黄金搭档:switch语句
switch(languageType) {
case LanguageType.English: {
alert('English');
break;
}
case LanguageType.Chinese: {
alert('Chinese');
break;
}
default:
break;
}
} showLanguage(LanguageType.English);
showLanguage(LanguageType.Chinese);
3). 作为namespace
基本上为了组织代码的方便,高级语言都提供了namespace这种结构,这个在JavaScript中也可以使用对象来模拟:
var application = application || {};
application.server = {
config: function() {
alert('server config');
}
};
application.server.config();
当然还有另外一种使用自执行函数实现的namespace:
var namespace = (function () {
// 定义namespace下的私有成员
var privateMethod1 = function () { alert('M1'); }
var privateMethod2 = function () { alert('M2'); }
var privateProperty1 = 'foobar';
return {
// 返回namespace中公开的成员
publicMethod1: privateMethod1,
//nested namespace with public properties
properties:{
publicProperty1: privateProperty1
},
// 嵌套的namespace
utils:{
publicMethod2: privateMethod2
}
//...
}
})();
namespace.publicMethod1();
这些实现比较灵活,组织起来的代码也比较清晰,团队也较容易协作。
5. JSON是对象吗?
要回答这个问题,我们需要先了解什么是JSON。
1). JSON的定义
JSON( 全称为JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于JavaScript语法标准的一个子集。它采用完全独立于语言的文本格式,可以很容易在各种网络、平台和程序之间传输。JSON的语法很简单,易于人阅读和编写,同时也易于机器解析和生成。
通俗的讲:
a. JSON是一种字符串,其是语言中立的,任何语言都可以访问,读写这种字符串。
b. 书写这种字符串是需要一定规则的,这就是JSON的语法。
c. 把JSON字符串写到文本文件中,然后把这个文件的扩展名改成".json",就是通常的JSON文件,很多的程序可以直接读取这种文件,这种文件通常用于网络传输。
2). JSON语法
JSON语法是JavaScript对象表示法语法的子集,所以就是如下几点:
a. 数据在名称/值对中:名称是字符串,使用双引号表示。值可以是:数字(整数或浮点数),字符串(在双引号中),数组(在方括号中),对象(在花括号中),true/false/null。
b. 数据由逗号分隔
c. 花括号保存对象:对象可以包含各种数据,包括数组。
d. 方括号保存数组:数组可以包含对象。
例如:
{
"employees": [
{
"firstName": "Bill",
"lastName": "Gates"
},
{
"firstName": "George",
"lastName": "Bush"
}
]
}
有一点需要注意,如果JSON中含有转义字符,则需要转义。例如文件路径中需要使用"\\"而不是"\"。例如:{ "file":"C:\\a.txt"}。
3). JSON vs. JavaScript的对象字面量
搞清楚了JSON的本质,这个比较就很简单了,JSON是一种文件格式,读出来的是字符串,只不过这些字符串是按照对象字面量的语法组织起来的。
4). JSON vs. Text
JSON是文本格式,相对于以其他形式组织起来普通的文本来说,解析简单,很多语言都提供内建的类库方便编程,尤其是JavaScript,天生支持JSON的解析。
5). JSON vs. XML
可读性的比较:JSON和XML的可读性相比较而言,由于XML提供很多辅助的标签,更加适合人阅读和理解。
文件大小与传输难度的比较:XML允许使用方便的标签,所以文件尺寸是要比JSON大的。而且JSON源于JavaScript对象字面量的语法,所以天生的主战场是JavaScript与网络,在这里,JSON有着XML无法赶超的优势。
6). JSON Object
在新的浏览器中,JavaScript确实内置了一个叫JSON的对象,这个对象的功能很简单,就是解析JSON字符串变成JavaScript的对象,和将JavaScript对象转变成JSON字符串,说白了,就是别的语言中序列化与反序列化的过程,简单看个例子:
var json_string = '{ "name": "frank" }';
// 将字符串反序列化成对象
var obj = JSON.parse(json_string);
alert(obj.name);
// 将对象序列化成JSON字符串
var json_string_copy = JSON.stringify(obj);
alert(json_string_copy);
JavaScript大杂烩5 - JavaScript对象的若干问题的更多相关文章
- JavaScript大杂烩3 - 理解JavaScript对象的封装性
JavaScript是面向对象的 JavaScript是一种基于对象的语言,你遇到的所有东西,包括字符串,数字,数组,函数等等,都是对象. 面向过程还是面向对象? JavaScript同时兼有的面向过 ...
- JavaScript的 基本数据类型---对象
第一:Javascript对象是 第二:Javascript中 第三:Javascript的对象是数据: 第四:JavaScript 中的对象可以简单理解成"名称:值"对(name ...
- JavaScript权威指南--window对象
知识要点 window对象及其客户端javascript所扮演的核心角色:它是客户端javascript程序的全局对象.本章介绍window对象的属性和方法,这些属性定义了不同的API,但是只有一部分 ...
- JavaScript 的内置对象和浏览器对象
JavaScript 中对象通常包括两种类型:内置对象和浏览器对象,此外用户还可以自定义对象. 在 ECMAScript 中,更精确的定义应该分为:本地对象.内置对象和宿主对象. 对象包含两个要素: ...
- javascript json字符串与对象相互转换
在实际项目中,经常遇到字符格式的问题,记下来以便日后方便查看.用到两个函数:JSON.stringify() 和 JSON.parse(). 使用ajax向后台请求数据,后台给前端返回数据,明明后端脚 ...
- javascript的window.ActiveXObject对象,区别浏览器的方法
(window.ActiveXObject)的作用,用来判断浏览器是否支持ActiveX控件,如果支持ActiveX控件,我们可以利用var xml=new ActiveXObject("M ...
- Javascript初学篇章_5(对象)
对象 Javascript是一种面向对象的语言,因此可以使用面向对象的思想来进行javascript程序设计对象就是由一些彼此相关的属性和方法集合在一起而构成的一个数据实体.举个例子,一只猫是个对象, ...
- javascript event(事件对象)详解
javascript event(事件对象)详解 1. 事件对象 1. 事件对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 什 ...
- JavaScript学习08 Cookie对象
JavaScript学习08 Cookie对象 JavaScript Cookie Cookie对象: Cookie是一种以文件的形式保存在客户端硬盘的Cookies文件夹中的用户数据信息(Cooki ...
随机推荐
- 外媒:比特币大陆将于9月IPO 规模或高达180亿美元
看看你们坚持买的比特币是否值得? 北京时间8月13日上午消息,据CoinDesk获得的文件,比特币大陆将于今年9月申请首次公开募股(IPO),其规模可能高达180亿美元,市值预计在400亿美元到500 ...
- 在Vue中使用CodeMirror 格式显示错误 行数错乱 & 代码隐藏
项目需要在线展示和编辑Json文件,所以需要找一个代码编辑器,因为我们的项目直接使用的 vueAdmin-template 这个模板 json编辑器也是直接从 vue-element-admin 项目 ...
- 如何开始DDD(续)
上一篇针对用户注册案例简单介绍了如何使用 DDD,接下来我将继续针对这个例子做一下补充.先将User模型丰富起来,因为目前看上去他和贫血模型还没有啥大的区别. 首先还是由领域专家来说明业务,他提出了用 ...
- LDA-线性判别分析(二)Two-classes 情形的数学推导
本来是要调研 Latent Dirichlet Allocation 的那个 LDA 的, 没想到查到很多关于 Linear Discriminant Analysis 这个 LDA 的资料.初步看了 ...
- (转)内核模块操作命令-lsmod+rmmod+modinfo+modprobe
原文:http://watchmen.xin/2018/07/13/IT%E7%A7%91%E5%AD%A6%E6%8A%80%E6%9C%AF%E7%9F%A5%E8%AF%86%E4%BD%93% ...
- redis 乐观锁实践秒杀
需求:有一个标(理解成抢红包也行,accountBalance预赋值1000元),大家可以抢购,每个用户抢购成功后,更新最后标的总数,在并发情况下,使用redis的乐观锁,保证更新标总值正确性,先往r ...
- Log4Net使用详解1
log4net是一个功能著名的开源日志记录组件.利用log4net可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库(包括MS SQL Server, Access, Oracle ...
- Shell脚本 | 性能测试之内存
性能测试中,内存是一个不可或缺的方面.比如说在跑 Monkey 的过程中,如何准确持续的获取到内存数据就显得尤为重要. 今天分享一个脚本,可以在给定时间内持续监控内存,最后输出成一份 CSV 文件,通 ...
- 精读JavaScript模式(三),new一个构造函数居然发生了什么?
一.前言 上个月底,爸爸因为事故突然离世,说心里话,现在看到'去世','爸爸'这样的字眼,眼泪都会忍不住在眼眶打转,还是需要时间治愈.最近也只是零碎的看了下东西,始终沉不下心去读书,直到今天还是决定捡 ...
- linux nohup
nohup RAILS_ENV=production bundle exec XXXX & nohup RAILS_ENV=production bundle exec XXXX >/d ...