当使用“in”运算符时,字符串是何时是对象?

时间:2016-07-27 13:14:58

标签: javascript string

为什么这样:

console.log('length' in new String('test'))

返回 true ,而这:

console.log('length' in String('test'))

抛出TypeError?

  

无法使用'in'运算符在test

中搜索'length'

4 个答案:

答案 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

  1. 如果Type( rval )不是Object,则抛出 TypeError 异常。
  2. (这有点令我惊讶;大多数事情需要一个对象强制对象的原语,而不是in。)