value_boolean.go 793 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package otto
  2. import (
  3. "fmt"
  4. "math"
  5. "reflect"
  6. "unicode/utf16"
  7. )
  8. func (value Value) bool() bool {
  9. if value.kind == valueBoolean {
  10. return value.value.(bool)
  11. }
  12. if value.IsUndefined() {
  13. return false
  14. }
  15. if value.IsNull() {
  16. return false
  17. }
  18. switch value := value.value.(type) {
  19. case bool:
  20. return value
  21. case int, int8, int16, int32, int64:
  22. return 0 != reflect.ValueOf(value).Int()
  23. case uint, uint8, uint16, uint32, uint64:
  24. return 0 != reflect.ValueOf(value).Uint()
  25. case float32:
  26. return 0 != value
  27. case float64:
  28. if math.IsNaN(value) || value == 0 {
  29. return false
  30. }
  31. return true
  32. case string:
  33. return 0 != len(value)
  34. case []uint16:
  35. return 0 != len(utf16.Decode(value))
  36. }
  37. if value.IsObject() {
  38. return true
  39. }
  40. panic(fmt.Errorf("toBoolean(%T)", value.value))
  41. }