资讯专栏INFORMATION COLUMN

Javascript中关于相等符号的隐形转换

gself / 2209人阅读

摘要:如果两个操作数都指向同一个对象,则相等操作符返回否则返回不同类型对比详细分析如下对象先转换为字符串,还不满足比较条件的话再继续转换为数字与布尔值进行比较时,布尔值直接转换为数字比较。与布尔值进行比较时,布尔值直接转换为数字。

前言

全文知识基于<>总结:

ECMAScript提供两组操作符: 相等和不相等(先转换再比较),全等和不全等(仅比较而不转换)

相等(==)和不相等(!=)

这两个操作符都会先转换操作数(通常称为强制转型),然后再比较它们的相等性。

操作符A 操作符B 比较相等性之前操作
布尔值 非布尔值 将布尔值转换为数值--false转换为0,而true转换为1
字符串 数值 将字符串调用Number() 转换为数值
对象 非对象 先调用valueOf方法返回对象的原始值, 再调用 toString 转换为字符串与基本类型进行比较

这两个操作符在进行比较时则要遵循下列规则。
1, null和undefined是相等的,undefined和undefined是相等的,null和null也是相等的
2, 要比较相等性之前,不能将null和undefined转换成其他任何值。
3, 如果有一个操作数是NaN则相等操作符返回false,而不相等操作符返回true。(即使两个操作数都是NaN,相等操作符也返回false因为按照规则NaN不等于NaN。)
4, 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true;否则返回false

不同类型对比详细分析如下
1, 对象(先转换为字符串,还不满足比较条件的话再继续转换为数字)

①与布尔值进行比较时,布尔值直接转换为数字比较。
②与数字进行比较时,转换为数字进行比较。
③与字符串进行比较时,转换为字符串进行比较。

2, 字符串(字符串转换成数字)

①与数字进行比较时,二者比较。
②与布尔值进行比较时,布尔值直接转换为数字。

3, 布尔值和数字进行比较时,布尔转换为数字,二者比较。
4, 函数和任何类型比都是转换成字符串,包括NaN

console.log([1] == true)
console.log([1] == 1)
console.log([1] == "1")
console.log("1" == 1)
console.log("1" == true)
console.log(true == 1)

function fn() {
  return 20;
}
console.log(fn + 10)
console.log(fn + NaN)
console.log(fn + true)
console.log(fn + undefined)

// true
// true
// true
// true
// true
// true
// function fn() {
//   return 20;
// }10
// function fn() {
//   return 20;
// }NaN
// function fn() {
//   return 20;
// }true
// function fn() {
//   return 20;
// }undefined
全等(===)和不全等(!==)

它只在两个操作数未经转换就相等的情况下返回true,说完!!

转换API valueOf

valueOf函数用于返回指定对象的原始值。JavaScript的许多内置对象都重写了该函数,以实现更适合自身的功能需要。因此,不同类型对象的valueOf方法的返回值和返回值类型均可能不同。

类型 返回
Array 数组实例对象
Number 数字
Boolean 布尔值
Object 对象本身
String 字符串
Date 以毫秒数存储的时间值,从 UTC 1970年 1月 1日午夜开始计算类似(1491470005274)
Function 函数本身
null 没有这个方法抛出异常 TypeError
undefined 没有这个方法抛出异常 TypeError
console.log("[1,2,3]: " + [1, 2, 3].valueOf())
console.log("123: " + (123).valueOf())
console.log("true: " + true.valueOf())
console.log("{abc:123}: ", ({ abc: 123 }).valueOf())
console.log(""123": " + "123".valueOf())
console.log("new Date(): " + new Date().valueOf())
console.log("function abc(){}: " + function abc() { }.valueOf())
console.log("null: " + null.valueOf())
console.log("undefined: " + undefined.valueOf())

// [1,2,3]: 1,2,3
// 123: 123
// true: true
// {abc:123}:  { abc: 123 }
// "123": 123
// new Date(): 1564555551129
// function abc(){}: function abc() { }
// TypeError报错
// TypeError报错
toString

把一个逻辑值转换为字符串,并返回结果。JavaScript的许多内置对象都重写了该函数,以实现更适合自身的功能需要。

类型 返回
Array 将 Array 的每个元素转换为字符串,并用逗号作为分隔符进行拼接
Number 字符串格式,还可返回以指定进制表示的字符串
Boolean "true"或者"false"
Object "[object Object]"
String 原值.(包括空字符)
Date 日期的文本表示类似("Thu Apr 06 2017 15:48:59 GMT+0800 (中国标准时间)")
Function "function 函数名称() { [native code] }"
null 没有这个方法抛出异常 TypeError
undefined 没有这个方法抛出异常 TypeError
console.log("[1,2,3]: " + [1, 2, 3].toString())
console.log("123: " + (123).toString())
console.log("true: " + true.toString())
console.log("{abc:123}: ", { abc: 123 }.toString())
console.log(""123": " + "123".toString())
console.log("new Date(): " + new Date().toString())
console.log("function abc(){}: " + function abc() { }.toString())
console.log("null: " + null.toString())//报错
console.log("undefined: " + undefined.toString())//报错

// [1,2,3]: 1,2,3
// 123: 123
// true: true
// {abc:123}:  [object Object]
// "123": 123
// new Date(): Wed Jul 31 2019 14:52:49 GMT+0800 (GMT+08:00)
// function abc(){}: function abc() { }
// TypeError报错
// TypeError报错
String

能够将任何类型的值转换为字符串遵循下列转换规则:

1, 如果值有 toString() 方法,则调用该方法(没有参数)并返回相应的结果;
2, 如果值是 null ,则返回 "null" ;
3, 如果值是 undefined ,则返回 "undefined" 。

console.log("null: " + String(null))
console.log("undefined: " + String(undefined))
console.log(""123.12": " + String("123.12"))

// null: null
// undefined: undefined
// "123.12": 123.12
Number

有3个函数可以把非数值转换为数值:Numbe可以用于任何数据类型,parseIntparseFloat专门用于把字符串转换成数值。这3个函数对于同样的输入会有返回不同的结果。由于Number()函数在转换字符串时比较复杂而且不够合理,因此在处理整数的时候更常用的是parseInt函数。

1, 如果是Boolean值,true和false将分别被转换为1和0。
2, 如果是数字值,只是简单的传入和返回。
3, 如果是null值,返回0。
4, 如果是undefined,返回NaN。
5, 如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。
6, 如果是字符串,遵循下列规则:

①如果字符串中只包含数字(包括前面带正负号的情况,前导的零被忽略了);
②如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);
③如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;
④如果字符串是空的(不包含任何字符),则将其转换为0;
⑤如果字符串中包含除上述格式之外的字符,则将其转换为NaN。

7, 如果是 Date 对象,Number() 返回从 1970 年 1 月 1 日至今的毫秒数。(原文没有,我在方法api看到的)
8, 如果是空字符返回0

console.log("true: " + Number(true))
console.log("1.23: " + Number("01.23"))
console.log("null: " + Number(null))
console.log("undefined: " + Number(undefined))
console.log("{}: " + Number({}))//转成字符串是空的,然后转换为0;
console.log("{abc:123}: " + Number({ abc: 123 }))
console.log(""123": " + Number("0123"))
console.log("0xf: " + Number(0xf))
console.log(""": " + Number(""))
console.log(""abc": " + Number("abc"))
console.log("空: " + Number())

// true: 1
// 1.23: 1.23
// null: 0
// undefined: NaN
// {}: NaN
// {abc:123}: NaN
// "123": 123
// 0xf: 15
// "": 0
// "abc": NaN
// 空: 0
parseInt

可解析一个字符串,并返回一个整数。转换规则如下。

1, 它会忽略字符串前面的空格,直至找到第一个非空格字符,同样忽略结尾的空格。
2, 如果第一个非空格字符不是数字字符(可带正负号),parseInt()就会返回NaN;(parseInt()对空字符返回NaN,Number()对空字符返回0)。
3, 如果第一个非空格字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。(包括小数点也不是有效的数字字符)。
4, 如果字符串中的第一个非空格字符是数字字符,parseInt()也能够识别出各种整数格式(即前面讨论的十进制、八进制和十六进制数)。

①如果字符串以"0x"开头且后跟数字字符,就会将其当作一个十六进制整数;
②如果字符串以"0"开头且后跟数字字符,则会将其当作一个八进制数来解析。(ECMAScript 3 认为是(八进制),ECMAScript 5 认为是(十进制))

console.log(""   123": " + parseInt("    123"))
console.log(""   -123": " + parseInt("    -123"))
console.log(""   -a123": " + parseInt("    -a123"))
console.log(""abc123": " + parseInt("abc123"))
console.log(""123.12": " + parseInt("123.12"))
console.log(""0xf": " + parseInt("0xf"))
console.log(""070": " + parseInt("070"))

// "   123": 123
// "   -123": -123
// "   -a123": NaN
// "abc123": NaN
// "123.12": 123
// "0xf": 15
// "070": 70
parseFloat

函数可解析一个字符串,并返回一个浮点数。parseInt()和parseFloat()函数的转换规则类似,区别如下。

1, 能够解析有效的浮点数字字符
2, 由于 parseFloat() 只解析十进制值,它始终都会忽略前导的零

console.log(""   123": " + parseFloat("    123"))
console.log(""abc123": " + parseFloat("abc123"))
console.log(""123.001: " + parseFloat("123.001"))
console.log(""0xf": " + parseFloat("0xf"))
console.log(""070": " + parseFloat("070"))
console.log(""73.125e7": " + parseFloat("3.125e7"))

// "   123": 123
// "abc123": NaN
// "123.001: 123.001
// "0xf": 0
// "070": 70
// "73.125e7": 31250000

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106226.html

相关文章

  • 一些搞死人基础题 --- (不定时更新)

    摘要:检查当前上下文中的参数,建立该对象下的属性与属性值。检查当前上下文的函数声明,也就是使用关键字声明的函数。数据类型跟布尔值比较回顾下前面说的要点然后有几个应该要知道的隐形转换和不能转换成其他任何值。 前言 2018/04/27 新增六,讲解浅拷贝和深拷贝的区别并简单实现, 七,原生JS操作DOM?2018/04/30 新增八,解决计算精度问题,例如0.1+0.2?2018/05/0...

    idisfkj 评论0 收藏0
  • JavaScript 操作符(二)

    摘要:布尔操作符逻辑非将操作数任何数据类型转换为一个布尔值,并求反。除和以外的任何类型,此操作都会返回任何非空的类型,此操作都会返回连续使用两个可达到函数同样的效果。 布尔操作符 逻辑非(!) 将操作数(任何数据类型)转换为一个布尔值,并求反。 !null; // true !undefined; // true !true; // false !false; // true !0; // ...

    lemanli 评论0 收藏0
  • 掌握 Javascript 类型转换:隐式转换救救孩子

    摘要:看下面的代码和会对操作数执行条件判断,如果操作数不是布尔值,会先执行类型转换后再执行条件判断。大家记住这个规则布尔值如果与其他类型进行抽象比较,会先用将布尔值转换为数字再比较。 在上一篇中我们聊过了 JS 类型转换的规则和我发现的一些常见书籍中关于类型转换的一些小错误,当碰到显示类型转换的时候大家可以按照这些规则去拆解出答案。但 JS 中存在一些很隐晦的隐式类型转换,这一篇就来谈下我对...

    weapon 评论0 收藏0
  • '=='操作符小动作

    摘要:相等操作符会有一个隐形的转换,这个隐形的转化会导致结果很奇怪。 [0] == true; // false [] == ![]; // true 相等操作符会有一个隐形的转换,这个隐形的转化会导致结果很奇怪。下面是隐形转换的基本规则: 其中一个值是boolean值:两个值都转为数字,false转为0,true转为1 其中一个值是字符串,另一个是数字:都转为数字再对比 其中一个是...

    PAMPANG 评论0 收藏0

发表评论

0条评论

gself

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<