ife 2015 task2记录(1)

1. 数据类型

// 判断arr是否为一个数组,返回一个bool值
function isArray(arr) {
    // your implement
}

// 判断fn是否为一个函数,返回一个bool值
function isFunction(fn) {
    // your implement
}

思路:基本类型的判别用typeOf(),引用类型的判别用instanceOf()
实现

// 1. 判断arr是否为一个数组,返回一个bool值
function isArray(arr) {
    // your implement
    console.log(arr instanceof Array);
}

// 判断fn是否为一个函数,返回一个bool值
function isFunction(fn) {
    // your implement
    console.log(typeof fn == 'function');
}

2. 深度克隆

// 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝
// 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、Object对象。不会包含函数、正则对象等
function cloneObject(src) {
    // your implement
}

// 测试用例:
var srcObj = {
    a: 1,
    b: {
        b1: ["hello", "hi"],
        b2: "JavaScript"
    }
};
var abObj = srcObj;
var tarObj = cloneObject(srcObj);

srcObj.a = 2;
srcObj.b.b1[0] = "Hello";

console.log(abObj.a);
console.log(abObj.b.b1[0]);

console.log(tarObj.a);      // 1
console.log(tarObj.b.b1[0]);    // "hello"

思路:一开始的想法是进行循环,在循环内对数据类型进行限制,再创建一个变量,用原来的值对它进行赋值。
这里忽略了很重要的一点,js中,基本类型直接存储,引用类型存放的是指针,指向对象。
也就是说,直接新建一个变量进行copy,基本类型可以成功,引用类型则是只copy了指针,该指针还是指向原变量,原变量发生变化时,新变量也会跟着变化。因此这里要根据基本类型和引用类型进行分类。
实现:

function checkedType(src) {
    return Object.prototype.toString.call(src).slice(8, -1);
    }
function cloneObject(src) {
    //your implement
    var copy;
    if (src instanceof Array) {
        copy = [];
        for (var i=0; i < src.length; i++) {
            copy[i] = src[i];
        }
    } else if (typeof src == 'object') {
        copy = {};
        // for (var i=0; i < src.length;i++) {
        //     copy[i] = cloneObject(src[i]);
        // }
        for (var i in src) {
            copy[i] = cloneObject(src[i]);
        }
    } else {
        copy = src;
        return copy;
    }

反思:过程中对object用了length属性,一直无法输出结果。原因是单个对象没有length属性,object.length == ‘undefined’。数组、字符串、函数、正则表达式有length属性。因此,这里使用了for…in函数,具体看这篇博客for/in函数

3. 数组去重

// 对数组进行去重操作,只考虑数组中元素为数字或字符串,返回一个去重后的数组
function uniqArray(arr) {
    // your implement
}

// 使用示例
var a = [1, 3, 5, 7, 5, 3];
var b = uniqArray(a);
console.log(b); // [1, 3, 5, 7]

思路:对数组中的元素进行排序后再去重,会更容易。编码时要尽可能将变量有序化。
实现

// 对数组进行去重操作,只考虑数组中元素为数字或字符串,返回一个去重后的数组
function findAll(num) {
    var pos = arr.indexOf(num);
    return arr.indexOf(num, pos+1);
}
function uniqArray(arr) {
    arr.sort();
    for (var i=0; i < arr.length;i++) {
        if (arr[i]==arr[i+1]) {
            arr.splice(i+1,1);
        }
    }
    return arr;

}

4. trim函数

// 很多同学肯定对于上面的代码看不下去,接下来,我们真正实现一个trim
// 对字符串头尾进行空格字符的去除、包括全角半角空格、Tab等,返回一个字符串
// 尝试使用一行简洁的正则表达式完成该题目
function trim(str) {
    // your implement
}

// 使用示例
var str = '   hi!  ';
str = trim(str);
console.log(str); // 'hi!'

思路:使用正则表达式。空格的正则表达式是\s
实现

function trim(str) {
    // your implement
    return str.replace(/\s*|\s*/,'');  
}

5. 数组遍历

// 实现一个遍历数组的方法,针对数组中每一个元素执行fn函数,并将数组索引和元素作为参数传递
function each(arr, fn) {
    // your implement
}

// 其中fn函数可以接受两个参数:item和index

// 使用示例
var arr = ['java', 'c', 'php', 'html'];
function output(item) {
    console.log(item)
}
each(arr, output);  // java, c, php, html

// 使用示例
var arr = ['java', 'c', 'php', 'html'];
function output(item, index) {
    console.log(index + ': ' + item)
}
each(arr, output);  // 0:java, 1:c, 2:php, 3:html

思路: for循环遍历,每一次都执行一次fn。
实现

function each(arr, fn) {
    // your implement
    // for循环遍历,在每一层执行一次fn
    for (var i=0; i < arr.length; i++) {
        fn(arr[i], i);
    }
}

6. 获取元素数量

// 获取一个对象里面第一层元素的数量,返回一个整数
function getObjectLength(obj) {}

// 使用示例
var obj = {
    a: 1,
    b: 2,
    c: {
        c1: 3,
        c2: 4
    }
};
console.log(getObjectLength(obj)); // 3

思路:使用for…in函数遍历object,用一个变量记录数量。
实现

function getObjectLength(obj) {
    var num = 0;
    for (i in obj) {
        num++;
    }
    return num;
}

你可能感兴趣的:(JavaScript)