Javascript AngularJS:ng show=";“用户”;假,ng show=";!!“用户”;真的?

Javascript AngularJS:ng show=";“用户”;假,ng show=";!!“用户”;真的?,javascript,angularjs,Javascript,Angularjs,我在当前范围内有一个用户,由我的当前控制器设置 $scope.user = user; 基于此用户的存在选择性地显示/隐藏并不像我预期的那样工作,而是引发了异常 不起作用:ng show=“user” ng show发生了什么,导致ng show=“user”不真实 我使用的是来自的angular.1.2.6 引发异常: 如果我使用ng show=“user”,则在控制台中会出现以下异常: TypeError: Cannot convert object to primitive value

我在当前范围内有一个用户,由我的当前控制器设置

$scope.user = user;
基于此用户的存在选择性地显示/隐藏
并不像我预期的那样工作,而是引发了异常

不起作用:
ng show=“user”

ng show发生了什么,导致
ng show=“user”
不真实

我使用的是来自的
angular.1.2.6

引发异常:

如果我使用
ng show=“user”
,则在控制台中会出现以下异常:

TypeError: Cannot convert object to primitive value
    at Ma (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js:14:240)
    at Object.<anonymous> (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js:185:464)
    at Object.applyFunction [as fn] (<anonymous>:778:50)
    at h.$digest (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js:99:211)
    at h.$delegate.__proto__.$digest (<anonymous>:844:31)
    at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js:101:256
    at e (https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js:33:182)
    at https://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js:36:378 

这个!!运算符基本上将JS对象转换为布尔值

请查看以下示例:

function myCtrl($scope) {
    $scope.user = 'false';
    $scope.boolean = !!$scope.user;
}
我们创建一个用户对象,例如包含字符串false,通过调用!!操作人员由于$scope.user的值不为null,因此!!运算符将其转换为true。但是,angular会将字符串“false”转换为布尔值false,从而隐藏div

我们可以通过以下方式对此进行测试:

<div ng-controller="myCtrl">
    <div ng-show="boolean">
        test boolean
    </div>

    <div ng-show="user">
        test user
    </div>

    <span>{{boolean}}</span>
</div>

@编辑

因为我们讨论的是用户对象而不是字符串,正如您收到的错误消息所述,所以!!转换为布尔值(=原语)是否适合您。

请记住,期望表达式求值,并将使用此函数“转换”为布尔值:

function toBoolean(value) {
  if (typeof value === 'function') {
    value = true;
  } else if (value && value.length !== 0) {
    var v = lowercase("" + value);
    value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]');
  } else {
    value = false;
  }
  return value;
}


所以你不应该只使用一个对象。您可以继续使用
!!用户
或者可能是
user.someattr

您可以提供一个失败的示例。似乎对我有用<代码>$scope.user正在Google+oauth2回调上设置,我无法在JSFIDLE/PLUNK上复制该回调etc@hassassin-在问题中添加了
TypeError
例外:期望非null对象计算为truthy是否不安全?老实说,这是我第一次看到这个错误!谢谢-我没有意识到这一点!虽然它检查了非Null,但我想知道是否有必要进行额外的
if(typeof value==='object')
检查?
function myCtrl($scope) {
    $scope.user = 'false';
    $scope.boolean = !!$scope.user;
}
<div ng-controller="myCtrl">
    <div ng-show="boolean">
        test boolean
    </div>

    <div ng-show="user">
        test user
    </div>

    <span>{{boolean}}</span>
</div>
test boolean
true
function toBoolean(value) {
  if (typeof value === 'function') {
    value = true;
  } else if (value && value.length !== 0) {
    var v = lowercase("" + value);
    value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]');
  } else {
    value = false;
  }
  return value;
}