javascript - javascript 真实数字
问题描述
基于这些规则:
假的:
- 错误的
- 0(零)
- '' 或 "" (空字符串)
- 无效的
- 未定义
- NaN(例如 1/0 的结果)
真实:其他的一切
我找不到正确解释为什么在以下测试中,只有数字 1 评估为“真”
0 == true ("false")
1 == true ("true")
2 == true ("false")
othernumber == true ("false")
解决方案
“真”和“假”规则仅适用于将值本身用作测试时,例如:
var str = "";
if (str) {
// It's truthy
} else {
// It's falsy
}
==
有自己的,不同的,一组规则来确定其操作数的松散相等性,这些规则在规范的抽象相等比较算法中得到了彻底的解释:
- 如果 Type(x) 与 Type(y) 相同,则
- 返回执行严格等式比较 x === y 的结果。
- 如果 x 为 null 且 y 未定义,则返回 true。
- 如果 x 未定义且 y 为空,则返回 true。
- 如果 Type(x) 是 Number 并且 Type(y) 是 String,则返回比较结果 x == ToNumber(y)。
- 如果 Type(x) 是 String 并且 Type(y) 是 Number,则返回比较结果 ToNumber(x) == y。
- 如果 Type(x) 是 Boolean,则返回比较 ToNumber(x) == y 的结果。
- 如果 Type(y) 是 Boolean,则返回比较结果 x == ToNumber(y)。
- 如果 Type(x) 是 String、Number 或 Symbol 且 Type(y) 是 Object,则返回比较结果 x == ToPrimitive(y)。
- 如果 Type(x) 是 Object 并且 Type(y) 是 String、Number 或 Symbol,则返回比较 ToPrimitive(x) == y 的结果。
- 返回假。
有关其中列出的各种抽象操作的完整详细信息,请参阅规范,尽管名称几乎说明了它们的作用。(如果您查看规范,您会在各个地方看到!
之前的ToNumber
内容;我已经在上面删除了它。这不是逻辑 NOT 运算符,而是与“突然完成”相关的规范符号。)
让我们以您的2 == true
示例为例:
- 类型不一样,继续往下看
- x 不为空,所以继续
- x 不是未定义的,所以继续
- Type(x) 确实是 Number,但 Type(y) 不是 String,所以继续
- Type(x) 不是字符串,所以继续
- Type(x) 不是布尔值,所以继续
- Type(y) 是布尔型,所以返回 x == ToNumber(y) 的结果
- ToNumber(true) 为 1,由于 2 == 1 为假,所以结果为假
但请注意,步骤 7 与您的1 == true
示例不同:
- Type(y) 是布尔型,所以返回 x == ToNumber(y) 的结果
- ToNumber(true) 为 1,由于 1 == 1 为真,所以结果为真
推荐阅读
- json - 在 JSON 中以不同的顺序连接来自名称/值数据的字符串
- sql - 如何使用查询在不同列中找到相同值的出现
- python - 在 Python 中插入主目录的问题
- android - Arch Linux 上的 Genymotion:启动时虚拟设备立即消失
- java - 如何在不崩溃的情况下提取 JSON 信息?
- c++ - C++ curl_easy_perform() 在响应中插入换行符
- javascript - 我将如何在 highcharts 中填充 MAX MIN 项目符号?
- c# - 重用而不从接口转换为类
- java - jQuery。码头:跨域请求
- javascript - 从另一个 ejs 文件加载变量的简单方法?