До даты есть 3 способа проверить, есть ли у объекта свойство:
- Сравнить с
typeof
а такжеundefined
, - использование
hasOwnProperty
метод. - использование
in
ключевое слово.
Сравнение с typeof
Проверка, является ли тип свойства неопределенным, является одной из наиболее распространенных практик, когда разработчики проверяют, есть ли у объекта свойство.
typeof
функция возвращает строку с именем типа переменной в качестве первого параметра (Boolean
, Object
, undefined
так далее). Поэтому вам нужно будет только сравнить значение свойства, с которым вы хотите "undefined"
,
var myObject = {
hello: "Hey"
};
if("undefined" === typeof(myObject["hello"])){
// The property DOESN'T exists
}else{
// The property exists
}
// Or ...
if(typeof(myObject.hello) === "undefined"){
// The property DOESN'T exists
}else{
// The property exists
}
// Or ...
if(typeof(myObject.hello) !== "undefined"){
// The property exists
}else{
// The property DOESN'T exists
}
Примечание. Если объект имеет свойство со значением неопределенным, typeof
не рекомендуется Чтобы избежать путаницы, используйте hasOwnProperty вместо этого, если вы используете в своих объектах значение undefined вместо null.
hasOwnProperty
У объекта Javascript обычно есть собственный метод hasOwnProperty. Метод hasOwnProperty возвращает логическое значение, указывающее, имеет ли объект указанное свойство в качестве первого параметра.
в отличие от in
оператор, этот метод не проверяет цепочку прототипов объекта.
var myObject = {
hello: "This is my hello string"
};
if(myObject.hasOwnProperty("hello")){
// myObject has the hello property
}else{
// myObject doesn't has hello property
}
// False
var hasPropertyHello = myObject.hasOwnProperty("monkey");
// Use hasOwnProperty in arrays too using the index
["hello"].hasOwnProperty(0); // true
// But no the value
["hello"].hasOwnProperty("hello"); // false
в
Оператор in возвращает true, если указанное свойство находится в указанном объекте. Обратите внимание, что вы можете использовать in
либо в объекте и массивах.
var myObject = {
hello:"Hello message"
};
if("hello" in myObject){
// Hello property exists
}else{
// Hello property exists
}
// False
var isInObject = ("trello" in myObject);
// Use in in arrays too using the index
(0 in ["hello"]); // true
// But not the value
("hello" in ["hello"]); // false
Какой метод быстрее
Если мы действительно хотим узнать, что быстрее, вы заметите разницу только в том случае, если вы работаете с циклом расширения и огромными объектами.
Согласно тестам, сравнение с typeof
кажется, довольно быстро по сравнению с hasOwnProperty
а также in
,
Выполнение предыдущих фрагментов 1000000 (1M) раз показывает, что in
а также hasOwnProperty
методы занимают примерно вдвое больше времени, необходимого для сравнения с typeof
а также undefined
,
Наконец, какой метод я должен использовать? Метод не имеет значения, если вы не работаете с огромными наборами данных. Повеселись