[] == ![] 为true

发布时间 2023-11-16 11:59:59作者: 龙陌

下面哪些语句执行结果为true
A
'foo' == new function(){ return String('foo'); };

B
'foo' == new function(){ return new String('foo'); };

C
[] == 0

D
![]

E
!0

正确答案:BCE

关于A、B:

function Human(name) {
    this.name = name;
    return {};
}
let one = new Human('c1er');
console.log(one); //输出空对象 Object { }

以上述代码为例:

使用new运算符调用函数时,会返回一个对象。

如果构造函数没有return语句时,则默认返回原型为Human.prototype的、设置了属性name的对象。

然而就像Class的constructor一样,return语句返回一个对象时,该对象将被作为new操作符的结果返回。

因此。

A:String()作为普通函数使用时,将值转为字符串,不是对象,默认返回是一个空对象,原型为匿名函数的prototype。

String(new function(){ return String('foo'); })
"[object Object]"

B:String()作为构造函数来用时,返回了一个字符串包装对象。

String(new function(){ return new String('foo'); })
"foo"

关于D

答案错误,正如我们所知道的:对象总等于真。

如果对象不存在那么他调用实例方法的时候就会报错,能调用就说明已经被实例化出来了。
对象是引用类型的值,引用地址是判断对象为不为真的依据,每一个对象都有自己的引用地址,因此每一个对象都必然为真,而不是{}的属性和属性值,
没有属性和属性值只能说他是一个空对象,空对象和其他对象一样都有引用地址。

我来说下ab选项:
构造函数始终会返回一个对象:

情况1:你写了return {a:xxx} 他就会返回你定义的这个对象
情况2:你没写return 或者你return a 一个基本类型 这两种情况(没写或者return基本类型)它都会默认返回一个对象

a选项返回了一个String 所以构造函数会默认返回一个空对象

b选项返回一个String对象(因为有new 所以是字符串对象)所以构造函数就返回了这个String对象

new表达式之后的构造函数如果返回基本数据类型,那就返回new返回的匿名对象。
如果返回的是引用类型对象,则覆盖创建的匿名对象。
在类型转换时只有+0,-0,null,undedined,NaN,空字符串会转换为false,其余的都是true。
空数组是对象 ,空对象和其他对象一样都有引用地址,每一个对象都有自己的引用地址,因此每一个对象都必然为真

[] == 0 //true

当[]在==两侧会进行隐式转换

toPrimitive([]) = '' 是空串 ,Number('')=0

Number(false) = 0

所以 [] == 0 [] == false [] == ''''

但是![] 中 []是真值,取反之后为假值 由[] == false可知 [] == ![] //true

左侧的![]转换为false ,右侧的[]在==关系运算符下隐式转换为0,所以相等没毛病