第一种解法:递归
	// 逻辑过程
    // 遍历传进的对象中有哪些属性 每次把找到的属性去数组中找 找到了就创建对象 没找到就遍历下个属性
    // 是不是数组的最后一个元素
    // 如果不是 就截取未遍历的部分 递归调用

    // 第一次 namespace({a: {test: 1, b: 2}}, 'a.b.c.d')
    // 字符串长度小于等于1吗 不 拆成数组 取arr[0]中的a 再把arr[0]=空字符串
    // 遍历{a: {test: 1, b: 2}}对象 有a属性吗? 有a属性 a属性是对象吗 是 把未检验的字符串截取出来 对a递归调用

    // 第二次 namespace(a: {test: 1, b: 2}, 'b.c.d')
    // 字符串长度小于等于1吗 不 拆成数组 取arr[0]中的b 再把arr[0]=空字符串
    // 遍历a: {test: 1, b: 2}对象 有b属性吗? 有b属性 b属性是对象吗 不是 等于一个空对象
    // 把未检验的字符串截取出来 对b递归调用

    // 第三次 namespace(b:{}, 'c.d')
    // 字符串长度小于等于1吗 不 拆成数组 取arr[0]中的c 再把arr[0]=空字符串
    // 遍历b:{}对象 有c属性吗? 没有c属性 等于一个空对象 把未检验的字符串截取出来   对a递归调用

    // 第四次 namespace(c:{}, 'd')
    // 字符串长度小于等于1吗 对 c.d={} return c
    
    
    代码:
    function namespace(oNamespace, sPackage) {
        if (sPackage.length <= 1) {
            oNamespace[sPackage] = {}
            return oNamespace
        }
        let arr = sPackage.split(".")
        if (typeof oNamespace[arr[0]] != "object") {
            oNamespace[arr[0]] = {}
        }
        oNamespace[arr[0]] = namespace(oNamespace[arr[0]], sPackage.slice(2))
        return oNamespace
    }
    
	第二种解法
    // 拆成数组以后 遍历数组
	// 通过一个临时变量存放当前被遍历到的元素
	// 如果不是对象或者没有这个属性 就创建一个空对象给该属性


	代码:       
    function namespace(oNamespace, sPackage) {
        let arr = sPackage.split(".")
        let tmp = oNamespace
        // k是下标
        for (let k in arr) {
            // 如果当前对象没有这个属性 就等于一个空对象
            if (typeof tmp[arr[k]] !== "object") {
                tmp[arr[k]] = {}
            }
            // 把临时对象变为 遍历到的的对象
            tmp = tmp[arr[k]]
            // 下次遍历就看这个临时对象里有没有被遍历到的属性
        }
    }