Javascript &引用||&引用;为变量赋值时,运算符不工作

Javascript &引用||&引用;为变量赋值时,运算符不工作,javascript,Javascript,这个代码有什么问题 var sha = 6; var secondParameter = dan || sha; alert(secondParameter); 我在很多浏览器上都试过了。没有警报。 如果我像这样添加var dan: var sha = 6; var dan = 5; var secondParameter = dan || sha; alert(secondParameter); function funcWithCallback(callback){ callb

这个代码有什么问题

var sha = 6;
var secondParameter = dan || sha;
alert(secondParameter);
我在很多浏览器上都试过了。没有警报。 如果我像这样添加var dan:

var sha = 6;
var dan = 5;
var secondParameter = dan || sha;
alert(secondParameter);
function funcWithCallback(callback){
     callback = callback || function(){};
     callback();
}
警报将发生。所以“| |”中的问题。我看到很多代码都是这样使用操作符的!所以我不知道

var sha = 6;
var dan = null;
var secondParameter = dan || sha;
alert(secondParameter);

试试这个。您可以使用
|
运算符进行合并,但必须声明所有变量才能引用您没有定义
dan
。执行在该错误处停止。检查浏览器控制台是否存在错误

当您定义
dan
时,执行将继续,但这可能不是您想要的

JavaScript中此类代码的目的是说明如果
dan
有一个falsy值(计算为
false
值的任何值,即
0
'
null
false
未定义的
NaN
),则使用
sha
的值

如果定义
dan
超出了您的职责范围(即其他脚本应该设置它),那么您可以使用如下构造检查它是否存在:

secondParameter=typeof(dan)==“未定义”?沙:丹,

(未经测试,希望它能起作用。)无论如何,它应该会给你一个想法)


此外,这个问题可能会让您更深入地了解:

这是在以下情况下使用的:它作为类似于参数的形式给出,但没有指定值,或者它是
falsy

falsy
0、false、null或未定义

例如:

var sha = 6;
var dan = undefined;
var secondParameter = dan || sha;
alert(secondParameter);
您将获得
6

一个很好的例子是:

var sha = 6;
var dan = 5;
var secondParameter = dan || sha;
alert(secondParameter);
function funcWithCallback(callback){
     callback = callback || function(){};
     callback();
}
在本例中,如果回调未定义(或
falsy
),则将回调设置为函数的新实例


在这样的情况下使用它将确保没有错误解释:它的工作方式是:如果第一个条件为false,那么它将检查第二个条件。因此,为了显示第二个参数,必须将第一个参数设为null。

JavaScript处理未声明变量(未定义变量)和未定义值的方式有所不同。在下面的示例中,变量
dan
被声明但从未设置,因此它的值是
undefined
the | |返回它可以找到的第一个
true
值,因此如果我传递的不是空字符串、0、false、NaN、undefined或NULL,它将控制台记录传递的值。否则它将记录“默认值”

检查是否传递了变量的更可靠方法是查看变量的值是否未定义:

function test(dan){
  dan = (typeof(dan)==='undefined')?"default value":dan;
}
在您的示例中,根本没有声明变量
dan
(变量未定义),这就是为什么会出现错误“dan未定义”,因为根本没有声明dan

function test(){
  return dan===undefined;//ReferenceError: dan is not defined
}
console.log(test());
您可以将代码更改为:

var sha = 6, dan;//dan is declared here but no value is set
var secondParameter = dan || sha;
console.log(dan===undefined);//true
console.log(secondParameter);//6
如果要检查某个对象是否具有属性,则它不会抛出错误:

function test(){
  return window.neverSetOrDeclared===undefined;
}
console.log(test());//true
当您尝试检查undefined或null属性时,它将引发错误:

null.something//throws error
undefined.something//throws error
window.neverSetOrDeclared===undefined//throws error


未定义dan
。查看错误控制台。尝试访问未定义的变量会导致错误。未定义的变量和具有未定义值的变量之间存在很大差异。据我所知,以这种方式使用“| |”的唯一目的是在未定义“dan”时将“sha”指定给“secondParameter”。顺便说一句,当丹(定义)为假值时,问题是一样的。@dannyalkhald:不,问题不存在了。顺便说一句,您不需要将其设置为null,只需
var-dan就足够了。我在问之前试了两个版本。两个都不行。好吧,现在我明白了。问题是我没有使用“var”关键字。@dannyalkhald您应该在这里提供更多的上下文。添加“var”时要小心,因为它为当前范围重新定义了dan,并隐藏了任何现有的dan,重点是:仅仅添加关键字可能不是正确的解决方案,尝试了解变量/作用域在Javascript中的行为我知道var定义了变量的作用域,但我不知道它在这种情况下的重要性。Javascript允许您显式地将
未定义的
分配给变量,从而消除了这种混淆,这不同于一开始不定义变量。这回答了问题吗?我更详细地解释了你可以使用它的情况。代码的问题是,
dan
根本没有定义,这就是答案,但这很简单。如果我使用一个对象作为函数参数,比如这个函数:函数da(d){this.a=d.a | | 5;}它会工作吗?@SmartLemon很棒!这正是我想使用“| |”运算符的情况。直接将变量与“未定义”进行比较是不安全的,因为在某些情况下,未定义本身可以分配给其他对象,在这种情况下,这些检查将失败。更好的方法是用typeof操作符检查:typeof(dan)=='undefined'@BuddhiP您是对的,但谁会在他们正常的头脑中重新定义undefined或window?一种解决方法是像jQuery一样:(函数(窗口,未定义){your code})(窗口);如果您要让任何人(甚至是那些重新定义了window和/或udefined的人)使用一个库,那么您可以给出一个有效的点。如果没有声明dan(未定义的变量),typeof(dan)不会抛出错误。因此示例代码的行为将不同。当未定义
dan
时,它不会抛出错误,是的,在“正确的头脑”中没有人会这样做,但正确的头脑是一个相对的术语:)。一些程序员编写的代码与(undefined==varname)相同(在其他语言中编写if(null==var)以防止意外赋值),但在这些情况下,他们可能会导致JS(undefined=varname)中的意外赋值,bcs JS不会阻止赋值给“undefined”。。这是打破僵局的一种方式。无论如何,我的观点是最好是安全的实际上,我试图使用“| |”而不是三元运算符。现在我知道什么时候使用它们了。谢谢