我正在查看布尔对象的工作原理。不能用作参考值传输。因为值无法更改。使用new运算符有什么用?可以通过自己创建一个新的布尔对象来解决该问题。但这并不能回答问题,为什么布尔对象中没有set函数?创建布尔对象对我没有任何意义。因为你无能为力。 除了创建新对象之外,还有其他解决方案吗?布尔对象有什么作用?
let bool=true;
let boolObj=new Boolean(true);
let ref=boolObj;
//set booObj false
console.log(ref.valueOf());//expected out:false
答案 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)
用于错误状态。同样,这不是一个很好的用例。 :-)