检查数据是否不可变

时间:2010-12-09 19:32:23

标签: javascript

测试var是否包含不可变数据(即stringnumberbooleannull,{的最快,最干净的方法是什么? {1}})?

E.g。当undefined可变时,以下内容是合法的:

var test

但是当var test = {}; //the next 2 lines work because `test` has mutable data test.someFun = function () { alert(this); }; test.someFun(); 不可变时,它是非法的:

var test

5 个答案:

答案 0 :(得分:7)

另一个简短的选择:

function isPrimitive(value) {
  return Object(value) !== value;
}

它是如何运作的:

如果value可转换为对象的原始值,例如NumberStringBoolean,严格相等运算符将返回true,因为Object constructor called as a function会将值转换为“包装对象”:

typeof 5;         // "number"
typeof Object(5); // "object", a wrapped primitive
5 === Object(5);  // false

如果值是不可转换为Object的基元,例如nullundefined,则Object构造函数将创建一个新的空对象,返回true。

最后一种情况,如果value包含对象的引用,Object构造函数将不执行任何操作,并且strict equality运算符将返回false

答案 1 :(得分:2)

isMutable = function (test) {
     return test !== null && (typeof test == 'object' || typeof test == 'function');
}

答案 2 :(得分:1)

var test = {};
if(test instanceof Object){
  test.someFun = function () { alert(this); };
  test.someFun(); 
}
jball指出了以下内容:

  

对于检查工作的实例,   左手边的物体应该来自   与右侧相同的范围   宾语。这是因为即使是   常见的JavaScript对象有   不同范围的不同副本,   即window1.String !== window2.String.   (引用MDN

似乎对我有用。因此,如果要在不同范围内进行此检查,则需要使用变通方法:

var test = {};
if(test && (typeof test == 'object' || typeof test == 'function')){
  test.someFun = function () { alert(this); };
  test.someFun(); 
}

我会尽量避免使用iframe。 需要进行空检查,因为typeof(null)等于'object'

编辑:

box9和jball对所有建议的方法做了一些performance testing(+1为此)。我使用过Chrome,Firefox和Internet Explorer。结果如预期。这两种方法最快。在Chrome和Firefox上,typeof版本最快。在Internet Explorer上,instanceof版本最快。但这两种方法之间的速度差异很小。我个人仍然会使用instanceof方法,因为它更清洁。

答案 3 :(得分:1)

美好而简短,只是为了好玩(没有&&|| s):

function isMutable(o) {
   return /(object)|(function)/.test(typeof(o||0));
}

答案 4 :(得分:0)

如果你不确定,为什么不try