为啥表达式逻辑表达式`product.id === +id;`中的加号? [复制]

Posted

技术标签:

【中文标题】为啥表达式逻辑表达式`product.id === +id;`中的加号? [复制]【英文标题】:Why the plus sign in the expression logical expression `product.id === +id;`? [duplicate]为什么表达式逻辑表达式`product.id === +id;`中的加号? [复制] 【发布时间】:2018-08-08 23:10:50 【问题描述】:

查看 javascript 表达式:

return product.id === +id;

我以前从未在像这样的变量前面看到过+ 符号...有什么想法吗?

【问题讨论】:

查看 javascript 中的类型强制 - 甚至是一元 + 不,不管product.id是什么,它都会把它变成一个数字。 这基本上是一种“强迫” JS 做正确事情的愚蠢方式。写这篇文章的人使用=== 来确保JS 确实 使用强制,然后他们立即强制它使用强制表达式将id 的值强制为一个数字。正确的意向代码等效项是 product.id === parseInt(id, 10); 实际上你会 parseFloat 而不是 parseInt 是(几乎)等价的,因为一元 + 不会产生整数,它会产生一个数字 - 除了 +"123bob" === NaNpareFloat("123bob") === 123 - 所以它不是 @987654330 @它是similar but not the same parseFloat 仅在产品标识符使用小数值的情况下才有意义。这几乎是不可能的,所以:这里明显的选择是parseInt(id, 10),但根据上下文,它也可能parseFloat(id) 【参考方案1】:

如果成功,它将变量转换为数字:+id 等于 Number(id)。如果转换失败,则返回 NaN

【讨论】:

【参考方案2】:

变量前面的加号称为Unary Operator,用于将变量转换为数字。如果值为数字,则运算结果为数字,否则为NaN

您可以将+ 运算符的功能大致等同于parseFloat。但是请注意,前者只能解析数字字符串,而后者可以提取数字值,即使它后面跟着另一个不是数字的值。

示例:

var a = "0x";

console.log("Unary Operator:", +a);
console.log("parseFloat:", parseFloat(a, 16));

在您的特定情况下,它用于确保如果转换为数字,id 严格等于product.id。如果id 不是数字,该函数将返回false,因为product.id != NaN,即使product.id 本身等于NaN

示例:

var
  id1 = 13,
  id2 = "13",
  id3 = "a13";

console.log("number:", id1);
console.log("numeric string:", +id2);
console.log("non-numeric string:", +id3);
console.log("NaN !== NaN:", +id3 !== +id3);

请注意:

尽管NaN 的字面意思是"Not a Number",但如果您使用typeof NaN,结果将是"number",即使NaN 不是数学意义上的数字。


相关话题:

What is the purpose of a plus symbol before a variable?

Explain +var and -var unary operator in javascript

What's the significant use of unary plus and minus operators?

【讨论】:

以上是关于为啥表达式逻辑表达式`product.id === +id;`中的加号? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

逻辑表达式:为啥“str1 in str2 or str2 not in str1”为我的打印语句返回 True?

为啥 JavaScript 中没有逻辑异或?

为啥在verilog中要定义wire?

HPCC-ECL 逻辑运算符 - 为啥 OR 不短路?

为啥在三元函数中分配给数组类型的表达式失败

为啥这个表达不统一