首页 > 试题广场 >

下面代码的输出是: const arr = ...

[单选题]
下面代码的输出是:
const arr = [];
const testObj = {};
console.log(arr === "");
console.log(arr == "");
arr.toString = () => 1;
console.log(arr === 1);
console.log(arr == 1);
arr.valueOf = () => 2;
console.log(arr == 2);
arr.valueOf = () => testObj;
console.log(arr == testObj);

  • false true false true true false
  • false false false true false false
  • false true false false true true
  • false true true true true false

隐性类型转换步骤


一、首先看双等号前后有没有NaN,如果存在NaN,一律返回false。


二、再看双等号前后有没有布尔,有布尔就将布尔转换为数字。(false是0,true是1)


三、接着看双等号前后有没有字符串, 有三种情况:


1、对方是对象,对象使用toString()或者valueOf()进行转换;

2、对方是数字,字符串转数字;(前面已经举例)

3、对方是字符串,直接比较;

4、其他返回false

四、如果是数字,对方是对象,对象取valueOf()或者toString()进行比较, 其他一律返回false


五、null, undefined不会进行类型转换, 但它们俩相等

发表于 2020-03-04 15:30:57 回复(0)

做题必备小知识

==和===的区别:

  • 出现==:
    我们可以将===看作==的严格模式,当==的时候如果数据类型相同那么就会转换成===;如果数据类型不同那么会自动的进行一次类型转换,转换成相同的类型后进行比较。
  • 出现===:出现三个等号的时候,首先判断的是类型是否相等,如果不相等就会返回false

valueOf方法和toString方法默认调用toString方法

  • 这是为什么呢,我看的有些博客直接说默认调用toString并没有说明原理。其实是这样的,我们看下面的一个例子,虽然colors.valueOf()方法返回的还是一个数组,但是在alert输出的时候隐式调用了toString方法,所以结果是相同的。
  • 但是如果是数值运算优先调用valueOf()方法。
var colors = ["red", "blue", "green"]; // 创建一个包含3 个字符串的数组  
alert(colors.toString()); // red,blue,green  
alert(colors.valueOf()); // red,blue,green  
alert(colors); // red,blue,green 

解析

  • 第一次输出:arr==="";类型都不同,不会调用toString也不会调用valueOf。返回false
  • 第二次输出:arr=="";类型不同但是调用toSrting再进行比较。最后返回true
  • 第三次输出:arr===1;结果是false道理同第一次输出
  • 第四次输出:arr==1;结果是true,道理同第二次输出,两个方法不是都被重写,调用的是toString方法。
  • 第五次输出:arr == 2;结果是true,调用valueOf方法。
  • 第六次输出:类型都是同样的object,但是值不相同,所以返回的结果是false
发表于 2020-01-19 17:24:57 回复(4)
对于最后一个:
基本数据类型的值不可变,而引用数据类型的值是可变的

所以当你比较数组和对象时,都是false;除非你是克隆的原份数据

即: var a = { name: "李四" }; var b = a;

大家通常称对象为引用类型,以此来和基本类型进行区分; 而对象值都是引用,所以的对象的比较也叫引用的比较,当且当他们都指向同一个引用时,即都引用的同一个基对象时,它们才相等.

编辑于 2020-08-17 22:08:58 回复(0)
两个等于号只比较数值,三个等于号既比较数值也比较数据类型
发表于 2019-12-04 21:58:08 回复(0)