如何在javascript中更改函数中的布尔值
How to change Bool value within a function in javascript?
基于本教程:链接
这是我的示例代码:
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);
如何更改函数中的布尔变量值?可以通过引用传递布尔值吗?提前感谢
有几个问题:
-
'false'
不是false
。 -
变量通过JavaScript中的值传递。总是因此,
setToFalse
中的boolVar
和您传递给它的isOpen
之间没有任何连接。setToFalse(isOpen)
的处理方式如下:-
isOpen
的值由确定 -
值(与
isOpen
完全断开)被传递到setToFalse
-
-
JavaScript对基元类型有一些有趣的处理:如果你试图像使用对象类型一样使用它们(例如
var a = 42; a.toFixed(2);
),则该值会被提升为临时对象,使用该对象,然后丢弃该对象。因此,如果obj
是false
,那么obj.anything = "whatever"
最终将是一个无操作,因为一旦行结束,临时存在的对象就会被释放。
您可以通过new Boolean
将isOpen
提升为对象来执行类似的操作,但请注意,它的行为将类似于对象,而不是布尔值:
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);试试看。
- 类型错误:布尔值不是 Angular 中登录函数的函数
- Window.open不工作,布尔值不是函数
- 如何使用与之前调用的布尔值相反的函数调用函数
- 如何从代码隐藏将布尔值传递给 JavaScript 函数
- 聚合物 如何使用条件根据函数返回的布尔值显示不同的元素
- 每当布尔值在 JavaScript 中变为 false 时调用函数
- jQuery 滚动函数在每个滚动上都预置,尽管有布尔值
- 当函数在 Javascript 中将其设置为 true 时,布尔值返回 false
- 未捕获的类型错误:布尔值不是完整日历中 ajax 调用的函数
- 如何在javascript中更改函数中的布尔值
- 将函数数组作为布尔值数组返回
- 为什么布尔值在退出函数后会发生变化
- 仅当布尔值为true时才运行JavaScript函数
- ajax从C#函数T4MVC中获取布尔值
- 如何在布尔值更改时运行函数
- 为什么要!函数之前不返回布尔值相反的值
- 为什么我的函数返回“未定义”而不是布尔值
- JavaScript函数发送字符串但接收布尔值
- 只有当变量(布尔值)改变时才调用javascript/jquery函数
- 将函数的默认参数设置为布尔值的正确方法