Javascript 使用';在';当对象可能是字符串时

Javascript 使用';在';当对象可能是字符串时,javascript,Javascript,我正在查找如何检查JavaScript中的变量是否是数组,但在加载SO页面时,我想到了解决问题的方法。通过查看答案,我发现他们中没有人想到这个简单的答案:只需检查我们需要在数组上使用的方法,以便它仍然适用于实现相同方法的任何用户定义类型。作为一个乐于助人的人,我想我会把我的答案提交给未来试图解决同样问题的人。但是经过测试,我发现它不起作用 function print(object) { if ('map' in object) { // If the object implements m

我正在查找如何检查JavaScript中的变量是否是数组,但在加载SO页面时,我想到了解决问题的方法。通过查看答案,我发现他们中没有人想到这个简单的答案:只需检查我们需要在数组上使用的方法,以便它仍然适用于实现相同方法的任何用户定义类型。作为一个乐于助人的人,我想我会把我的答案提交给未来试图解决同样问题的人。但是经过测试,我发现它不起作用

function print(object) {
  if ('map' in object) { // If the object implements map, treat it like an array
    object.map(function(current) {
      console.log(current);
    });
  } else {               // Otherwise, treat it as a string
    console.log(object);
  }
}

现在,当我用数组调用它时,它可以正常工作,但是如果我使用字符串,它就会失败。既然字符串是javascript中的对象,为什么“in”关键字不适用于它们?是否有任何方法可以实现与当前一样简单的功能?

您可以访问该属性并测试其类型:

if (object != null && typeof object.map === 'function')
    object.map(...);
// ...

既然字符串是javascript中的对象,为什么“in”关键字不适用于它们

不完全是。a和a之间有区别

基元值本身没有属性,这就是为什么
in
操作符在对它们使用时抛出
错误的原因。但是,它们将由属性访问器临时装箱到对象中:

var a = "foo";
a.bar = 'bar';      // no error, but...
console.log(a.bar); // undefined

String.prototype.baz = function () {
    return this + this;
};

console.log(a.baz()); // "foofoo"

我想你可以这样做:

var y = function (o) {
    if (typeof o != "string" && "map" in o)
        console.log("not a string"); //your code here
    else
        console.log("It's a string!"); //your code here
}

我用
var x=“hello”
对其进行了测试,结果成功了。由于JavaScript中的
&&
短路,它将在
类型为o!=“string”
,这很好,因为o
中的
映射对于
string
s失败。注意有意使用小写字母,这是用于原语的<代码>字符串
s是对象。我不确定这是否是您的目标。

执行此操作:
if(“对象(Object)”中的“映射”){…
任何原语都将转换为其对象包装器类型。^^这很简单,我喜欢它。我必须说,虽然更可靠的方法是查看对象是否是数组。但只要它们实现了map,我真的应该关心它是否真的是数组吗?取决于找到的
.map
是什么和做什么。你是在假设它'将是一个函数。即使它是,它也可能是一个执行意外操作的函数。但可能性不大。
var y = function (o) {
    if (typeof o != "string" && "map" in o)
        console.log("not a string"); //your code here
    else
        console.log("It's a string!"); //your code here
}