Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript语法困惑_Javascript - Fatal编程技术网

Javascript语法困惑

Javascript语法困惑,javascript,Javascript,我已经运行了这段代码,我不确定它是如何得到评估和产生结果的。我非常喜欢它的工作方式,这意味着我可以使用第二个代码块运行 function pathInfo(url) { var self = this; self.hasExt = url.indexOf(".") > -1 && url.substring(url.indexOf(".") + 1, url.length); self.ext = self.hasExt ? url.substrin

我已经运行了这段代码,我不确定它是如何得到评估和产生结果的。我非常喜欢它的工作方式,这意味着我可以使用第二个代码块运行

function pathInfo(url) {
    var self = this;
    self.hasExt = url.indexOf(".") > -1 && url.substring(url.indexOf(".") + 1, url.length);
    self.ext = self.hasExt ? url.substring(url.indexOf(".") + 1, url.length) : undefined;
}

console.log(new pathInfo("/hello.html"));
这在Chrome控制台中计算为:

pathInfo { hasExt: "html", ext: "html" }
我期待着:

pathInfo { hasExt: true, ext: "html" }
我确实喜欢它的工作方式,但它是实心的吗?如果是这样,我可以这样做:

function pathInfo(url) {
    this.ext = url.indexOf(".") > -1 && url.substring(url.indexOf(".") + 1, url.length);
}

hasExt
如果
url.indexOf(“.”)>-1
计算为false,则包含false,
url.substring(url.indexOf(“.”+1,url.length)
否则

这就是本例中
&
运算符的含义

但是如果对它进行测试,
hasExt
仍将计算为true,因为它是一个非空字符串

对于
ext
的定义来说,什么更有意义

ext = self.hasExt || undefined;


这是一样的。

hasExt
包含false,如果
url.indexOf(“.”)1
计算为false,则
url.substring(url.indexOf(“.”)+1,url.length)
否则

这就是本例中
&
运算符的含义

但是如果对它进行测试,
hasExt
仍将计算为true,因为它是一个非空字符串

对于
ext
的定义来说,什么更有意义

ext = self.hasExt || undefined;


这是同样的事情。

形式的表达:

expr1 && expr2 && expr3 ... && exprN && exprLast

计算如下:它从左到右计算每个
exprI
;如果为falsy,则该子表达式的值将立即作为整个表达式的值返回。如果所有的
exprI
都是真实的,它将计算
exprLast
并返回其值。

以下形式的表达式:

expr1 && expr2 && expr3 ... && exprN && exprLast
计算如下:它从左到右计算每个
exprI
;如果为falsy,则该子表达式的值将立即作为整个表达式的值返回。如果所有的
exprI
都是truthy,它将计算
exprLast
并返回其值。

JavaScript中的将首先计算左侧,如果它可以转换为
true
(即为truthy),则将计算并返回右侧

官方文件提供了一些示例:

a1 = true && true       // t && t returns true
a2 = true && false      // t && f returns false
a3 = false && true      // f && t returns false
a4 = false && (3 == 4)  // f && f returns false
a5 = "Cat" && "Dog"     // t && t returns Dog
a6 = false && "Cat"     // f && t returns false
a7 = "Cat" && false     // t && f returns false
JavaScript中的将首先计算左侧,如果可以将其转换为
true
(即为truthy),则将计算并返回右侧

官方文件提供了一些示例:

a1 = true && true       // t && t returns true
a2 = true && false      // t && f returns false
a3 = false && true      // f && t returns false
a4 = false && (3 == 4)  // f && f returns false
a5 = "Cat" && "Dog"     // t && t returns Dog
a6 = false && "Cat"     // f && t returns false
a7 = "Cat" && false     // t && f returns false

那么,你的问题到底是什么?关于这段代码到底在做什么的解释@MikeWSo你的问题到底是什么?关于这段代码到底在做什么的解释@MikeWSo它实际上计算表达式并返回它的值,我认为如果表达式中有值,它只会返回一个布尔值substring@No1_Melman要做到这一点,您实际上需要测试:
(url.indexOf(“.”+1
@No1\u Melman从您的帖子历史来看,您似乎更熟悉C。JS和C#之间的一个重要区别是JS的类型要松散得多,这意味着JS表达式不必接受或返回固定类型。这就是JS中允许这种“速记控制结构”的原因,而大多数其他语言都缺少这种结构(尽管很多人认为这是一件好事)。是的,我喜欢:),我喜欢javascript就是因为这个原因:)javascript在这方面就像Lisp;这个习惯用法在Lisp中已经使用了几十年,所以它实际上计算表达式并返回它的值,我认为如果表达式中实际有值,它只会返回一个布尔值substring@No1_Melman要做到这一点,您实际上需要测试:
(url.indexOf(“.”+1
@No1\u Melman从您的帖子历史来看,看来你更熟悉C。JS和C#之间的一个重要区别是JS的类型要松散得多,这意味着JS表达式不必接受或返回固定类型。这就是JS中允许这种“速记控制结构”的原因,而大多数其他语言都缺少这种结构(尽管很多人认为这是一件好事)。是的,我喜欢:),我喜欢javascript就是因为这个原因:)javascript在这方面就像Lisp;这个成语在Lisp中已经使用了几十年。