百度ife前端2015春task练习记录01

本文记录了在百度IFE前端任务中,涉及的JavaScript数据类型判断、深度克隆、数组去重、正则表达式、DOM操作等知识点的实现与思考。通过实例展示了如何使用instanceof、正则表达式去除字符串首尾空格,以及DOM事件处理和AJAX请求等技术。同时,文章还探讨了数组和对象遍历的最佳实践,以及针对IE浏览器的版本检测。代码已上传至GitHub。
摘要由CSDN通过智能技术生成

所有代码可以在我的Github中找到,记录从task002开始。

判断各种数据类型

要求

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

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

思路

最开始使用typeof()方法,然后发现在判断array时返回是object,与判断对象类型时重合。在查阅资料后,使用了一种更为通用的方法。

实现

function getVarType(data) {
   
    if (data === undefined) {
        return 'Undefined';
    }
    if (data === null) {
        return 'Null';
    }
    return Object.prototype.toString.call(data).slice(8, -1).toLowerCase();
};

function isArray(arr) {
   
    if (getVarType(arr) == 'array') {
        return true;
    } else return false;
}

function isFunction(fn) {
   
    if (getVarType(fn) == 'function') {
        return true;
    } else return false;
}

补充

除此之外,还有instanceof和constructor等方法
typeof()方法,对于基本类型的判断十分有用。

typeof(123);//"number"
typeof("123");//"string"
typeof(false);//"boolean"
typeof(undefined);//"undefined"

//注意null和function得到的值
typeof(null);//"object"
typeof(function(){
   });//"function"

上面给出了所有使用typeof()比较特殊的结果,除此之外,所用的引用类型使用该方法得出的结果都是object
instanceof适用于判断引用类型。
MDN中这样描述:

instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。

并且看定义的语法是这样的:

object instanceof constructor

即是说,instanceof左边的,是一个对象,而右边必须是一个构造函数。如果左边是一个基本类型,那不管右边是什么,返回的一定是false
那么这个就可以用来判断引用类型了,例如

var arr = [1,2,3];
var date = new Date();
arr instanceof Array;//true
date instanceof Date;//true

//这里自定义一个构造函数
function Person(){
   }
var franose = new Person();
franose instanceof Person;//true;

深度克隆

要求

// 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝
// 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、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"

思路

首先对判断参数类型,对于类型String, Boolean, Number,只需要新建一个变量,并将参数的值赋值给新建的变量即可;对于类型Data, Array, Object则要分情况。
Data():new一个Date对象,使用getTime()方法得到原对象的值,再使用setTime()给新建的对象赋值。
Array():new一个Array对象,使用for循环对原数组遍历,再依次赋值到新建的Array对象中。
Object():new一个对象,对对象中的属性遍历,使用递归对属性进行赋值,多层属性也可以使用递归解决。

实现

function cloneObject(data) {
   
    var objectType = getVarType(data);
    //the object for cloning is native object
    if (objectType == "null" || objectType == "undefined") {
        return data;
    }

    if (objectType == "string" || objectType == "number" || objectType == "boolean") {
        var copy = data;
        return copy;
    } else if (objectType == "date") {
        var copy = new Date();
        copy.setTime(data.getTime());
        return copy;
    } else if (objectType == "array") {
        var c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值