Javascript - 类型不适用于动态对象
Javascript - typeof not working for dynamic object
当尚未创建以下子对象时
if(typeof this.obj[child1][child2]!=="undefined"){
}
以上不起作用,但这确实
if(typeof this.obj[child1]!=="undefined"){
}
这是因为typeof
的优先级低于[]
或.
的优先级,所以首先执行[]
并抛出错误:
> typeof foo == "undefined"
true
> typeof foo.bar == "undefined"
ReferenceError: foo is not defined
要检查嵌套属性的长链,您可以使用如下函数:
function hasKeys(obj, keys) {
for(var i = 0; i < keys.length; i++) {
if(typeof obj[keys[i]] == "undefined")
return false;
obj = obj[keys[i]];
}
return true;
}
if(hasKeys(this, ["obj", "child1", "child2"])) ...
或者更好的是,处理异常:
try {
val = this.obj['foo']['bar']['baz'];
} catch(err) {
// deal with undefined val
}
你真的不需要typeof ... 'undefined'
来确定this.obj[child1][child2]
是否undefined
。而是使用:
if (this.obj && this.obj[child1] && this.obj[child1][child2]) {}
如:
var obj = {};
obj.c1 = {};
alert( obj && obj.c1 && obj.c1.c2 ? 'obj.c1.c2 exists' : 'nope');
//=> "nope"
obj.c1.c2 = 1;
alert( obj && obj.c1 && obj.c1.c2 ? 'obj.c1.c2 exists' : 'nope');
//=> "obj.c1.c2 exists"
您可以创建一个函数来确定任何Object
中是否存在某个路径:
function pathExists(root,path){
var pathx = path.constructor === Array && path || path.split(/'./)
, trial
, pathok = true
;
while (pathx.length && pathok) {
trial = pathx.shift();
pathok = (root = root && root[trial] || false, root);
}
return pathok;
}
// usage examples
var obj = {c1:1};
pathExists(obj,'c1.c2'); //=> false
pathExists(obj,'c1'); //=> 1
obj.c1 = { c2: {c3: 3} };
pathExists(obj,['c1','c2','c3']); //=> 3
// your case
if ( pathExists(this,[obj,child1,child2]) ) { /*...*/ }
将其
用于第一种情况 -
if(this.obj[child1] && typeof this.obj[child1][child2]!=="undefined"){
}
这不起作用,因为它会抛出 JavaScript 错误。它会抛出这个.obj[child1] 是未定义的。您应该始终检查它是否也已定义。
if(this.obj[child1] && typeof this.obj[child1][child2]!=="undefined"){
}
编辑
如果要提高代码的可读性,可以使用如下函数:
var test = {child1: {child2: "TEST"}};
alert(is_defined(test, 'child1', 'child2')); // true
alert(is_defined(test, 'child1', 'child2', 'child3')); // false
function is_defined(obj) {
if (typeof obj === 'undefined') return false;
for (var i = 1, len = arguments.length; i < len; ++i) {
if (obj[arguments[i]]) {
obj = obj[arguments[i]];
} else if (i == (len - 1) && typeof obj[arguments[i] !== 'undefined']) {
return true;
} else {
return false;
}
}
return true;
}
使用 undefined
而不是 "undefined" 或尝试 null。
相关文章:
- 使用推动创建动态对象
- 在主要的JavaScript引擎中,在JavaScript关联数组(动态对象属性)中检索/插入的复杂性是多少
- 从表单到 Ajax 的动态对象访问
- JavaScript node.js 中 pug (jade) 模板上的动态对象键
- 动态对象遍历与 NodeJS
- 在JS中创建动态对象
- jQuery param动态对象名称
- 访问动态对象:javascript/jquery
- JavaScript 动态对象范围
- 如何在 QML 中发生相同事件后创建/销毁动态对象
- 创建动态对象(作为函数(..))
- 如何在 JavaScript 中制作动态对象
- jQuery 事件绑定不适用于多个动态对象
- 将静态对象转换为动态对象
- 访问多个动态对象 jQuery
- Javascript - 类型不适用于动态对象
- Javascript-动态对象键(第二个键)
- 用javascript为数组创建动态对象
- JavaScript动态对象键ejs
- 在jQuery中的动态对象上使用.each