题目1

1
2
3
4
5
6
7
8
下面结果为真的表达式是:()
A: null instanceof Object

B: null === undefined

C: null == undefined

D: NaN == NaN
  • 答案

    • C
  • 解析

    • A:

      • null instanceof Object ;// false
      • typeof null === ‘object’;// true
      • 同理
      • undefined instanceof Object ; //false
      • typeof undefined === ‘undefined’ //true
    • B,C

      • null 遇到二个等号( == ) 和 undefined 比较,无条件返回true
      • null 遇到三个等号( === ) 和undefined 比较,无条件返回false
    • D:

      • NaN 不与 任何值相等 包括自身

题目2

1
2
3
4
5
6
7
8
以下哪个语句打印出来的结果是false
A: alert(3 == true)

B: alert(2 == '2')

C: alert(null == undefined)

D: alert(isNaN('true'))
  • 答案

    • A
  • 解析

    • A: == 会隐式转换,二个都是基本数据类型比较,true转化为数字为1,然后3==1返回false

    • B: == 会隐式转换,二个都是基本数据类型比较,都转化为数字,字符串’2’ 转化为数字为2,所以 2 == 2返回为true

    • C: null 遇到2个等号(==) 和undefined 无条件返回true**(规定)**

    • D: isNaN的转换好像都是将参数通过**Number()**来进行转换,凡是Number不能转换的都返回NaN

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      isNaN(123) //false
      isNaN(-1.23) //false
      isNaN(5-2) //false
      isNaN(0) //false
      isNaN('123') //false
      isNaN('Hello') //true
      isNaN('2005/12/12') //true
      isNaN('') //false
      isNaN(true) //false
      isNaN(undefined) //true
      isNaN('NaN') //true
      isNaN(NaN) //true
      isNaN(0 / 0) //true

总结下

  1. 只要是基本数据类型== 比较,都会转化为数值来进行比较

  2. 只要是引用数据类型基本数据类型的的比较,都会转化为字符串 然后 转化为 被比较的基本数据的类型再进行比较((除了引用数据类型和布尔值进行比较的时候是将二者转化为布尔值比较))

  3. (比如 对象和布尔值比较 )

    1
    2
    3
    // 输出结果为false
    // 过程: [ ]转换为字符串'',然后转换为数字0,true转换为数字1,所以为false
    [] == true;
  4. (比如 对象和数字比较)

    1
    2
    3
    // 输出结果为true
    // 过程: [1]转化为字符串'1' ,然后转化为数字1 然后数字1 和 1进行比较 ,返回true
    [1] == 1;
  5. 还有一些需要记住的,像

    1
    2
    3
    4
    5
    6
    7
    null == undefined // true  null和undefined二个等于号比较则返回true,二者和其他比较就返回false

    //举例子,下方的就是
    null == false //false

    null === null //为true
    undefined === undefined //为true
  6. 具体可以看这个博主写的js中的一些隐式转换和总结

题目2扩展

1
2
3
4
5
//各自的返回结果是?
1 == true
"" == false
false == null
null == undefined
  • 答案
    • 1 == true ;// true (基本数据类型和布尔值比较,二者转化为数值 1 不变化 true变为了1,所以二者相等返回true)
    • "" == false; // true (基本数据类型和布尔值比较 , 二者转化为数值, ""转化为数值为0, false变为0,所以二者相等返回true)
    • false == null; // false (null除了和undefined二个等号比较返回为true,null和其他比较均返回为false(undefined也是))
    • null == undefined;// true (nullundefined 比较,返回为true,可以看上面第五条)

扩展

  • 对象转换为数字的时候的时候,会依次调用valueOf方法和toString方法,我们可以进行重写这二个方法来完成一些看似不可能的操作
  • 当调用valueOf方法没有获取到基本数据类型的时候,就会再次调用toString方法

证明1:当调用valueOf方法没有获取到基本数据类型的时候,就会再次调用toString方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var a = [];
Array.prototype.valueOf = function () {
console.log("你调用了我1");
return [];
};
Array.prototype.toString = function () {
console.log("你调用了我2");
}
console.log([] == false);

//依次输出
// 你调用了我1
// 你调用了我2
// false

证明2:当调用valueOf方法没有获取到基本数据类型的时候,就会再次调用toString方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var test = {
name:"李白",
valueOf(){
console.log("你调用了我1");
return {};
},
toString(){
console.log("你调用了我2");
}
}
console.log(test == false);
//依次输出
// 你调用了我1
// 你调用了我2
// false

证明3:当调用valueOf方法没有获取到基本数据类型的时候,就会再次调用toString方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var test = {
name:"李白",
valueOf(){
console.log("你调用了我1");
return "777";
},
toString(){
console.log("你调用了我2");
}
}
console.log(test == false);
//依次输出
// 你调用了我1
// false

也许有人会说,为什么我重写了valueOf方法和toString方法还是只会调用valueOf啊

  • 那是因为你没有加return,你没加return在valueOf方法里面,那么相同会自动添加return undefined
1
2
3
4
5
6
7
8
9
10
11
12
13
var test = {
name:"李白",
valueOf(){
console.log("你调用了我1");
},
toString(){
console.log("你调用了我2");
}
}
console.log(test == false);
//可能你们是这样子写的
//然后发现只有 你调用了我1 和false输出
// 你return下任意的引用数据类型就可以了

有没有什么办法可以使得 a==1 && a==2 && a==3为真?

1
2
3
4
5
6
7
8
var a = {
num:1,
valueOf(){
//每次都是先返回在自增1
return this.num++;
}
}
console.log(a==1 && a==2 && a==3);//true