如何将布尔对象分配给一个值?

How do I assign a boolean object to a value?

我正在查看布尔对象的工作原理。不能作为参考价值转移。因为价值无法改变。使用 new 运算符有什么用?这个问题可以通过自己创建一个新的布尔对象来解决。但这并没有回答问题,为什么布尔对象中没有 set 函数?创建一个布尔对象对我来说毫无意义。因为你什么也做不了。 除了创建一个新对象,还有其他解决方案吗?布尔对象有什么作用?

let bool=true;
let boolObj=new Boolean(true);
let ref=boolObj;
//set booObj false
console.log(ref.valueOf());//expected out:false

Is there a solution other than creating a new object?

如果问题是您想要一个具有可变布尔状态的对象,那么是的,这就是解决方案:

const boolObj = {flag: true, valueOf() { return this.flag; }};
boolObj.flag = false;
console.log(boolObj.valueOf());

请注意,这里使用的是 boolObj.flag = false;,而不是 boolObj = false;。后者会将 false 存储在 boolObj 中,而不是修改对象的状态。

What's the use of using the new operator?

几乎没有理由创建 Boolean 对象。 Boolean 对象,就像所有原始包装器对象一样,是不可变的。它们的主要目的是提供一种规范机制,通过该机制可以在基元上调用 "methods":

const b = false;
console.log(b.toString()); // "false"

b是原始类型,怎么会有方法呢?答案是:不能。但是当 JavaScript 引擎看到 b.toString 时,它 "promotes" 等效对象的原语,然后从该等效对象获取方法。 (理论上;显然,引擎会尽可能优化对象创建。)这对内置方法意义不大,但您可以添加方法。在 ES5 的严格模式之前,这意味着必须有原语的对象表示:

Object.defineProperty(Boolean.prototype, "example", {
    value() {
        console.log("typeof this = " + typeof this);
        return !this;
    },
    configurable: true,
    writable: true
});

false.example();

这是必要的,因为在 ES5 的严格模式之前,this 总是必须是 "object" 类型(null 或对对象的引用),它不能是原始。从 ES5 的严格模式开始,this 被允许是原始类型:

"use strict";
Object.defineProperty(Boolean.prototype, "example", {
    value() {
        console.log("typeof this = " + typeof this);
        return !this;
    },
    configurable: true,
    writable: true
});

false.example();

我在上面说了 "almost never" 是因为 Boolean 对象有一个用例,但它不是一个很好的用例:三态标志。您可以对不确定状态使用 null,对真实状态使用 new Boolean(true),对错误状态使用 new Boolean(false)。不过,这又不是一个很好的用例。 :-)