如何为值分配布尔对象?

时间:2019-09-07 13:57:20

标签: javascript object boolean pass-by-reference pass-by-value

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

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

1 个答案:

答案 0 :(得分:3)

  

除了创建新对象之外,还有其他解决方案吗?

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

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

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

  

使用new运算符有什么用?

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

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

b是一个原语,那么它怎么有方法呢?答案是:不能。但是,当JavaScript引擎看到b.toString时,它将“原语”提升为等效对象,然后从该等效对象获取方法。 (理论上;显然,引擎会尽可能地优化对象的创建。)这对于内置方法并没有多大意义,但是您可以添加方法。在采用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();

我在上面说“几乎从不”是因为Boolean对象有一个用例,但这不是一个很好的用例:三态标志。您可以将null用于不确定状态,将new Boolean(true)用于真实状态,将new Boolean(false)用于错误状态。同样,这不是一个很好的用例。 :-)