题目描述
根据包名,在指定空间中创建对象
输入描述:
namespace({a: {test: 1, b: 2}}, ‘a.b.c.d’)
输出描述:
{a: {test: 1, b: {c: {d: {}}}}}
答案
function namespace(oNamespace, sPackage) {
var package = sPackage.split('.');
var obj = oNamespace;//类似于obj指向oNamespace的头节点,
for (var i = 0; i < package.length; ++i) {
if (typeof obj[package[i]] !== 'object') {
obj[package[i]] = {};
}
obj = obj[package[i]];//这里obj也为null,因为指向了尾节点,所以下面那个代码不行,仔细体会一下
}
return oNamespace;
}
注意点:
- JavaScript里的变量类型为值类型和引用类型,此题为对象,即引用类型。
- 对象可以无限赋值,而此题巧妙的利用了这一特性,通过var obj = oNamespace;然后再返回oNamespace即从开始位置返回。
而下面这种方式则返回对象为空,注意对比
function namespace(oNamespace, sPackage) {
var package = sPackage.split('.');
//var obj = oNamespace;
for (var i = 0; i < package.length; ++i) {
if (typeof oNamespace[package[i]] !== 'object') {
oNamespace[package[i]] = {};
}
oNamespace = oNamespace[package[i]];
}
return oNamespace;
}
进一步发散思维,还可以这样玩(也是可以通过的,因为返回的是头指针,注意体会)~~
function namespace(oNamespace, sPackage) {
var package = sPackage.split('.');
var obj = oNamespace;
for (var i = 0; i < package.length; ++i) {
if (typeof oNamespace[package[i]] !== 'object') {
oNamespace[package[i]] = {};
}
oNamespace = oNamespace[package[i]];
}
return obj;
}