mirror of
				https://github.com/robertkrimen/otto
				synced 2025-10-19 19:55:30 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			41 lines
		
	
	
		
			810 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			810 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| package otto
 | |
| 
 | |
| import (
 | |
|     "math"
 | |
| 	"fmt"
 | |
| 	"reflect"
 | |
| )
 | |
| 
 | |
| func toBoolean(value Value) bool {
 | |
| 	if value._valueType == valueBoolean {
 | |
| 		return value.value.(bool)
 | |
| 	}
 | |
|     if value.IsUndefined() {
 | |
|         return false
 | |
|     }
 | |
|     if value.IsNull() {
 | |
|         return false
 | |
|     }
 | |
| 	switch value := value.value.(type) {
 | |
| 	case bool:
 | |
|         return value
 | |
| 	case int, int8, int16, int32, int64:
 | |
|         return 0 != reflect.ValueOf(value).Int()
 | |
| 	case uint, uint8, uint16, uint32, uint64:
 | |
|         return 0 != reflect.ValueOf(value).Uint()
 | |
| 	case float32:
 | |
|         return 0 != value
 | |
| 	case float64:
 | |
|         if math.IsNaN(value) || value == 0 {
 | |
|             return false
 | |
|         }
 | |
|         return true
 | |
| 	case string:
 | |
| 		return 0 != len(value)
 | |
| 	}
 | |
| 	if value.IsObject() {
 | |
| 		return true
 | |
| 	}
 | |
|     panic(fmt.Errorf("toBoolean(%T)", value.value))
 | |
| }
 | 
