测试var
是否包含不可变数据(即string
,number
,boolean
,null
,{的最快,最干净的方法是什么? {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
答案 0 :(得分:7)
另一个简短的选择:
function isPrimitive(value) {
return Object(value) !== value;
}
它是如何运作的:
如果value
是可转换为对象的原始值,例如Number
,String
或Boolean
,严格相等运算符将返回true,因为Object
constructor called as a function会将值转换为“包装对象”:
typeof 5; // "number"
typeof Object(5); // "object", a wrapped primitive
5 === Object(5); // false
如果值是不可转换为Object的基元,例如null
或undefined
,则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
?