Может ли объект быть ложным?
Есть ли способ сделать объект return false в javascript?
var obj = new Object();
console.log(!!obj) // prints "true" even if it empty
Ответы
Ответ 1
Нет. Объект, который не имеет назначенных свойств, не считается "пустым".
Тот факт, что переменная содержит экземпляр объекта, достаточно, чтобы заставить javascript обрабатывать переменную как имеющую значение true
, когда выражение требует булевского значения.
Edit
Очевидно, есть некоторые нюансы, которые нужно прояснить, глядя на другие ответы здесь.
null
не является объектом, это отличная нехватка объекта. Этот вопрос относится к объекту, который только что был создан.
Ответ 2
Как и в ES8, no, , вы не можете заставить объект оценивать значение false в JavaScript.
В спецификации все логические проверки (? ! if и т.д.) зависит от ToBoolean,
который очень, очень прост:
- False, если undefined, null, false, ноль, NaN или пустая строка.
- Верно для всего остального (Object, Proxy, Symbol и т.д.)
Если тип ввода является объектом, результат будет истинным. Вопрос не задан. Нет valueOf, нет специального случая.
Невозможно создать объект фальсификации в JavaScript.
Только не объекты могут быть ложными.
Иногда вы можете столкнуться с объектно-подобным "материалом", который возвращает false.
Пустая строка, например, используется как объект все время. document.all
- еще один "объект" фальшивки.
Однако это не реальные объекты.
Они не могут иметь пользовательские свойства, не могут использоваться в качестве прототипа и не всегда ведут себя как объект, например. typeof или строго равный.
Такое поведение, скорее всего, останется для обратной совместимости.
Ответ 3
Нет. Но 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;
}
Ответ 4
Объект "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);
Ответ 5
Нет.
Не уверен, зачем вам это нужно, но есть способ, которым вы могли бы сделать что-то вроде этого, но это вроде хакки...
var obj = {
toString: function() { return ''; }
};
alert(!! (''+obj));
Ответ 6
Я думаю, что при первом !
вы бросаете obj в логическое и отрицаете его значение, что приводит к true
, если obj равно null, а второй !
снова отрицает его.
Ответ 7
Мы можем перезаписать 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
Ответ 8
В вашем случае
console.log(!obj);
вернет false.
потому что объект или пустой объект всегда правдивый.
Ответ 9
В консоли:
> ({})?true:false
< true
Итак, ответ - нет.