$g.$utils.hash = {
    get(win) {
        return decodeURIComponent((win || top).location.hash.substr(1));
    }, 
    getSearchAndHash(win) {
        win || (win = top);
        return decodeURIComponent(win.location.search + win.location.hash);
    }, 
    set(hash, win, isReload) {
        hash || (hash = "");
        win = win || top;
        win.location.hash = hash;
        isReload && win.location.reload();
    }, 
    addListener(win) {
        (win || window).onhashchange = function () {
            this.location.reload();
        }
    }, 
    
    getUrlParam(name, win, isEncode) {
        var r = (win || top).location.search.substr(1).match(new RegExp("(^|&)" + name + "=([^&]*)(&|$)"));
        if (r != null) {
            return isEncode ? r[2] : decodeURIComponent(r[2]);
        }
        return null;
    }, 
    getUrlParams(url) {
        var reg = /([^=&\s]+)[=\s]*([^&\s]*)/g, ls = url || location.search.substr(1), obj = {};
        while (reg.exec(ls)) obj[RegExp.$1] = decodeURIComponent(RegExp.$2);
        return obj;
    }, 
    setUrlSearch(search, win, isReload) { /*此方法可以点击网页返回按钮*/
        win = win || top;
        win.history.pushState(null, null, search || "./");
        isReload && win.location.reload();
    }, 
    replceUrlSearch(search, win, isReload) { /*此方法无网页返回按钮行为*/
        win = win || top;
        win.history.replaceState(null, null, search || "./");
        isReload && win.location.reload();
    }, 
    getFileName() {
        var lp = location.pathname, fn = lp.substr(lp.lastIndexOf("/") + 1);
        return fn.substr(0, fn.lastIndexOf("."));
    }
};