JS 运算符

原文:[比较运算符 乱炖锅 (norah1to.com)](https://www.norah1to.com/2022/06/13/basic/javascript/comparison-operator/)

比较运算

比较运算符可以简单分为两类:

  • 严格比较
  • 非严格比较

严格比较

<mark>!</mark> 都是严格比较,!<mark></mark> 的结果取反,=== 规则如下:

  • true
    • 都为 null,严格相等
    • 都为 undefined,严格相等
    • 都为 true 或都为 false,严格相等
    • 都是 number 类型并且具有相同的值,严格相等
    • 都是 string 类型并且具有相同的值,严格相等
    • 都引用相同的对象或函数,严格相等
  • false
    • 任意操作数为 NaN不是严格相等
    • 类型不同,不是严格相等
    • 所有其他情况下操作数都不是严格相等的

非严格比较

<mark>, != 是非严格比较,</mark> 比较步骤如下:

  • 类型相同时,使用 [[ #严格比较 ]]验证它们是否严格相等
  • 类型不同时
    • 如果一个操作数为 null 且另一个为 undefined,则它们相等
    • 如果一个值是数字,另一个是其它类型,先将其它类型转为数字,然后比较
    • 如果一个操作数是布尔值,则将两数转换成数字,然后比较
    • 如果一个操作数是一个对象,而另一个操作数是一个数字或字符串,则使用 [[ #对象转换规则 ]]将该对象转换为另一个操作数的类型,然后比较
    • 在以上的其他情况下,操作数都不相等

比较运算符

>=, <=, >, < 都是比较运算符

  • 如果两数都是字符串,按照字典比较
  • 其余的按照 [[ #非严格比较 ]]

加减乘除

+, -, *, / 中,+ 比较特殊

+ 运算时,途中如果遇到字符串,则转换成字符串然后拼接,例如:

1 + 23 + '56' + 7; // '24567'

过程如下:

  • 1 + 23 = 24
  • 24 + '56' = '2456'
  • '2456' + 7 = '24567'

其余运算符会将所有值转为数字然后计算

对象转换规则

在一个对象上:

  • 如果方法 valueOf() 存在,则调用它;如果 valueOf() 返回一个原始值,JS 将这个值转换为字符串(如果本身不是字符串的话),并返回这个字符串结果
  • 如果方法 toString() 存在,则调用它;如果 toString() 返回一个原始值,JS 将这个值转换为字符串(如果本身不是字符串的话),并返回这个字符串结果。需要注意,原始值到字符串的转换
  • 否则,JS 无法从 toString()valueOf() 获得一个原始值,它将抛出一个 TypeError: Cannot convert object to primitive value 无法转换对象为原始值的错误

反向链接


图谱

LeetCodeObsidian我的作品技术蓝色协议(日服)FLCL无职转生~到异世界就拿出真本事~混沌武士2023-06-062023-06-102023-06-132023-07-02Antd NoteBookCPU性能天梯图CSS NoteBookGFWIndexedDB 读写地狱JS 事件循环JS 原型链JS 运算符LaTeX NoteBookLeetCode Rust - 1 - 两数之和LeetCode Rust - 122 - 买卖股票的最佳时机 IILeetCode Rust - 125 - 验证回文串LeetCode Rust - 136 - 只出现一次的数字LeetCode Rust - 189 - 轮转数组LeetCode Rust - 217 - 存在重复元素LeetCode Rust - 242 - 有效的字母异位词LeetCode Rust - 26 - 删除有序数组中的重复项LeetCode Rust - 283 - 移动零LeetCode Rust - 344 - 反转字符串LeetCode Rust - 350 - 两个数组的交集 IILeetCode Rust - 36 - 有效的数独LeetCode Rust - 387 - 字符串中的第一个唯一字符LeetCode Rust - 48 - 旋转图像LeetCode Rust - 66 - 加一LeetCode Rust - 7 - 整数反转LeetCode Rust - 8 - 字符串转换整数 (atoi)Rust NoteBookYAMLcargo 配置hugo-obsidian 元数据解析问题safari 移动端适配发布同步国际邮箱安装 mingw显卡性能天梯图注册日本邮箱科学上网第三方插件配置 Ruby 环境🤖Gmail🤖Netch🤖Obsidian Git🤖Outlook🤖Plugin Proxy🤖epub.js🤖pdf.js🤖yuè - Web 阅读器🤖加速器HomeReact18 diff 算法Vue3 diff 算法Vue3 响应式系统Vue3 渲染流程CssMarkdownReactRustViteVueWebpack下载万代南梦宫启动器下载蓝色协议注册万代南梦宫账号🤖setup CliLeetcode originLeetcode time&space