如何在javascript中更改函数内的Bool值?
基于本教程: 下面是我的示例代码:如何在javascript中更改函数内的Bool值?,javascript,reference,boolean,Javascript,Reference,Boolean,基于本教程: 下面是我的示例代码: 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 '
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);
如何更改函数中的bool变量值?
是否可以通过引用传递布尔值?
提前感谢我不确定,但您在单引号中赋值为false,带单引号/双引号的值将被视为字符串。只需使用modifyVar(boolVar,false);然后再试。您正在传递布尔基元变量
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);
因此答案是:使用
newboolean(true)
或Object(true)
有几个问题:
'false'
不是false
setToFalse
中的boolVar
和您要传递到它的isOpen
之间没有任何联系setToFalse(isOpen)
的处理方式如下:
- 已确定
的值isOpen
- 该值(与
完全断开)被传递到isOpen
setToFalse
var a=42;a.toFixed(2);
),值将被提升为临时对象,使用该对象,然后丢弃该对象。因此,如果obj
为false
,obj.anything=“whatever”
最终将成为no-op,因为临时存在的对象将在行结束后立即释放new Boolean
将isOpen
升级到一个对象,这样做与您正在做的事情类似,但是请注意,它将像一个对象一样工作,而不是布尔值:
函数修改变量(obj,val){
obj.valueOf=obj.toSource=obj.toString=function(){return val;};
}
函数setToFalse(布尔瓦尔){
modifyVar(boolVar,false);
}
var isOpen=新布尔值(真);//物件
setToFalse(等参);
log('isOpen'+isOpen)代码>
我们可以使用它
var myBoolean = { value: false }
//get
myBoolean.value;
//set
myBoolean.value = true;
不可能。在javascript中,标量参数(如布尔值)通过值传递给函数。所以不能在函数内部更改外部变量。但是你可以从函数中返回新的值,并用它来改变函数外的变量伟大的答案我学到了很多!但是如果我想检查If语句中的isOpen值,我应该怎么做呢?好的,我发现它。。。我需要在if语句中使用valueOf()方法。感谢您像var changeBool=function(obj,prop,value){obj[prop]=value;}var-sampleObj={someBool:true};changeBool(sampleObj,'someBool',false);console.log(sampleObj.someBool);有人能比较一下被接受的和这个的区别吗?