前端JavaScript基础训练系列一百零五:ToBoolean

从 ES5 开始,使用 Object.create(null) 创建的对象 [[Prototype]] 属性为 null,并且没 有 valueOf() 和 toString() 方法,因此无法进行强制类型转换。详情请参考本系列的《你 不知道的 JavaScript(上卷)》“this 和对象原型”部分中 [[Prototype]] 相关部分。
我们稍后将详细介绍数字的强制类型转换,在下面的示例代码中我们假定 Number(…) 已经实现了此功能。
例如:

    var a = {
         valueOf: function(){
             return "42";
         }
};
     var b = {
         toString: function(){
             return "42";
         }
};
     var c = [4,2];
     c.toString = function(){
         return this.join( "" ); // "42"
     };
  Number( a );
Number( b );
Number( c );
Number( "" );
Number( [] );
Number( [ "abc" ] );
// 42
// 42
// 42
// 0
// 0
// NaN

ToBoolean

下面介绍布尔值,关于这个主题存在许多误解和困惑,需要我们特别注意。
首先,也是最重要的一点是,JavaScript 中有两个关键词 true 和 false,分别代表布尔类 型中的真和假。我们常误以为数值 1 和 0 分别等同于 true 和 false。在有些语言中可能 是这样,但在 JavaScript 中布尔值和数字是不一样的。虽然我们可以将 1 强制类型转换为 true,将 0 强制类型转换为 false,反之亦然,但它们并不是一回事。

  1. 假值(falsy value) 我们再来看看其他值是如何被强制类型转换为布尔值的。
    强制类型转换 | 53
    JavaScript 中的值可以分为以下两类: (1) 可以被强制类型转换为 false 的值
    (2) 其他(被强制类型转换为 true 的值)
    JavaScript 规范具体定义了一小撮可以被强制类型转换为 false 的值。
    ES5 规范 9.2 节中定义了抽象操作 ToBoolean,列举了布尔强制类型转换所有可能出现的 结果。
    以下这些是假值:
    • undefined
    • null
    • false
    • +0、-0 和 NaN
    • “”
    假值的布尔强制类型转换结果为 false。
    从逻辑上说,假值列表以外的都应该是真值(truthy)。但 JavaScript 规范对此并没有明确 定义,只是给出了一些示例,例如规定所有的对象都是真值,我们可以理解为假值列表以 外的值都是真值。
  2. 假值对象(falsy object) 这个标题似乎有点自相矛盾。前面讲过规范规定所有的对象都是真值,怎么还会有假值对 象呢?
    有人可能会以为假值对象就是包装了假值的封装对象(如 “”、0 和 false), 实际不然。
    这只是规范开的一个小玩笑。
    例如:
     var a = new Boolean( false );
     var b = new Number( 0 );
     var c = new String( "" );

它们都是封装了假值的对象(参见第 3 章)。那它们究竟是 true 还是 false 呢?答案很简单: 54 | 第4章

var d = Boolean( a && b && c );
d; // true
d 为 true,说明 a、b、c 都为 true

请注意,这里Boolean(…)对a && b && c进行了封装,有人可能会问为什 么。我们暂且记下,稍后会作说明。你可以试试不用 Boolean(…) 的话 d = a && b && c 会产生什么结果。
如果假值对象并非封装了假值的对象,那它究竟是什么?
值得注意的是,虽然 JavaScript 代码中会出现假值对象,但它实际上并不属于 JavaScript 语 言的范畴。
浏览器在某些特定情况下,在常规 JavaScript 语法基础上自己创建了一些外来(exotic) 值,这些就是“假值对象”。
假值对象看起来和普通对象并无二致(都有属性,等等),但将它们强制类型转换为布尔 值时结果为 false。
最常见的例子是 document.all,它是一个类数组对象,包含了页面上的所有元素,由 DOM(而不是 JavaScript 引擎)提供给 JavaScript 程序使用。它以前曾是一个真正意义上 的对象,布尔强制类型转换结果为 true,不过现在它是一个假值对象。
document.all 并不是一个标准用法,早就被废止了。 有人也许会问:“既然这样的话,浏览器能否将它彻底去掉?”这个想法是好的,只不过
仍然有很多 JavaScript 程序在使用它。
那为什么它要是假值呢?因为我们经常通过将 document.all 强制类型转换为布尔值(比如 在 if 语句中)来判断浏览器是否是老版本的 IE。IE 自诞生之日起就始终遵循浏览器标准, 较其他浏览器更为有力地推动了 Web 的发展。
if(document.all) { /* it’s IE */ } 依然存在于许多程序中,也许会一直存在下去,这对 IE 的用户体验来说不是一件好事。
虽然我们无法彻底摆脱 document.all,但为了让新版本更符合标准,IE 并不打算继续支持 if (document.all) { … }。
“那我们应该怎么办?”
“也许可以修改 JavaScript 的类型机制,将 document.all 作为假值来处理!”

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值