类型转换,显式转换,隐式转换,a == 1 && a == 2 && a == 3 输出 true

这个问题想要知道答案,首先需要懂得==隐式转换规则

大致分五种情况:

1)两端类型相同,比较值

        都是对象类型,判断引用地址是否一致

        特殊的情况有:undefined == undefined

                          null == null

2)两端类型不同,

        2.1)两端均为基本数据类型,转为数字比较

        2.2)一端基本数据类型,一端引用数据类型,将引用数据类型转为基本数据类型(先调用valueOf,如果无法转换成基本数据类型,在调用toString方法-->ToPrimitive规则)

console.log('[object Object]' == {}); // true
// ({}).valueOf() => {},依旧不是基本类型
// ({}).toString() => '[object Object]'
// '[object Object]' == '[object Object]' => true
console.log('1,2,3' == [1, 2, 3]); // true
// [1, 2, 3].valueOf() => [1, 2, 3],依旧不是基本类型
// [1, 2, 3].toString() => '1,2,3'
// '1,2,3' == '1,2,3' => true

3)特殊情况的==

        NaN !== NaN(NaN !== 任何东西)

        undefined == null (除此之外,null,undefined !== 任何东西)

4)Boolean类型和其他类型比较,优先Boolean转Number

5)String和Number比较,优先String转Number

看看下面几个题,你学会隐式转换规则了吗?

[] == ![]
//涉及数组与布尔类型隐式转换
// ![] 转为false,因为空数组 [] 被视为真值(因为它不是空字符串、零、null、undefined 或 false)
// 布尔值与其他任何类型比较,优先布尔转Number,false -> 0,现在变成了[] == 0
// 基本类型和引用类型,引用转基本,[].valueOf->[],[].toString->''
// 字符串和数字类型,字符串转数字,'' -> 0
// 0 == 0
// true

[undefined] == false
// 数组和布尔,优先布尔转Number,false -> 0,此时题目变成了[undefined] == 0
// 数组和基本,数组转基本
// [undefined].valueOf -> [undefined],[undefined].toString->''
// ''和数字,字符边数字,'' -> 0
// 0 == 0
// true

强制转换规则

parseInt() 字符串转整数,尽可能多的解析数字

parseInt('3.14')//3
parseInt('1010', 2)//10
parseInt('42world')//42
parseInt('hello')//NaN

Number()

Number(null)  // 0
Number(undefined)  // NaN
Number(true)  // 1
Number(false)  // 0
//字符串:只包含数字转为数字(空字符串转为0),包含非数字转NaN
Number("11")  // 11
Number("1.1e+21") // 1.1e+21
Number("abc")  // NaN
Number([])   // 0
Number([0])  // 0
Number([1])  // 1
Number(["abc"])  // NaN  ['abc'].valueOf -> ['abc'] ['abc'].toString -> 'abc'
Number({})  // NaN

String()

String(null)  // "null"
String(undefined) // "undefined"
String(true)  // "true"
String(false)  // "false"
String(11)  // "11"
String(11e20)  // '1.1e+21'
String([])  // ""
String([1, null, 2, undefined, 3])  // '1,,2,,3'
String(function a(){})  // "function a(){}"
String({})  // "[object, Object]"
String({name:'zhang'})  // "[object, Object]"

 Boolean()

        只有nullundefined0falseNaN空字符串这6种情况转为布尔值结果为false,其余全部为true

这个时候你再看看这个题目,想要a == 1 && a == 2 && a == 3同时成立,显然是第二种情况才有可能满足。

隐式转换(比较运算和算术运算) 

算数运算-*/优先将非Number转为Number

+比较特殊:

  • 当一侧为String类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型。
  • 当一侧为Number类型,另一侧为原始类型,则将原始类型转换为Number类型。
  • 当一侧为Number类型,另一侧为引用类型,将引用类型和Number类型转换成字符串后拼接。
    123 + '123' // 123123   (规则1)
    123 + null  // 123    (规则2)
    123 + true // 124    (规则2)
    123 + {}  // 123[object Object]    (规则3)

解一下这个题目:

var a = {
    x: 1,
    valueOf: function () {
        return this.x++;
    },
};
console.log(
    'a == 1 && a == 2 && a== 3 结果:', 
    a == 1 && a == 2 && a == 3
); // 输出 a == 1 && a == 2 && a== 3 结果: true
var a = ?;
// a 为多少时,下面输出true?
console.log(
    '结果:', 
    a == 1 && a == 2 && a == 'abc'
);

//办法
var a = {
    x: 1,
    valueOf: function () {
        return this.x >= 3 ? 'abc' : this.x++;
    },
};
console.log(
    'a == 1 && a == 2 && a== abc 结果:', 
    a == 1 && a == 2 && a == 'abc'
); // 输出 a == 1 && a == 2 && a== 'abc' 结果: true

Oh my dear JavaScript   点一下看看

你可能感兴趣的:(javascript,前端)