有哪些方法可以检测JS对象存在属性重复?
发布于 10 年前 作者 chapgaga 11649 次浏览 最后一次编辑是 8 年前 来自 问答

var a={ ‘f2’:{‘name’:‘11’}, ‘f2’:{‘name’:‘12’} }

最后a.f2.name的值是12,如何检测对象中是否存在属性重复呢?

15 回复

赋值的时候用 in 操作符检测一下? 后面的赋值会覆盖前面的

@alsotang in只能看到一个属性,不能检测属性是否出现重复

@chapgaga alsotang 是建议先测一下,再赋值:

> var a = { name:'jack' }
undefined
> 'name' in a
true
> 'name2' in a
false
> 

@leapon 我的目的是为了检测对象中是否出现重复属性,是对现有代码进行检测

你没法定义一个具有两个相同key的object吧

var a={
'f2':{'name':'11'},
'f2':{'name':'12'}
}
console.log(a); // { f2: { name: '12' } }

如果你是拿到这样一个不合法的json,在parse的时候也会报错的。那么问题来了,怎么去定义一个有2个相同属性的object?

Object.hasOwnProperty这个不能玩吗?

@ruanyl 定义有相同属性object,语法是不会报错的,错在语义上,关键如何检测这种异常呢?

@saionjisekai 只能判断是否含有某个属性,不能检测是否包含某个属性两次

var a={
  'f2’:{’name’:’11’},
  'f2’:{’name’:’12’}
}

这个执行完,a变量里面只有一个f2属性了吧,第一个f2属性被覆盖掉了。所以根本不存在包含某个属性两次,也就无法在赋值后进行检测了吧。 最多可以在赋值前进行检测,比如用 in

一个属性怎么会有两个呢?写个demo出来分享一下怎么让一个对象拥有两个重复属性?

引入严格模式:

// test.js
'use strict';
var obj = {
  a: '1',
  a: '2'
};
console.log(obj);

执行node test.js,报错:

SyntaxError: Duplicate data property in object literal not allowed in strict mode

@kakanjau 最后内存中只有一个f2啊,第一个被覆盖了,但是代码中有两个啊,要的是检测代码中出现重复属性啊,如何检测呢?

@bnuhero 呵呵,大赞,不过代码在浏览器中执行,如何检测属性重复呢?

@chapgaga

一样的,加上'use strict';后,如果对象的属性有重复,在浏览器开发者工具的Console中会提示出错信息。

@bnuhero use strict的作用域好像是全局的,在某个函数里使用了use strict,然后在里面放了有重复属性的对象,这个函数没有执行,但是代码执行时也报错了… 看来是全局有效的,呵呵

回到顶部