Оператор in
может сказать вам, существует ли ключ в объекте или любом из объектов в его цепочке прототипов. Функция hasOwnProperty
может сообщить вам, существует ли этот ключ в самом объекте (а не в каком-либо из объектов в его цепочке прототипов).
if ("foo" in obj) {
// `obj` or an ancestor has a key called "foo"
}
if (obj.hasOwnProperty("foo")) {
// `obj` has a key called "foo"
}
В вашем примере, на самом деле не имеет значения, какой из них вы использовали, потому что ваш объект просто Object
({}
=> new Object()
), поэтому он не имеет большой части цепочки прототипов. Но это может быть актуально, например, если вы смотрите на пользовательские свойства, которые вы добавили к другим объектам, например:
var a = [1, 2, 3, 4];
a.foo = "testing";
alert("push" in a); // 1. alerts "true"
alert(a.hasOwnProperty("push")); // 2. alerts "false"
alert("foo" in a); // 3. alerts "true"
alert(a.hasOwnProperty("foo")); // 4. alerts "true"
# 1 выше предупреждает true, потому что все массивы наследуют свойство push
от Array.prototype
(это относится к функции, которая помещает значение в конец массива). # 2 предупреждает false, потому что свойство push
взято из прототипа, а не на самом объекте. № 3 и № 4 предупреждают об истинности, поскольку свойство foo
существует в самом объекте.
примечание
То, что у вас есть, это не JSON, это буквенная нотация объекта Javascript, подмножеством которой является JSON. Вы использовали литерал (как строковый литерал) для создания объекта и присвоили его переменной. Я упоминаю об этом только потому, что объектные литералы могут содержать больше (включая функции) и иметь более широкий синтаксис. Часть в {}
в вашем примере является допустимым JSON, хотя, поскольку вы использовали двойные кавычки как для ключей, так и для значений, нигде не было указано «неопределенное» и не содержало никаких функции. : -)