Обнаружение неопределенного свойства объекта - PullRequest
2613 голосов
/ 26 августа 2008

Как лучше всего проверить, не определено ли свойство объекта в JavaScript?

Ответы [ 41 ]

2 голосов
/ 14 августа 2015

Использование:

Чтобы проверить, если свойство не определено:

if (typeof something === "undefined") {
    alert("undefined");
}

Чтобы проверить, не является ли свойство неопределенным:

if (typeof something !== "undefined") {
    alert("not undefined");
}
2 голосов
/ 21 марта 2018

Вы также можете использовать Прокси, он будет работать с вложенными вызовами, но потребует одну дополнительную проверку:

function resolveUnknownProps(obj, resolveKey) {
  const handler = {
    get(target, key) {
      if (
        target[key] !== null &&
        typeof target[key] === 'object'
      ) {
        return resolveUnknownProps(target[key], resolveKey);
      } else if (!target[key]) {
        return resolveUnknownProps({ [resolveKey]: true }, resolveKey);
      }

      return target[key];
    },
  };

  return new Proxy(obj, handler);
}

const user = {}

console.log(resolveUnknownProps(user, 'isUndefined').personalInfo.name.something.else); // { isUndefined: true }

так что вы будете использовать его как:

const { isUndefined } = resolveUnknownProps(user, 'isUndefined').personalInfo.name.something.else;
if (!isUndefined) {
  // do someting
}
1 голос
/ 28 марта 2017

Я удивлен, что еще не видел этого предложения, но оно приобретает еще большую специфичность, чем тестирование с typeof. Используйте Object.getOwnPropertyDescriptor(), если вам необходимо узнать, было ли свойство объекта инициализировано с помощью undefined или оно никогда не инициализировалось:

// to test someObject.someProperty
var descriptor = Object.getOwnPropertyDescriptor(someObject, 'someProperty');

if (typeof descriptor === 'undefined') {
  // was never initialized
} else if (typeof descriptor.value === 'undefined') {
  if (descriptor.get || descriptor.set) {
    // is an accessor property, defined via getter and setter
  } else {
    // is initialized with `undefined`
  }
} else {
  // is initialized with some other value
}
0 голосов
/ 07 марта 2018

Вы можете использовать функцию Javascript Object следующим образом:

var ojb ={
    age:12
}

if(ojb.hasOwnProperty('name')){
    console.log('property exist and not undefined');
}

Приведенный выше метод возвращает true, если он получил это свойство или свойство, не определенное.

0 голосов
/ 15 июня 2017

Я предполагаю, что вы также захотите проверить, что это или undefined или null. Если это так, я предлагаю:

myVar == null

Это единственный случай, когда double равно очень полезно, так как оно оценивается как true, когда myVar равно undefined или null, но оценивается как false когда это другие значения фальси, такие как 0, false, '' и NaN.

Это действительный код источника для метода Лодаша isNil.

0 голосов
/ 20 апреля 2017

Это, вероятно, единственная явная форма определения, имеет ли существующее имя-свойства явное и предполагаемое значение undefined; который, тем не менее, является типом JS.

"propertyName" in containerObject && ""+containerObject["propertyName"] == "undefined";
>> true \ false

Это выражение будет возвращать true только в том случае, если имя свойства данного контекста существует (верно) и только если его предполагаемое значение явно undefined.

Не будет ложных срабатываний, как с пустыми или пустыми строками, нулями, нулями, так и с пустыми массивами и т. П. Это делает именно это. Проверяет, т.е. проверяет, существует ли имя свойства (в противном случае это будет ложный положительный результат), а затем явно проверяет, является ли его значение undefined, например. неопределенного типа JS В строковой форме представления (буквально «undefined») поэтому == вместо ===, потому что дальнейшее преобразование невозможно. И это выражение вернет true, только если оба, то есть все условия выполнены. например если имя свойства не существует, - оно вернет false. Который является единственным правильным возвращением, так как несуществующие свойства не могут иметь значений, даже не определенных.

Пример:

containerObject = { propertyName: void "anything" }
>> Object { propertyName: undefined } 

// now the testing

"propertyName" in containerObject && ""+containerObject["propertyName"] == "undefined";
>> true

/* which makes sure that nonexistent property will not return a false positive
 * unless it is previously defined  */

"foo" in containerObject && ""+containerObject["foo"] == "undefined";
>> false
0 голосов
/ 23 июля 2018

Появилось в ECMAScript 6 . Теперь мы можем работать с undefined по-новому, используя прокси. Его можно использовать для установки значения по умолчанию для любых несуществующих свойств, чтобы нам не приходилось каждый раз проверять, существует ли оно на самом деле.

var handler = {
  get: function(target, name) {
    return name in target ? target[name] : 'N/A';
  }
};

var p = new Proxy({}, handler);
p.name = 'Kevin';
console.log('Name: ' +p.name, ', Age: '+p.age, ', Gender: '+p.gender)

Выводит текст ниже без получения неопределенного значения.

Name: Kevin , Age: N/A , Gender: N/A
0 голосов
/ 07 апреля 2018

В библиотеке lodash есть несколько маленьких помощников:

isUndefined - проверить, является ли значение равным undefined.

_.isUndefined(undefined) // => true
_.isUndefined(null) // => false

имеет - чтобы проверить, содержит ли объект свойство

const object = { 'a': { 'b': 2 } }

_.has(object, 'a.b') // => true
_.has(object, 'a.c') // => false
0 голосов
/ 18 февраля 2012

Object.hasOwnProperty(o, 'propertyname');

Однако это не просматривает цепочку прототипов.

0 голосов
/ 11 сентября 2018

Простой способ проверить, существует ли ключ, это использовать in

if (key in obj) {
  // do something
} else {
  // create key
}

const obj = {
  0: 'abc',
  1: 'def'
}

const hasZero = 0 in obj

console.log(hasZero) // true
...