隐式数据类型转换

隐式数据类型转换

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

常见的一些转换

原始值 转化为值类型 转化为字符串 转化为Boolean
false 0 “false” false
true 1 “true” true
0 0 “0” false
1 1 “1” true
“0” 0 “0” true
NaN NaN “NaN” false
Infinity Infinity “Infinity” true
“” 0 “” false
[ ] 0 “” true
[20] 20 “20” true
function(){} NaN “function(){}” true
{} NaN “[object Object]” true
null 0 “null” false
undefined NaN “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

你可能感兴趣的:(js,js,JavaScript,数据类型,隐式转换)