【javascript】常用方法(持续更新)

var json = {
    "Adam": {
        "name": "Adam",
        "sex": "man",
        "age": 18,
        "hobby": ["Ping-Pang", "basketball"],
    },
    "Jack": {
        "name": "Jack",
        "sex": "man",
        "age": 20,
        "hobby": ["Ping-Pang", "basketball"],
    }
};;
console.log(JSON.stringify(json));

function duplicates(arr) {
    var result = [];
    arr.forEach(function(elem) {
        if (arr.indexOf(elem) != arr.lastIndexOf(elem) && result.indexOf(elem) == -1) {
            result.push(elem);
        }
    });
    return result;
}
console.log(duplicates([1, 2, 4, 4, 3, 3, 1, 5, 3]));

function square(arr) {
    var newArr = [];
    arr.forEach(function(e) {
        newArr.push(e * e);
    });
    return newArr;
}
console.log(square([1, 2, 3, 4]));

function findAllOccurrences(arr, target) {
    var a = []
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] == target) {
            a.push(i);
        }
    }
    return a;
}
console.log(findAllOccurrences('abcdefabc'.split(''), 'a').sort());

function indexOf(arr, item) {
    var eleIndex = 0;
    arr.forEach(function(e, index) {
        if (e == item) {
            eleIndex = index;
        }
    });
    return eleIndex;
}
console.log(indexOf([1, 2, 3, 4], 3));

console.log(([][
    []
] + [])[+!![]] + ([] + {})[!+[] + !![]]);

vara = ~~2.33;
varb = 2.33 | 0;
varc = 2.33 >> 0;
console.log("vara: " + vara);
console.log("varb: " + varb);
console.log("varc: " + varc);

var a = 12333;
var b = -12.121;
a ^= b;
b ^= a;
a ^= b;
console.log(a);
console.log(b);

console.log(Array(10).fill(Math.ceil(Math.random() * 10)));

function count(start, end) {
    var time = {};
    console.log(start);
    var t = setInterval(function() {
        if (start < end) {
            start++;
            console.log(start);
        } else {
            time.cancel();
        }
    }, 100);
    time.cancel = function() {
        clearInterval(t);
    }
    return time;
}
//console.log(count(1, 20));

function isNumber(obj) {
    return typeof obj === 'number' && !isNaN(obj)
}

function fizzBuzz(num) {
    var config = {
        'threeAndFive': 'fizzbuzz',
        'three': 'fizz',
        'five': 'buzz',
        'emptyAndIsNaN': false,
        'other': num
    };
    if (num % 3 === 0 && num % 5 === 0) {
        return config.threeAndFive;
    } else if (num % 3 === 0) {
        return config.three;
    } else if (num % 5 === 0) {
        return config.five;
    } else if (num === '' || isNumber(num)) {
        return false;
    } else {
        return num;
    }
}
console.log(fizzBuzz(15));

function argsAsArray(fn, arr) {
    return fn(arr[0], arr[1], arr[2]);
}

function fn(greeting, name, punctuation) {
    return greeting + ', ' + name + (punctuation || '!');
}

var arr = ['Hello', 'Ellie', '!'];

console.log(argsAsArray(fn, arr));

function functionFunction(str1) {
    return f = function(str2) {
        return str1 + ', ' + str2;
    }
}
console.log(functionFunction('Hello')('world'));

function makeClosures(arrays, fns) {
    var result = [];
    arrays.forEach(function(obj) {
        result.push(function() {
            return fns(obj);
        })
    });
    return result;
}

function fns(x) {
    return x * x;
}
arrays = [1, 2, 3];
console.log(makeClosures(arrays, fns));

function useArguments() {
    var sum = 0;
    var length = arguments.length;
    for (var i = 0; i < length; i++) {
        sum += arguments[i];
    }
    return sum;
}
console.log(useArguments(1, 2, 3, 4));

function createModule(str1, str2) {
    var obj = {};
    obj.greeting = str1;
    obj.name = str2;
    obj.sayIt = function() {
        return obj.greeting + ',' + obj.name;
    };
    return obj.sayIt();
}
console.log(createModule('hello', 'world'));

function valueAtBit(num, bit) {
    var a = num.toString(2);
    return a[bit - 1];
}
console.log(valueAtBit(128, 8));

function base10(str) {
    return parseInt(str, 2);
}
console.log(base10('11000000'));

function convertToBinary(num) {
    var a = num.toString(2);
    var strstr = '';
    if (a.length < 8) {
        var zeroArr = Array(8 - a.length).fill(0);
        var strArr = zeroArr.join('');
        strstr = strArr + a;
    } else {
        strstr = a;
    }
    return strstr;
}
console.log(convertToBinary(3));

/**
 *  给定一个构造函数 constructor,请完成 alterObjects 方法,将 constructor 的所有实例的 greeting 属性指向给定的 greeting 变量。
 */
function alterObjects(constructor, greeting) {
    constructor.prototype.greeting = greeting;
}
var C = function(name) { this.name = name; return this; };
var obj1 = new C('Rebecca');
alterObjects(C, 'What\'s up');
console.log(obj1.greeting);
/**
 * 给定字符串 str,检查其是否包含数字,包含返回 true,否则返回 false
 */
function containsNumber(str) {
    var flag = false;
    str.split('').forEach(function(e) {
        if (e > '0' && e < '9') {
            flag = true;
        }
    });
    return flag;
}
console.log(containsNumber('abcd'));
/**
 * 给定字符串 str,检查其是否包含连续重复的字母(a-zA-Z),包含返回 true,否则返回 false
 */
function containsRepeatingLetter(str) {
    var length = str.length;
    var flag = false;
    for (var i = 0; i < length - 1; i++) {
        if (str[i] === str[i + 1]) {
            flag = true;
        }
    }
    return flag;
    // return /([a-zA-Z])\1/.test(str);
}
console.log(containsRepeatingLetter('ratlerr'));
/**
 * 给定字符串 str,检查其是否以元音字母结尾
 * 1、元音字母包括 a,e,i,o,u,以及对应的大写
 * 2、包含返回 true,否则返回 false
 */
function endsWithVowel(str) {
    var lastChar = str.charAt(str.length - 1).toLowerCase();
    switch (lastChar) {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
            return true;
        default:
            return false;

    }
}
console.log(endsWithVowel('uiiipE'));
/**
 * 给定字符串 str,检查其是否符合如下格式
 * 1、XXX-XXX-XXXX
 * 2、其中 X 为 Number 类型
 */
function matchesPattern(str) {
    return (/^\d{3}\-\d{3}\-\d{4}$/).test(str);
}
console.log(matchesPattern('123-456-7890'));
/**
 * 给定字符串 str,检查其是否符合美元书写格式
 * 1、以 $ 开始
 * 2、整数部分,从个位起,满 3 个数字用 , 分隔
 * 3、如果为小数,则小数部分长度为 2
 * 4、正确的格式如:$1,023,032.03 或者 $2.03,错误的格式如:$3,432,12.12 或者 $34,344.3
 */
function isUSD(str) {
    var re = /^\$([1-9]\d{0,2}(,\d{3})*|0)(\.\d{2})?$/;
    return re.test(str);
}
/**
 * 获取 url 中的参数
 * 1. 指定参数名称,返回该参数的值 或者 空字符串
 * 2. 不指定参数名称,返回全部的参数对象 或者 {}
 * 3. 如果存在多个同名参数,则返回数组
 */
function getUrlParam(sUrl, sKey) {
    var valueArr = [];
    var paramArr = sUrl.split('?')[1].split('#')[0].split('&');
    var paramObj = {};
    console.log(paramArr);
    if (sKey) {
        //如果存在多个同名参数,则返回数组
        paramArr.forEach(function(e) {
            if (e.split('=')[0] === sKey) {
                valueArr.push(e.split('=')[1]);
            }
        });
        if (valueArr.length == 1) { //返回该参数的值或者空字符串
            return valueArr[0];
        } else if (valueArr.length == 0) {
            return "";
        } else {
            return valueArr;
        }
    } else {
        //不指定参数名称,返回全部的参数对象 或者 {}
        if (paramArr.length === 1 || paramArr === undefined) {
            return paramObj;
        } else {
            // ["key=1", "key=2", "key=3", "test=4"]
            paramArr.forEach(function(e) {
                var key = e.split('=')[0];
                var value = e.split('=')[1];
                if (paramObj.hasOwnProperty(key)) {
                    paramObj[key].push(value);
                } else {
                    paramObj[key] = [value];
                }
            });
            return paramObj;
        }
    }

}
var url = "http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe";
var key = "key";
console.dir(getUrlParam(url));
/**
 * 用 JavaScript 实现斐波那契数列函数,返回第n个斐波那契数。 f(1) = 1, f(2) = 1 等
 */
function fibonacci(n) {
    if (n == 1 || n == 2) {
        return 1;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}
console.log(fibonacci(10));
/**
        按所给的时间格式输出指定的时间
        格式说明
        对于 2014.09.05 13:14:20
        yyyy: 年份,2014
        yy: 年份,14
        MM: 月份,补满两位,09
        M: 月份, 9
        dd: 日期,补满两位,05
        d: 日期, 5
        HH: 24制小时,补满两位,13
        H: 24制小时,13
        hh: 12制小时,补满两位,01
        h: 12制小时,1
        mm: 分钟,补满两位,14
        m: 分钟,14
        ss: 秒,补满两位,20
        s: 秒,20
        w: 星期,为 ['日', '一', '二', '三', '四', '五', '六'] 中的某一个,本 demo 结果为 五
 */
function formatDate(oDate, sFormation) {
    var add0 = function(num) {
        if (num < 10)
            return 0 + "" + num;
        else
            return num;

    }
    var o = {
        "yyyy": oDate.getFullYear(),
        "yy": oDate.getFullYear() % 100,
        "MM": add0(oDate.getMonth() + 1),
        "M": oDate.getMonth() + 1,
        "dd": add0(oDate.getDate()),
        "d": oDate.getDate(),
        "HH": add0(oDate.getHours()),
        "H": oDate.getHours(),
        "hh": add0(oDate.getHours() % 12),
        "h": oDate.getHours() % 12,
        "mm": add0(oDate.getMinutes()),
        "m": oDate.getMinutes(),
        "ss": add0(oDate.getSeconds()),
        "s": oDate.getSeconds(),
        "w": function() {
            var day = ["日", "一", "二", "三", "四", "五", "六"];
            return day[oDate.getDay()];
        }(),
    }
    for (var k in o) {
        sFormation = sFormation.replace(k, o[k]);
    }
    return sFormation;
}
console.log(formatDate(new Date((new Date()).valueOf()), 'yyyy-MM-dd HH:mm:ss 星期w'));
/**
    将 rgb 颜色字符串转换为十六进制的形式,如 rgb(255, 255, 255) 转为 #ffffff
    1. rgb 中每个 , 后面的空格数量不固定
    2. 十六进制表达式使用六位小写字母
    3. 如果输入不符合 rgb 格式,返回原始输入
 */
function rgb2hex(sRGB) {
    var result = ['#'];
    if (!/rgb\(\d+(,\s*\d+){2}\)/.test(sRGB)) {
        return sRGB;
    }
    sRGB.replace(/\d+/g, function($0) {
        result.push(('0' + (+$0).toString(16)).slice(-2));
    });
    return result.join('');
}
console.log(rgb2hex('rgb(5, 252, 255)'));
/**
    css 中经常有类似 background-image 这种通过 - 连接的字符,通过 javascript 设置样式的时候需要将这种样式转换成 backgroundImage 驼峰格式,
    请完成此转换功能
    1. 以 - 为分隔符,将第二个起的非空单词首字母转为大写
    2. -webkit-border-image 转换后的结果为 webkitBorderImage
 */
function ucfirst(str) {
    var str = str.toLowerCase();
    var strarr = str.split(' ');
    var result = '';
    for (var i in strarr) {
        result += strarr[i].substring(0, 1).toUpperCase() + strarr[i].substring(1);
    }
    return result;
}

function removeEmpty(arr) {
    var length = arr.length;
    for (var i = 0; i < length; i++) {
        if (arr[i] == '') {
            arr.splice(i, 1);
        }
    }
    return arr;
}

function cssStyle2DomStyle(sName) {
    var strArr = removeEmpty(sName.split('-'));
    var newArr = [];
    strArr.forEach(function(e, index) {
        if (index != 0) {
            newArr.push(ucfirst(e));
        } else {
            newArr.push(e.toLowerCase());
        }

    });
    return newArr.join('');
}
console.log(cssStyle2DomStyle('webkit-border-image'));
/**
    统计字符串中每个字符的出现频率,返回一个 Object,key 为统计字符,value 为出现频率
    1. 不限制 key 的顺序
    2. 输入的字符串参数不会为空
    3. 忽略空白字符
    输入: 'hello world'
    输出: {h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1}
 */
function count(str) {
    var obj = {};
    var newArr = str.replace(/\s+/g, "").split('');
    newArr.forEach(function(e) {
        obj[e] = obj.hasOwnProperty(e) ? obj[e] + 1 : 1;
    });
    return obj;
}
var countStr = 'hello world';
console.log(count(countStr));
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容