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