摘要:在上面代码中调用方法返回的是自身方法字符串,因此和都成立。我们还可以对的方法进行重写加减规则为先求两侧表达式原始值若其中一个为字符串,返回字符串合并两侧表达式转化为数字类型进行运算还有一些特殊情况
先看一段代码,执行结果有些奇怪,a>=b同时a<=b但是a!=b。
var a = function() {}; var b = function() {}; a == b // false a != b // true a >= b // true a <= b // true
这涉及到js中操作符引起的类型转换。
全等于(==)ES规范中==的判断流程为:
1.ReturnIfAbrupt(x)
2.ReturnIfAbrupt(y)
3.如果Type(x)与 Type(y)相同,返回x===y
4.如果x为null,y为undefined,返回true
5.如果x为undefined,y为null,返回true
6.如果Type(x)是Number,Type(y)是String,返回x == ToNumber(y)
7.如果Type(x)是String,Type(y)是Number,返回ToNumber(x) == y
8.如果Type(x)是Boolean,返回ToNumber(x) == y
9.如果Type(y)是Boolean,返回x == ToNumber(y)
10.如果Type(x)是String、Number或者Symbol,Type(y)是Object,返回x == ToPrimitive(y)
11.如果Type(x)是Object,Type(y)是String、Number或者Symbol,返回ToPrimitive(x)==y
12.返回false
ReturnIfAbrupt判断参数是否正常值,如有报错,中断执行;Type函数相当于typeOf操作符结果;ToPrimitive返回参数的原始值,在全等于操作符中返回对象依次尝试调用valueOf或者toString方法的结果,直到结果为非对象
总结一下就是:
1、如果两侧参数类型相同,使用严格等于比较;
2、null与undefined两两相等;
3、若有布尔类型则转化为数字;
4、字符串和数字比较时把字符串转化为数字,进入1;
5、Object类型与Number、String、Symbol类型比较时,使用Object对象的原始值进行比较
6、其他情况返回false
在上面代码中a和b的类型都是“function”,应使用严格等于进行比较,它们有不同的引用并不是同一个值,所以结果为false
大于、小于(>、<)大于、小于首先使用valueOf方法对左右表达式求原始值,再进行比较。在上面代码中a、b调用valueOf方法返回的是自身方法字符串,因此>=和<=都成立。
我们还可以对a、b的valueOf方法进行重写
a.valueOf=function(){return 1;} b.valueOf=function(){return 2;} a > b // false a < b // true加、减(+、-)
规则为:
1、先求两侧表达式原始值
2、若其中一个为字符串,返回字符串合并
3、两侧表达式转化为数字类型进行运算
还有一些特殊情况:
Infinity-Infinity // NaN Infinity+Infinity // Infinity -Infinity+(-Infinity) // -Infinity +0+0 // +0 +0+(-0) // +0 -0+(-0) // -0 +5+(-5) // +0
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/105448.html
摘要:即在这个隐式强制类型转换中,即不会等于也不会等于。按照正常人类的脑回路,应该是将先转换为布尔值,然后再将两个布尔值对比。为什么和就可以避开操作符的坑呢它们进行强制类型转换时的转换规则又是怎样的。 在js中,类型转换是一个被非常多人诟病的地方。新手看了会发矇,老手看了会头疼。 类型转换,又成为强制类型转换,主要区分为显式强制类型转换和隐式强制类型转换 按我理解,类型转换的意思就很明显,就...
摘要:看下面的代码和会对操作数执行条件判断,如果操作数不是布尔值,会先执行类型转换后再执行条件判断。大家记住这个规则布尔值如果与其他类型进行抽象比较,会先用将布尔值转换为数字再比较。 在上一篇中我们聊过了 JS 类型转换的规则和我发现的一些常见书籍中关于类型转换的一些小错误,当碰到显示类型转换的时候大家可以按照这些规则去拆解出答案。但 JS 中存在一些很隐晦的隐式类型转换,这一篇就来谈下我对...
摘要:我们首先了解一下中有关类型转换的知识。新增类型抛出异常从列表可以明显看到少了一个类型转换为的规则。这里要强调一点第二个表达式没有涉及到强制类型转换。如果文中有错误或者有某些强制转换的情形没有涉及到请及时留言告知,我会修改并补充进去。 javascript是一门非常奇特的语言,它有时候奇特的会让人怀疑人生。比如让我们看一下下面的一些奇葩例子: false == 0 ...
摘要:隐式强制类型转换指的是那些隐藏的强制类型转换,副作用也不是很明显,事实上,只要自己觉得不够明显的强制类型转换都可以算作隐式强制类型转换,接下来,此文将会介绍几种常见的隐式类型转换。 隐式强制类型转换指的是那些隐藏的强制类型转换,副作用也不是很明显,事实上,只要自己觉得不够明显的强制类型转换都可以算作隐式强制类型转换,接下来,此文将会介绍几种常见的隐式类型转换。 加法操作符 转换规则: ...
摘要:如何让根据拆箱转换,以及的隐式转换,可以如下写为什么计算机中所有的数据都是以二进制存储的,所以在计算机计算时要把数据先转换成二进制进行计算,然后把计算结果转换成十进制。会存在精度丢失问题和的二进制都是以无线循环的小数的二进制的二进制 本想着记笔记里,但是笔记里没有分类,还是以文章的形式,当个人总结吧,这一篇就当作JS基础篇的记录吧,有修改的和新增的持续更新~ 关于JS的一些小技巧 1:...
摘要:可以将其他类型转成字符串函数可以将任意类型的值转为布尔值。提示空数组空对象转换为布尔型也是。 在JS中数据类型转换有两种 相关资料参阅 官方ecma-5规范阮一峰老师类型转换规范对相等==定义 强制类型转换Number() Number函数将字符串转为数值,要比parseInt函数严格很多,只要有一个字符是非数字(空格、+、-除外),那么就会被转为NaN。 showImg(http...
阅读 1697·2021-11-11 11:02
阅读 1654·2021-09-22 15:55
阅读 2411·2021-09-22 15:18
阅读 3454·2019-08-29 11:26
阅读 3654·2019-08-26 13:43
阅读 2596·2019-08-26 13:32
阅读 862·2019-08-26 10:55
阅读 930·2019-08-26 10:27