[] == false,!![] == false比较操作符

比较操作符

本节重点是文章中举的例子以及使用比较操作符的几点。 对于基础不好的同学希望能看完,后面是运算符的使用; 相较于基础好的,看完几个例子就可以了,自行决定。

  • 严格比较

    • 特点: 值和类型都要相同。
  • 转换类型比较

    • 特点: 比较前会将操作数转换为原始值,使它们类型相同,再进行比较运算。

比较的特点:

  • 对于两个拥有相同字符顺序,相同长度,并且每个字符的位置都匹配的字符串,应该使用严格比较运算符。

  • 对于两个数值相同的数字应该使用严格比较运算符,NaN和任何值不相等,包括其自身,正数零等于负数零。

  • 对于两个同为true或同为false的布尔操作数,应使用严格比较运算符。

  • 不要使用严格比较运算符或比较运算符来比较两个不相等的对象。

  • 当比较一个表达式和一个对象时,仅当两个操作数引用相同的对象(指针指向相同对象)。

  • 对于Null 和 Undefined 类型而言,应使用严格比较运算符比较其自身,使用比较运算符进行互相比较。

使用比较操作符

标准相等操作符(== and !=) 使用 Abstract Equality Comparison Algorithm 去比较两个操作数。当两个操作数类型不相等时,会在比较前尝试将其转换为相同类型。 对于表达式 5 == ‘5’, 在比较前会先将右边字符串类型的操作数 5 转换为数字。

严格相等操作符 (=== and !==) 使用 Strict Equality Comparison Algorithm 并尝试对两个相同操作数进行相等比较,如果它们的类型不相等,那么永远会返回false 所以5 !== '5'

当需要明确操作数的类型和值的时候或者操作数的确切类型非常重要时,应使用严格相等操作符。否则,当你允许操作数在比较前进行类型转换时,可以使用标准相等操作符来比较。

当比较运算涉及类型转换时 (i.e., non–strict comparison), JavaScript 会按以下规则对字符串,数字,布尔或对象类型的操作数进行操作:

  • 1.当比较数字和字符串时,字符串会转换成数字值,Number()。 JavaScript 尝试将数字字面量转换为数字类型的值。 首先, 一个数学上的值会从数字字面量中衍生出来,然后这个值将被转为一个最接近的Number类型的值。

  • 2.如果其中一个操作数为布尔类型,那么布尔操作数如果为true,那么会转换为1,如果为false,会转换为整数0,即0。

  • 3.如果一个对象与数字或字符串相比较,JavaScript会尝试返回对象的默认值。操作符会尝试通过方法valueOftoString将对象转换为其原始值(一个字符串或数字类型的值)。如果尝试转换失败,会产生一个运行时错误。

  • 注意:当且仅当与原始值比较时,对象会被转换为原始值。当两个操作数均为对象时,它们作为对象进行比较,仅当它们引用相同对象时返回true。

例子1: [] == false

[] == false  由条件2得出:  [] == 0; 由条件3得出: [].toString() == 0 ---> "" == 0 ; 由条件1得出 : Number("") == 0 --> 0 == 0 : 结果为true

例子2: !![] == false

  • 第一步先运行: ![], 由运算符优先级可知, !(16) 运算符的优先级大于 ==(10)
  • 第二步: !false, 根据**《Javascript高级程序设计》**书籍的44页有详细说明: 无论这个值是什么数据类型,!操作符都会返回一个布尔值。也就是![] = false & !{} = false --> 所以第二步是 !false
  • 最后: !false = true --> true == false : 结果为false

注意: 字符串对象的类型是对象,不是字符串!字符串对象很少被使用.

'foo' === 'foo'

var a = new String('foo');
var b = new String('foo');


a == b  // false
a === b // false
// 因为new新创建了对象,它们指向的内存地址不同,所以不相等。

a == 'foo'

相等运算符 (==)

比较操作符会为两个不同类型的操作数转换类型,然后进行严格比较。当两个操作数都是对象时,JavaScript会比较其内部引用,当且仅当他们的引用指向内存中的相同对象(区域)时才相等,即他们在栈内存中的引用地址相同

不相等 (!=)

不等操作符仅当操作数不相等时返回true,如果两操作数不是同一类型,JavaScript会尝试将其转为一个合适的类型,然后进行比较。如果两操作数为对象类型,JavaScript会比较其内部引用地址,仅当他们在内存中引用不同对象时不相等。

一致/严格相等 (===)

一致运算符不会进行类型转换,仅当操作数严格相等时返回true

不一致/严格不相等 (!==)

不一致运算符当操作数不相等或不同类型时返回true

关系运算符

大于运算符 (>)

大于运算符仅当左操作数大于右操作数时返回true

大于等于运算符 (>=)

大于等于运算符当左操作数大于或等于右操作数时返回true

小于运算符 (<)

小于运算符仅当左操作数小于右操作数时返回true

小于等于运算符 (<=)

小于等于运算符当左操作数小于或等于右操作数时返回true

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值