隐式数据类型转换

隐式数据类型转换

js中的数据类型是非常弱的,在使用算数运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和一个数字相加。之所以不同的数据类型之间可以做运算,是因为js引擎在运算之前会悄悄地把他们进行了隐式类型转换。

常见的一些转换

原始值转化为值类型转化为字符串转化为Boolean
false0“false”false
true1“true”true
00“0”false
11“1”true
“0”0“0”true
NaNNaN“NaN”false
InfinityInfinity“Infinity”true
“”0“”false
[ ]0“”true
[20]20“20”true
function(){}NaN“function(){}”true
{}NaN“[object Object]”true
null0“null”false
undefinedNaN“undefined”false

比较运算

js 为我们提供了严格比较与类型转换比较两种模式

严格比较(== =): 只会在操作符两侧的操作对象类型一致,并且内容一致时才会返回true,否则返回false。

而更为广泛使用的类型转换比较==: 操作符则会首先将操作对象转化为相同类型,在进行比较。

相等操作符会对操作值进行隐式转换后进行比较:

  • 如果一个操作值为布尔值,则在比较之前先将其转换为数值
  • 如果一个操作值为字符串,另一个操作值为数值,则通过Number()函数将字符串转换为数值
  • 如果一个操作值是对象,另一个不是,则调用对象的valueOf()方法,得到的结果按照前面的规则进行比较
  • null==undefined——>true
  • null===undefined——>false
  • 如果一个操作值为NaN,则相等比较返回false
  • 如果两个操作值都是对象,则比较它们是不是指向同一个对象

加法运算:

加法运算符在js中也用作字符串拼接,所以加法操作符的规则分为两种

  • 如果一个数是NaN,则结果就是NaN
  • 如果是Infinity+Infinity,结果是Infinity
  • 如果是-Infinity+(-Infinity),结果是-Infinity
  • 如果是Infinity+(-Infinity),结果是NaN
    如果有一个操作值是字符串,则:
  • 如果两个都是字符串则,拼接起来
  • 既有字符串,又有数值,则将另外的值转换成字符串,然后拼接起来
  • 如果有一个值是对象、数值或者布尔值,则调用toString()方法取得字符串值,然后再应用前面的字符串规则。对于undefined和null,分别调用String()显式转换为字符串。

逻辑操作符(!、&&、||)

逻辑非(!)操作符首先通过Boolean()函数将它的操作值转换为布尔值,然后求反。

逻辑与(&&)操作符,如果一个操作值不是布尔值时,遵循以下规则进行转换:

  • 如果第一个操作数经Boolean()转换后为true,则返回第二个操作值,否则返回第一个值(不是Boolean()转换后的值)
  • 如果有一个操作值为null,返回null
  • 如果有一个操作值为NaN,返回NaN
  • 如果有一个操作值为undefined,返回undefined
        console.log(null&&NaN);//null
        console.log(NaN&&null);//NaN
        console.log(undefined&&null);//undefined
        console.log(null&&undefined);//null

逻辑或(||)操作符,如果一个操作值不是布尔值,遵循以下规则:

  • 如果第一个操作值经Boolean()转换后为false,则返回第二个操作值,否则返回第一个操作值(不是Boolean()转换后的值)
  • 对于undefined、null和NaN的处理规则与逻辑与(&&)相同

关系操作符(<, >, <=, >=)

与上述操作符一样,关系操作符的操作值也可以是任意类型的,所以使用非数值类型参与比较时也需要系统进行隐式类型转换:

  • 如果两个操作值都是数值,则进行数值比较
  • 如果两个操作值都是字符串,则比较字符串对应的字符编码值
  • 如果只有一个操作值是数值,则将另一个操作值转换为数值,进行数值比较
  • 如果一个操作数是对象,则调用valueOf()方法(如果对象没有valueOf()方法则调用toString()方法),得到的结果按照前面的规则执行比较
  • 如果一个操作值是布尔值,则将其转换为数值,再进行比较

参考博客:https://www.cnblogs.com/mengxiangji/p/11080006.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值