Есть ли способ сделать объект return false в javascript?
var obj = new Object();
console.log(!!obj) // prints "true" even if it empty
Есть ли способ сделать объект return false в javascript?
var obj = new Object();
console.log(!!obj) // prints "true" even if it empty
Нет. Объект, который не имеет назначенных свойств, не считается "пустым".
Тот факт, что переменная содержит экземпляр объекта, достаточно, чтобы заставить javascript обрабатывать переменную как имеющую значение true
, когда выражение требует булевского значения.
Edit
Очевидно, есть некоторые нюансы, которые нужно прояснить, глядя на другие ответы здесь.
null
не является объектом, это отличная нехватка объекта. Этот вопрос относится к объекту, который только что был создан.
Как и в ES8, no, , вы не можете заставить объект оценивать значение false в JavaScript.
В спецификации все логические проверки (? ! if и т.д.) зависит от ToBoolean,
который очень, очень прост:
Если тип ввода является объектом, результат будет истинным. Вопрос не задан. Нет valueOf, нет специального случая.
Невозможно создать объект фальсификации в JavaScript. Только не объекты могут быть ложными.
Иногда вы можете столкнуться с объектно-подобным "материалом", который возвращает false.
Пустая строка, например, используется как объект все время. document.all
- еще один "объект" фальшивки.
Однако это не реальные объекты. Они не могут иметь пользовательские свойства, не могут использоваться в качестве прототипа и не всегда ведут себя как объект, например. typeof или строго равный.
Такое поведение, скорее всего, останется для обратной совместимости.
Нет. Но null
преобразуется в false
.
> typeof(null)
"object"
> null instanceof Object
false
> !!null
false
Чтобы узнать, содержит ли объект какие-либо свойства, используйте (бесстыдно скопированные из Как мне подсчитать атрибуты объекта JavaScript?):
function isEmpty (obj) {
for (var k in obj)
if (obj.hasOwnProperty(k))
return false;
return true;
}
Объект "null" (действительно значение) возвращает false.
var obj = null;
console.log(!!obj);
Если вы хотите проверить, нет ли у него свойств, вы можете попробовать:
var obj = new Object();
var empty = true;
for (var p in obj) {
if (obj.hasOwnProperty(p)) {
empty = false;
break;
}
}
console.log(empty);
Нет.
Не уверен, зачем вам это нужно, но есть способ, которым вы могли бы сделать что-то вроде этого, но это вроде хакки...
var obj = {
toString: function() { return ''; }
};
alert(!! (''+obj));
Я думаю, что при первом !
вы бросаете obj в логическое и отрицаете его значение, что приводит к true
, если obj равно null, а второй !
снова отрицает его.
Мы можем перезаписать Object.prototype.valueOf
, чтобы объект выглядел ложным, когда он принудительно в примитиве, например, во время ==
.
Однако он не будет отображаться как ложный, когда мы вынуждаем его в boolean, используя !!
, поэтому он не работает в общем случае.
var obj = {
valueOf: function () {
return false
}
}
> obj == false
true // Good, we fooled them!
> !!obj
true // Not so good, we wanted false here
> Boolean(obj)
true // Not so good, we wanted false here
В вашем случае
console.log(!obj);
вернет false.
потому что объект или пустой объект всегда правдивый.
В консоли:
> ({})?true:false
< true
Итак, ответ - нет.