为什么这样:
console.log('length' in new String('test'))
返回 true ,而这:
console.log('length' in String('test'))
抛出TypeError?
无法使用'in'运算符在test
中搜索'length'
答案 0 :(得分:2)
尝试:
typeof String('test') -> "string"
typeof new String('test') -> "object"
in
仅适用于对象。
答案 1 :(得分:2)
来自MDN
如果指定的属性在,则in运算符返回true 指定的对象。 您必须在in运算符的右侧指定一个对象。对于 例如,您可以指定使用String构造函数创建的字符串, 但是你不能指定一个字符串文字。
var color1 = new String("green");
"length" in color1 // returns true
var color2 = "coral";
// generates an error (color2 is not a String object)
"length" in color2
答案 2 :(得分:2)
var s_prim = 'foo'; //this return primitive
var s_obj = new String(s_prim);//this return String Object
console.log(typeof s_prim); // Logs "string"
console.log(typeof s_obj); // Logs "object"
来自MDN
如果指定的属性在,则in运算符返回true 指定的对象。
"length" in s_obj // returns true
"length" in s_prim // generates an error (s_prim is not a String object)
在运算符中仅用于对象,数组
答案 3 :(得分:2)
JavaScript具有字符串基元和字符串对象。 (类似于数字和布尔值。)在第一次测试中,您正在测试一个对象,因为new String()
创建了一个对象。在你的第二个,你正在测试一个原语,因为String(x)
只是将x
转换为字符串。您的第二次测试与撰写console.log('length' in 'test');
in
operator(你必须向下滚动一下)如果你在不是对象的东西上使用它会抛出一个类型错误;它是 RelationalExpression下六个步骤中的第五个:RelationalExpression in
ShiftExpression :
(这有点令我惊讶;大多数事情需要一个对象强制对象的原语,而不是in
。)