1. 修改this指向
// apply修改this作用域
function bindThis(f, oTarget) {
return function () {
return f.apply(oTarget,arguments)
}
}
// call修改this作用域
function bindThis(f, oTarget) {
return function (){
return f.call(oTarget,...arguments)
}
}
// bind修改this作用域
function bindThis(f, oTarget) {
return function (){
return f.bind(oTarget,...arguments)()
}
}
// 或者直接简写
function bindThis(f, oTarget) {
return f.bind(oTarget)
}
几种
- call 和 apply 返回函数立即执行的结果
- bind 不会立即执行
- call接收是参数列表, apply接收一个参数数组
2. 获取url参数
获取 url 中的参数
- 指定参数名称,返回该参数的值 或者 空字符串
- 不指定参数名称,返回全部的参数对象 或者 {}
- 如果存在多个同名参数,则返回数组
- 不支持URLSearchParams方法
输入:
http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe key
输出:
[1, 2, 3]
function getUrlParam(sUrl, sKey) {
let res = {};
let params = sUrl.split('?')[1].split('#')[0].split('&');
params.forEach(ele => {
let [key, val] = ele.split('='); //
if(res[key]){
res[key] = [...res[key], val];
}else{
res[key] = val;
}
})
if(sKey === undefined) return res;
else{
if(res[sKey] === undefined) return ''
else return res[sKey];
}
}
ES6的写法:
3. dom节点的查找
描述 查找两个节点的最近的一个共同父节点,可以包括节点自身
输入描述: oNode1 和 oNode2 在同一文档中,且不会为相同的节点
function commonParentNode(oNode1, oNode2) {
if(oNode1.contains(oNode2)){
return oNode1;
}else{
return commonParentNode(oNode1.parentNode, oNode2);
}
}
4. 根据包名,在指定空间中创建对象
输入描述: namespace({a: {test: 1, b: 2}}, 'a.b.c.d')
输出描述: {a: {test: 1, b: {c: {d: {}}}}}
function namespace(oNamespace, sPackage) {
let scope = sPackage.split('.');
let ns = oNamespace;
for(let i = 0; i < scope.length; i ++){
// 如果对象中没有该元素,或者不是对象,那么就置为空对象
if(!ns.hasOwnProperty(scope[i]) || Object.prototype.toString.call(ns[scope[i]]) !== '[object Object]'){
ns[scope[i]] = {};
}
//继续往下找
ns = ns[scope[i]];
}
return oNamespace;
}
5. 数组去重
// 方法一:终极思路
Array.prototype.uniq = function () {
return [...new Set(this)]
}
Array.prototype.uniq = function () {
let arr = [];
let flag = true;
this.forEach(value => {
if(arr.indexOf(value) === -1) { //判断的是arr新数组
if(value !== value) {
if(flag) {
arr.push(value);
flag = false;
}
}else{
arr.push(value)
}
}
})
return arr;
}
主要判断的是NaN , indexof(NaN) -1
6. 斐波那契
// 递归思路
function fibonacci(n) {
if(n === 0) return 0
if(n === 1 || n === 2) return 1
return fibonacci(n-1) + fibonacci(n-2)
}
7 时间格式化输出
function formatDate(t, str){
let year = '' + t.getFullYear();
let month = t.getMonth() + 1;
let day = t.getDate();
let hour = t.getHours();
let minutes = t.getMinutes();
let second = t.getSeconds();
let week = ['日', '一', '二', '三', '四', '五', '六'];
let date = {
'yyyy': year,
'yy': year.slice(2),
'MM': ten(month),
'M': month,
'dd': ten(day),
'd': day,
'HH': ten(hour),
'H': hour,
'hh': ten(hour % 12),
'h': hour % 12,
'mm': ten(minutes),
'm': minutes,
'ss': ten(second),
's': second,
'w': week[t.getDay()]
}
for(let key in date){
str = str.replace(key, date[key])
}
return str;
}
let ten = num => num >= 10 ? num : '0' + num
8 获取字符串的长度
function strLength(s, bUnicode255For1) {
if(bUnicode255For1) return s.length;
let len = s.length;
for(let i = 0; i < s.length; i ++) {
if(s[i].charCodeAt() > 255) len ++;
}
return len;
}
9 邮箱字符串匹配
function isAvailableEmail(sEmail) {
return /^[\w\.]+@\w+\.\w+/.test(sEmail)
}
10 颜色字符串转换
function rgb2hex(sRGB) {
let reg = sRGB.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)/)
if(!reg) return sRGB;
// 字符串拼接
let str = '#';
for(let i = 1; i < reg.length; i ++) {
let m = parseInt(reg[i]);
if(m >=0 || m <= 255){
str += (m >= 16 ? m.toString(16) : '0' + m.toString(16));
}else{
return sRGB;
}
}
return str;
}