javascript - 当对象可能是字符串时使用 'in'

标签 javascript

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

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(...);
// ...
<小时/>

Since strings are objects in javascript, why shouldn't the 'in' keyword work for them?

不完全是。 primitive string value 之间存在差异。和一个String instance object .

typeof "foo";        // "string"
typeof new String(); // "object"

原始值本身没有属性,这就是为什么 in 运算符在使用它们时会抛出 Error 。然而,它们将被属性访问器临时装箱到对象中:

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"

关于javascript - 当对象可能是字符串时使用 'in',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23440258/

相关文章:

javascript - 屏幕外汉堡包导航

javascript - Jasmine : Add source method for test execution

javascript - 如何从异步调用返回响应?

javascript - 如何使用 HighStock 的 tickPositioner 设置月末报价?

javascript - 物体之间的最短距离

javascript - AngularJS 表单未重置

javascript - 为 jQuery 弹出窗口堆叠 div 元素

javascript - 在一个字符串中连接对象数据

javascript - JQuery 未在 Cordova 中执行

javascript - 使用 THREE.js 通过坐标自定义 3D 对象