如何在javascript中更改函数中的布尔值

How to change Bool value within a function in javascript?

本文关键字:函数 布尔值 javascript      更新时间:2023-09-26

基于本教程:链接

这是我的示例代码:

function modifyVar(obj, val) {
  obj.valueOf = obj.toSource = obj.toString = function(){ return val; };
}
function setToFalse(boolVar) {
  modifyVar(boolVar, 'false');
}
var isOpen = true;
setToFalse(isOpen);
console.log('isOpen ' + isOpen); 

如何更改函数中的布尔变量值?可以通过引用传递布尔值吗?提前感谢

有几个问题:

  1. 'false'不是false

  2. 变量通过JavaScript中的值传递。总是因此,setToFalse中的boolVar和您传递给它的isOpen之间没有任何连接。setToFalse(isOpen)的处理方式如下:

    • isOpen的值由确定

    • (与isOpen完全断开)被传递到setToFalse

  3. JavaScript对基元类型有一些有趣的处理:如果你试图像使用对象类型一样使用它们(例如var a = 42; a.toFixed(2);),则该值会被提升为临时对象,使用该对象,然后丢弃该对象。因此,如果objfalse,那么obj.anything = "whatever"最终将是一个无操作,因为一旦行结束,临时存在的对象就会被释放。

您可以通过new BooleanisOpen提升为对象来执行类似的操作,但请注意,它的行为将类似于对象,而不是布尔值:

function modifyVar(obj, val) {
  obj.valueOf = obj.toSource = obj.toString = function(){ return val; };
}
function setToFalse(boolVar) {
  modifyVar(boolVar, false);
}
var isOpen = new Boolean(true); // An object
setToFalse(isOpen);
snippet.log('isOpen ' + isOpen);
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

这是因为isOpen中的值是对对象的引用。因此,当该值作为boolVar传递到setToFalse时,boolVar的值是该引用的副本,因此引用相同的对象。所以这就解决了上面的第二个问题。问题#3通过显式创建对象而不是依赖于隐式行为来解决。

但是,还记得我上面关于它将如何像一个对象(因为它是一个对象)而不是像布尔值的警告吗?这里有一个例子:

function modifyVar(obj, val) {
  obj.valueOf = obj.toSource = obj.toString = function(){ return val; };
}
function setToFalse(boolVar) {
  modifyVar(boolVar, false);
}
var isOpen = new Boolean(true); // An object
setToFalse(isOpen);
snippet.log('isOpen ' + isOpen);
if (isOpen) {
  snippet.log("isOpen is truthy, what the...?!");
} else {
  snippet.log("isOpen is falsey");
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

我们看到:

isOpen falseisOpen是真的,什么。。。?!

因为isOpen包含一个非null对象引用,而非null对象参考总是truthy

我们可以使用它。

var myBoolean = { value: false }
//get
myBoolean.value;
//set
myBoolean.value = true;

您正在传递布尔基元变量isObject。对于基元类型,尝试设置toString方法是没有意义的,因为它不需要(也不使用),因为在ECMAScript规范中已经定义了到字符串转换的规则。

如果你真的想像你正在尝试的那样使用modifyVar函数,你可以使用布尔对象而不是基元:

function modifyVar(obj, val) {
  obj.valueOf = obj.toSource = obj.toString = function(){ return val; };
}
function setToFalse(boolVar) {
  modifyVar(boolVar, 'false');
}
var isOpen = new Boolean(true);
setToFalse(isOpen);
console.log('isOpen ' + isOpen); 

所以答案是:使用new Boolean(true)Object(true)

我不确定,但您在单引号中赋值为false,单引号/双引号中的值将被视为字符串。只需使用modifyVar(boolVar,false);试试看。