2. JavaScript数据类型及语言基础(一)   

2.1 任务描述

  • 创建一个JavaScript文件,比如util.js
  • 实践判断各种数据类型的方法,并在util.js中实现以下方法: 
    // 判断arr是否为一个数组,返回一个bool值
    function isArray(arr) {
    // your implement
    } // 判断fn是否为一个函数,返回一个bool值
    function isFunction(fn) {
    // your implement
    }
解题思路:
     1.说道判断类型,第一个想到的就是typeof进行判断,但是typeof的作用实在有限!判断的结果只有六个:string,number,boolean,function,undfined,object;
而且中间存在bug,console.log(typeof null) = object;而且对于Array,返回的全是obejct。typeof存在很大的局限性!
     2. 第二种方法,利用instanceof。如var a = []; console.log(a instanceof Array) //ture ;console.log(a instanceof Object) //ture;因为Array是Object的一个子类,所以instanceof也有很大的局限性!
     3.最后介绍一种官方认可的方法,而且比较有效的方法,Object.prototype.toSting.call(arr) == "[object Array]";这个方法可以判断所有的类型!
代码如下:

// 判断arr是否为一个数组,返回一个bool值
function isArray(arr) {
// your implement
return Object.prototype.toString.call(arr) === "[object Array]";
} // 判断fn是否为一个函数,返回一个bool值
function isFunction(fn) {
// your implement
return Object.prototype.toString.call(fn) === "[object function]";
}
 
  • 了解值类型和引用类型的区别,了解各种对象的读取、遍历方式,并在util.js中实现以下方法:

// 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝// 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、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); // 1console.log(tarObj.b.b1[0]); // "hello"
 
解题思路:
     1.首先要知道,js中数据分为原始类型和引用类型,对于原始类型,可直接进行复制!对于引用类型,引用的是指向原始对象的指针,所以原始对象进行改变的时候,引用类型也会跟着改变!《JavaScript高级程序设计》是这样解释的:当从一个变量向另一个变量复制引用类型的值时,同样也会讲存储在变量对象中的值复制一份放到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另一个变量!
     2.引用类型中的date也能够直接引用,所以,首先判断是不是引用类型,如果不是,则直接复制!如果是引用类型,在进行判断,如果是date,则直接复制,如果不是数组,在进行判断,判断是为object还是array;
     3.在复制的时候,还要考虑是继承的属性还是自身的属性!
     ps:函数对象苏然是引用类型,但是函数的克隆通过浅克隆就行!     
代码如下:
// 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝
// 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、Object对象。不会包含函数、正则对象等
function cloneObject(src) {
// your implement
var result;//定义克隆后的结果
if (typeof(src) == "object" ) {//判断是否是引用类型
if (Object.prototype.toString.call(src) === "[object Data]") {//如果是data类型,直接克隆
result = src;
}
else {
resule = (Object.prototype.toString.call(src) === "[object Array]")?[]:{};//先判断对象的类型
if (src.hasOwnProperty(i)) {//判断是否为对象自身的属性
if (typeof src[i] == "object") {//如果为对象,遍历复制
result[i] = cloneObject(src[i]);
}
else {//如果为数组,一对一克隆!
result[i] = src[i];
}
}
}
}
else {//当为原始类型时,直接复制!
result = src;
}
}
  • 学习数组、字符串、数字等相关方法,在util.js中实现以下函数
// 对数组进行去重操作,只考虑数组中元素为数字或字符串,返回一个去重后的数组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 trim(arr) {
// your implement
} // 使用示例var str = ' hi! ';
str = trim(str);
console.log(str); // 'hi!' // 实现一个遍历数组的方法,针对数组中每一个元素执行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 // 获取一个对象里面第一层元素的数量,返回一个整数function getObjectLength(obj) {} // 使用示例var obj = {
a: 1,
b: 2,
c: {
c1: 3,
c2: 4
}
};
console.log(getObjectLength(obj)); //
解题思路:
     1.去重,直接遍历数组,利用数组的indexOf方法,判断新的数组是否存在数组中的每一个位置的值,如果不存在则添加进数组,反正抛弃。
     2.去除开头和结尾的空白,直接利用正则表达式,然后replace将匹配到的开头和结尾的空白字符给替换!
     3.对于每个元素都执行一次,见代码!
     4.首先定义一个count,用来存放keys出现的次数,因为keys的值都在对象的第一层!
代码如下:
// 对数组进行去重操作,只考虑数组中元素为数字或字符串,返回一个去重后的数组
function uniqArray(arr) {
// your implement
var result = [];//定义一个新的数组,用于存放没有重复的元素
for (var i = 0; i < arr.length; i++) {
if(result.indexOf(arr[i]) = -1) {
result.push(arr[i]);
}
}
return result;
} // 很多同学肯定对于上面的代码看不下去,接下来,我们真正实现一个trim
// 对字符串头尾进行空格字符的去除、包括全角半角空格、Tab等,返回一个字符串
// 尝试使用一行简洁的正则表达式完成该题目
function trim(str) {
// your implement
var result = "";
result = str.replace(/^\s+|\s+$/g,"");
return result;
} // 实现一个遍历数组的方法,针对数组中每一个元素执行fn函数,并将数组索引和元素作为参数传递
function each(arr, fn) {
// your implement
if(!isArray(arr)){
return false;
}
if(!isFunction(fn)){
return false;
}
for (var i = 0; i < arr.length; i++) {
fn(arr[i],i);
}
} // 获取一个对象里面第一层元素的数量,返回一个整数
function getObjectLength(obj) {
var count = 0;
for (var keys in obj) {
count++;
}
return count;
}
 
  • 学习正则表达式,在util.js完成以下代码
// 判断是否为邮箱地址
function isEmail(emailStr) {
// your implement
} // 判断是否为手机号
function isMobilePhone(phone) {
// your implement
}
参考资料:  
     正则表达式30分钟入门教程http://deerchao.net/tutorials/regex/regex.htm
代码如下:
 
//判断是否是邮箱地址
function isEmail(str){
var reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/;
return reg.test(str);
}
// 判断是否为手机号
function isMobilePhone(phone) {
// your implement
var reg = /^1[3-8]\d{9}/
return reg.text(phone);
}
 

百度前端技术学院2015JavaScript基础部分代码实现的更多相关文章

  1. 百度前端技术学院2015JavaScript基础部分-BOM

    5.1 任务描述 实现以下函数 // 判断是否为IE浏览器,返回-1或者版本号 function isIE() { // your implement } // 设置cookie function s ...

  2. 百度前端技术学院2015JavaScript基础部分实现自己的小型jQuery

    // 实现一个简单的Query function $(selector) { ); if (firstChar == "#") { var len = selector.split ...

  3. 百度前端技术学院-基础-day1

    2020.9.14 今天我开始在百度前端技术学院学习基础课程. 先立一个Flag,希望我能在30天之内学完前四十天的课程,后续课程再一天一节. 第一天的内容主要是提供了很多基础学习的网页,比如W3sc ...

  4. 百度前端技术学院(IFE)2016春季学期总结

    今天(5月16日)作为第八个提交者提交了任务五十:RIA微型问卷管理平台 这样一个综合性的大任务,宣告我的IFE春季学期课程学习顺利完成.其实任务五十并不复杂,现在再让我来做,可能一周不到就写出来了, ...

  5. 百度前端技术学院—-小薇学院(HTML+CSS课程任务)

    任务一:零基础HTML编码 课程概述 作业提交截止时间:04-24 重要说明 百度前端技术学院的课程任务是由百度前端工程师专为对前端不同掌握程度的同学设计.我们尽力保证课程内容的质量以及学习难度的合理 ...

  6. 百度前端技术学院task1.10

    任务十:Flexbox 布局练习 面向人群: 有一定HTML及CSS基础的同学 难度: 中 重要说明 百度前端技术学院的课程任务是由百度前端工程师专为对前端不同掌握程度的同学设计.我们尽力保证课程内容 ...

  7. 通过Github Pages在线查看百度前端技术学院完成的任务成果

    前言 .note-content {font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHe ...

  8. 百度前端技术学院-task1.3源代码

    因为其中有图片,所以就给有图片的位置加了边框和设置了大小,这样哪怕图片不显示也可以知道在哪里. <!DOCTYPE html> <html> <head> < ...

  9. 百度前端技术学院-基础-day2

    2020.9.15 今天是学习前端基础技术的第二天,今天制作了一个在线简历,纯html的那种.帮助我复习了以前的基础知识,也增加了新的知识点,比如制作列表可以用fieldset来整合数据. 我的在线简 ...

随机推荐

  1. (十二)select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

    select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型:int select(int maxfd,fd_set *rdset ...

  2. 小程序 web 端实时运行工具

    微信小程序 web 端实时运行工具 https://chemzqm.github.io/wept/

  3. appium案例

    import unittest from time import sleep from appium import webdriver import desired_capabilities clas ...

  4. 今天初步了解了informix的锁的概念

     今天初步了解了informix的锁的概念  2005-06-12 01:07:05 分类: IT生活 在load的时候,碰到好几次"-134 ISAM Error :no more loc ...

  5. iptables 端口转发

    sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

  6. javascript中运算符的优先级

    运算符优先级 JavaScript中的运算符优先级是一套规则.该规则在计算表达式时控制运算符执行的顺序.具有较高优先级的运算符先于较低优先级的运算符执行.例如,乘法的执行先于加法. 下表按从最高到最低 ...

  7. 【原创】xgboost 特征评分的计算原理

    xgboost是基于GBDT原理进行改进的算法,效率高,并且可以进行并行化运算: 而且可以在训练的过程中给出各个特征的评分,从而表明每个特征对模型训练的重要性, 调用的源码就不准备详述,本文主要侧重的 ...

  8. php empty,isset,is_null比较(差异与异同)

    php empty,isset,is_null比较(差异与异同)  http://www.cnblogs.com/chengmo/archive/2010/10/18/1854258.html

  9. Windows安装MySQL5.7.17

    1. 在MySQL官网 http://dev.mysql.com/downloads/mysql/ 上面下载ZIP安装包(第二个:Windows (x86, 64-bit), ZIP Archive) ...

  10. Java—图形处理

    抽象窗口化工具(AWT)为图形用户界面编程提供API编程接口,使得Java可以提供较好的图形用户界面. AWT把图形处理分为两个层次:一是处理原始图形,这一层较原始,图形直接以点.线和面的形式画到界面 ...