这个Javascript函数返回什么?
该功能可在本网站上找到: input.peek()确实返回某种类型的令牌对象。但是这个Javascript函数返回什么?,javascript,expression,Javascript,Expression,该功能可在本网站上找到: input.peek()确实返回某种类型的令牌对象。但是最终返回的是什么Truefalse还是对象本身? 为什么tok在返回表达式中出现两次,一次出现在返回表达式的开头,第二次出现在返回表达式的结尾?它返回对象,或者返回false tok在表达式中出现两次,因为一些讨厌其他人能够读取其代码的smarty pants开发人员需要能够在最后返回tok,并计算它的.value属性 这里有一个合理的重写,以便除原始开发人员以外的所有人都可以阅读: function is_op(
最终返回的是什么True
false
还是对象本身?
为什么
tok
在返回表达式中出现两次,一次出现在返回表达式的开头,第二次出现在返回表达式的结尾?它返回对象,或者返回false
tok
在表达式中出现两次,因为一些讨厌其他人能够读取其代码的smarty pants开发人员需要能够在最后返回tok
,并计算它的.value
属性
这里有一个合理的重写,以便除原始开发人员以外的所有人都可以阅读:
function is_op(op) {
var tok = input.peek();
return tok && tok.type == "op" && (!op || tok.value == op) && tok;
}
同时
开发人员本可以写这行:
//if tok is false
if(!tok) {
return false;
}
if(tok.type !== 'op') {
return false;
}
//if op is defined and tok.value is not the same as op
if(op && tok.value != op) {
return false;
}
//tok.type == 'op' and tok.value == op, if it was defined
return tok;
这样他就不必检查tok
一开始是否为false-y:
var tok = input.peek() || {};
但是一个纯粹主义者也会说行(
input.peek()|{}
)也不必要地分配了一个对象….它返回对象,或者返回false
tok
在表达式中出现两次,因为一些讨厌其他人能够读取其代码的smarty pants开发人员需要能够在最后返回tok
,并计算它的.value
属性
这里有一个合理的重写,以便除原始开发人员以外的所有人都可以阅读:
function is_op(op) {
var tok = input.peek();
return tok && tok.type == "op" && (!op || tok.value == op) && tok;
}
同时
开发人员本可以写这行:
//if tok is false
if(!tok) {
return false;
}
if(tok.type !== 'op') {
return false;
}
//if op is defined and tok.value is not the same as op
if(op && tok.value != op) {
return false;
}
//tok.type == 'op' and tok.value == op, if it was defined
return tok;
这样他就不必检查tok
一开始是否为false-y:
var tok = input.peek() || {};
但是一个纯粹主义者也会说,行(
input.peek()|{}
)也不必要地分配了一个对象….如果令牌(AST节点)是操作类型(缩写为“op”)并且它匹配传入的操作类型(参数op
),那么函数的目的就是返回令牌本身
如果没有传入op
参数,该函数只会检查令牌是否为任何类型的“op”
如果不满足条件,则返回false
将tok
添加到布尔表达式末尾的原因是返回tok
而不是true,这是满足所有条件时最后一次计算的结果
这是一个更可读的版本
//if toke.type is 'op' and tok has a non-false-y value that is equal to op, return it
return tok.type == 'op' && (!op || tok.value == op) && tok.value == op && tok;
由于在函数(input
)中使用globals是一种不好的做法,而且函数名是xxx,应该返回一个布尔值,因此我会重新编写函数以返回一个布尔值,然后传入标记。然后这个表达看起来更容易理解
function is_op(op) {
var tok = input.peek();
if (!tok || tok.type !== "op") {
return false;
}
if (op && tok.value !== "op") {
return false
}
return tok;
}
那么调用方就已经有了对令牌的引用
function is_op(tok, op) {
return tok && tok.type == "op" && (!op || tok.value == op);
}
如果令牌(AST节点)属于操作类型(缩写为“op”),并且它与传入的操作类型(参数
op
匹配),则函数的目的是返回令牌本身
如果没有传入op
参数,该函数只会检查令牌是否为任何类型的“op”
如果不满足条件,则返回false
将tok
添加到布尔表达式末尾的原因是返回tok
而不是true,这是满足所有条件时最后一次计算的结果
这是一个更可读的版本
//if toke.type is 'op' and tok has a non-false-y value that is equal to op, return it
return tok.type == 'op' && (!op || tok.value == op) && tok.value == op && tok;
由于在函数(input
)中使用globals是一种不好的做法,而且函数名是xxx,应该返回一个布尔值,因此我会重新编写函数以返回一个布尔值,然后传入标记。然后这个表达看起来更容易理解
function is_op(op) {
var tok = input.peek();
if (!tok || tok.type !== "op") {
return false;
}
if (op && tok.value !== "op") {
return false
}
return tok;
}
那么调用方就已经有了对令牌的引用
function is_op(tok, op) {
return tok && tok.type == "op" && (!op || tok.value == op);
}
当
op
未定义时,我不认为您的第一个代码是等价的(!op | | tok.value==op)
@JuanMendes-op从未显示op
的定义位置,因此我假设它是在上面某个地方定义的,可能通过var op使用undefined
的值
op
是传递到函数中的参数,如果您不传入它,它就不必检查tok.value==“op”
如果op
未定义,我认为您的第一个代码是不等价的(!op | | tok.value==op)
@JuanMendes-op从未显示op
的定义位置,因此我假设它是在上面某个地方定义的,可能通过var op使用undefined
的值
op
是传递到函数中的参数,如果不传入,则不必检查tok.value==“op”
是否返回第一个伪值或最后一个伪值。例如,如果tok
是falsy,它将返回该值。如果tok.type==“op”
为false
,它将返回该值,以此类推。它将返回第一个假值或最后一个真值。例如,如果tok
是falsy,它将返回该值。如果tok.type==“op”
为false
,它将返回该值,以此类推。