[] == ![] 为true

下面哪些语句执行结果为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,所以相等没毛病


__EOF__

本文作者龙陌
本文链接https://www.cnblogs.com/longmo666/p/17835934.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   龙陌  阅读(53)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示