JavaScript 提供多个内建对象, 比如 String,Date,Array 等等. 对象只是带有属性和方法的特殊数据类型. 下面我们来看一下如何判断对象是否存在.
JavaScript 中判断某对象是否存在的方法:
1, 直接判断对象不为 null
- if (!myObj) {
- var myObj = { };
- }
JavaScript 语言是 "先解析, 后运行", 解析时就已经完成了变量声明
2, 使用 Windows 对象判断某对象是否存在
- if (!Windows.myObj) {
- var myObj = { };
- }
3, 使用 this 对象判断某对象是否存在
- if (!this.myObj) {
- this.myObj = { };
- }
在某些运行环境中 (比如 V8,Rhino),Windows 未必是顶层对象. 所以, 考虑改成 this 进行判断, 在全局变量的层面中, this 关键字总是指向顶层变量, 所以就可以独立于不同的运行环境.
4, 方法三这样写可读性较差, 而且 this 的指向是可变的, 容易出错, 所以进一步改写:
- var global = this;
- if (!global.myObj) {
- global.myObj = { };
- }
5, 可以使用 typeof 运算符, 判断 myObj 是否有定义.
- if (typeof myObj == "undefined") {
- var myObj = { };
- }
这是目前使用最广泛的判断 JavaScript 对象是否存在的方法.
6, 由于在已定义, 但未赋值的情况下, myObj 的值直接等于 undefined, 所以上面的写法可以简化:
- if (myObj == undefined) {
- var myObj = { };
- }
有两个地方需要注意, 首先第二行的 var 关键字不能少, 否则会出现 ReferenceError 错误, 其次 undefined 不能加单引号或双引号, 因为比较的是 undefined 这种数据类型, 而不是 "undefined" 这个字符串.
7, 用精确比较 === 判断对象是否存在
- if (myObj === undefined) {
- var myObj = { };
- }
8, 根据 JavaScript 的语言设计, undefined == null, 所以比较 myObj 是否等于 null, 也能得到正确结果
- if (myObj == null) {
- var myObj = { };
- }
不过, 虽然运行结果正确, 但是从语义上看, 这种判断方法是错的, 应该避免.
因为 null 指的是已经赋值为 null 的空对象, 即这个对象实际上是有值的, 而 undefined 指的是不存在或没有赋值的对象.
因此, 这里只能使用 "比较运算符"(==), 如果这里使用 "精确比较运算符"(===), 就会出错
9, 还可以使用 in 运算符, 判断 myObj 是否为顶层对象的一个属性
- if (!('myObj' in Windows)) {
- Windows.myObj = { };
- }
10, 使用 hasOwnProperty 方法, 判断 myObj 是否为顶层对象的一个属性
- if (!this.hasOwnProperty('myObj')) {
- this.myObj = { };
- }
总结:
1, 如果只判断对象是否存在, 推荐使用第五种写法.
2, 如果除了对象是否存在, 还要判断对象是否有 null 值, 推荐使用第一种写法.
3, 除非特殊情况, 所有变量都应该使用 var 命令声明.
4, 为了跨平台, 建议避免使用 Windows 表示顶层对象.
5, 在 JavaScript 语言中, null 和 undefined 容易产生混淆. 在可能同时涉及两者的情况下, 建议使用 "精确比较" 运算符 (===).
来源: http://www.css88.com/qa/javascript/11669.html