详解一下 javascript 中的比较

稿件来源: 阳光企业网站管理系统   撰稿作者: 阳光企业网站管理系统   发表日期: 2015-09-29   阅读次数: 96   查看权限: 游客查看

详解一下 javascript 中的比较

翻译自:http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

11.9.3 抽象相等比较算法

比较运算 x==y, 其中 xy 是值,产生 true 或者 false。这样的比较按如下方式进行:

  1. Type(x)Type(y) 相同, 则
    1. Type(x)Undefined, 返回 true
    2. Type(x)Null, 返回 true
    3. Type(x)Number, 则
      1. xNaN, 返回 false
      2. yNaN, 返回 false
      3. xy 为相等数值, 返回 true
      4. x+0y−0, 返回 true
      5. x−0y+0, 返回 true
      6. 返回 false
    4. Type(x)String, 则当 xy 为完全相同的字符序列(长度相等且相同字符在相同位置)时返回 true。 否则, 返回 false
    5. Type(x)Boolean, 当 xy 为同为 true 或者同为 false 时返回 true。 否则, 返回 false
    6. xy 为引用同一对象时返回 true。否则,返回 false
  2. xnullyundefined, 返回 true
  3. xundefinedynull, 返回 true
  4. Type(x)NumberType(y)String, 返回 comparison x == ToNumber(y) 的结果。
  5. Type(x)StringType(y)Number
  6. 返回比较 ToNumber(x) == y 的结果。
  7. Type(x)Boolean, 返回比较 ToNumber(x) == y 的结果。
  8. Type(y)Boolean, 返回比较 x == ToNumber(y) 的结果。
  9. Type(x)StringNumber,且 Type(y)Object,返回比较 x == ToPrimitive(y) 的结果。
  10. Type(x)ObjectType(y)StringNumber, 返回比较 ToPrimitive(x) == y 的结果。
  11. 返回 false

注:按以上相等之定义:

  • 字符串比较可以按这种方式强制执行: "" + a == "" + b
  • 数值比较可以按这种方式强制执行: +a == +b
  • 布尔值比较可以按这种方式强制执行: !a == !b

注:等值比较操作保证以下不变:

  • A != B 等价于 !(A==B)
  • A == B 等价于 B == A,除了 A 与 B 的执行顺序。

注:相等运算符不总是传递的。 例如,两个不同的 String 对象,都表示相同的字符串值;== 运算符认为每个 String 对象都与字符串值相等,但是两个字符串对象互不相等。例如:

  • new String("a") == "a""a" == new String("a") 皆为 true
  • new String("a") == new String("a")false

字符串比较使用的方式是简单地检测字符编码单元序列是否相同。不会做更复杂的、基于语义的字符或者字符串相等的定义以及 Unicode 规范中定义的 collating order。所以 Unicode 标准中认为相等的 String 值可能被检测为不等。实际上这一算法认为两个字符串已经是经过规范化的形式。

11.9.6 严格等于比较算法

比较 x===yxy 为值,需要产出 truefalse。比较过程如下:

  1. 如果 Type(x)Type(y) 的结果不一致,返回 false,否则
  2. 如果 Type(x) 结果为 Undefined,返回 true
  3. 如果 Type(x) 结果为 Null,返回 true
  4. 如果 Type(x) 结果为 Number,则
    1. 如果 xNaN,返回 false
    2. 如果 yNaN,返回 false
    3. 如果 xy 为同一个数字,返回 true
    4. 如果 x+0y-0,返回 true
    5. 如果 x-0y+0,返回 true
    6. 返回 false
  5. 如果 Type(x) 结果为 String,如果 xy 为完全相同的字符序列(相同的长度和相同的字符对应相同的位置),返回 true,否则,返回 false
  6. 如果 Type(x) 结果为 Boolean,如果 xy 都为 truefalse,则返回 true,否则,返回 false
  7. 如果 xy 引用到同一个 Object 对象,返回 true,否则,返回 false

注:此算法与 SameValue 算法在对待有符号的零和 NaN 上表现不同。

关键词: javascript,比较   编辑时间: 2015-09-29 14:19:53

  • 感到高兴

    0

    高兴
  • 感到支持

    0

    支持
  • 感到搞笑

    0

    搞笑
  • 感到不解

    0

    不解
  • 感到谎言

    0

    谎言
  • 感到枪稿

    0

    枪稿
  • 感到震惊

    0

    震惊
  • 感到无奈

    0

    无奈
  • 感到无聊

    0

    无聊
  • 感到反对

    0

    反对
  • 感到愤怒

    0

    愤怒
66.67%(2)
33.33%(1)
共有0 条评论 发言请遵守【相关规定

网友评论

会员头像
发 表同步腾讯微博    验证码:  点击更新请先登陆
  • 暂无评论
关闭模块文章图片 article Pictrue
  • 我的妈妈爸爸
  • 基于koa2+mysql+vue2.0+Element阳光内容管理系统
  • 代码覆盖率工具 Istanbul 入门教程
  • 全栈工程师的武器——MEAN
  • 9款超炫的 CSS3 复选框(Checkbox)
  • 微信开发在线翻译功能
  • CSS3那些不为人知的高级属性
  • 给easyui的datebox添加清空事件
  • flash写字效果
  • kendoUI系列教程之DropDownList下拉菜单
  • kendoUI系列教程之datetimepicker日期时间选择
  • kendoUI系列教程之datepicker日期选择
  • kendoUI系列教程之combobox下拉列表框
  • kendoUI系列教程之colorpicker
  • kendoUI系列教程之calendar日历表
  • kendoUI系列教程之autocomplete自动补齐