IFE2015task2自学总结
---恢复内容开始---
1.判断arr是否为一个数组,返回一个bool值
function isArray(arr) {
return object.prototype.toString.call(arr) == "[object Array]";
}
jvascript内置的类型检查机制并非完全可靠(详见高程22.1.1)。看到问题第一反应是利用typeof操作符,但是typeof仅仅针对基础类型有效,instanceof操作符则存在多个全局作用域。调用Object的toString()方法返回一个[object NativeConstructorName]格式的字符串,每个类在内部都有一个[[class]]属性,这个属性就指定上述字符串中的构造函数名由于原生数组的构造函数名与全局作用域无关,因此利用toString()就能保证返回的值一致。
2.判断fn是否为一个函数,返回一个bool值
function isFunction(fn) {
return Object.prototype.toSting.call(fn) == "[object Function]"
}
还是原来的配方,需要注意的是IE中以COM对象形式实现任何函数,isFunction返回的都是false(因为他们不是原生的js函数)
so:
function isFunction(fn){ return typeof(fn)==='function'; }
利用这个配方还可以检测某个值是不是正则:
function isRegExp(reg) { return Object.prototype.toSting.call(reg) == "[object RegExp]";
}
3.使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝
// 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、Object对象。不会包含函数、正则对象等
浅度克隆:原始类型为值传递,对象类型仍为引用传递。
深度克隆:所有元素或属性均完全复制,与原对象完全脱离,也就是说所有对于新对象的修改都不会反映到原对象中。
function CloneObject(src){ function Clone(){} Clone.prototype = src; var o = new Clone(); for(var k in o){ if(typeof o[k] == "object") { o[a] = cloneObject(o[k]); } } return o; }
4.学习数组、字符串、数字等相关方法,在util.js
中实现以下函数
4.1数组去重
老生常谈的一种问题,相信大部分人都已经会自己解决
第一种方法使用indexOf()方法,dangdangdang上代码
function uniqArray(arr) { var result = []; //遍历数组 for(var i = 0 ;i<arr.length;i++){ if(result.indexOf(arr[i]) ==-1){ result.push(arr[i]); } } return result; // your implement }
第二种方法:双层循环,外层循环元素,内层循环时比较值 如果有相同的值则跳过,不相同则push进数组
function uniqArray(arr) { var result = []; //遍历数组 for(var i = 0 ;i<arr.length;i++){ for(var j= i+1;j<arr.length;j++){ if(arr[i]===arr[j]){ j = ++i; } } result.push(arr[i]); } return result; // your implement }
哟,接下来是好东西哟,ES6的
function dedupe(array){ return Array.from(new Set(array)); }
怎么回事怎么回事,代码怎么这么少,我也不知道,ES6我都没看过,这是抄的!!!!!
ES6好像有个箭头函数,这个转换箭头函数会不会更少?
还有排序后相邻去除法 数组下标判断法 等太多了
4.2
// 中级班同学跳过此题 // 实现一个简单的trim函数,用于去除一个字符串,头部和尾部的空白字符 // 假定空白字符只有半角空格、Tab // 练习通过循环,以及字符串的一些基本方法,分别扫描字符串str头部和尾部是否有连续的空白字符,并且删掉他们,最后返回一个完成去除的字符串
嗨呀好气啊,谁让我是插班生呢(字体大点看的真清楚),半角空格是什么意思,,,(
全角占两个字节,半角占一个字节,半角全角主要是针对标点符号来说的,全角标点占两个字节,半角占一个字节.
)就这意思
function trim(str) { // your implement var newStr=''; if (str.charAt(0)==" ") { for(var i = 0;i<str.length;i++){ if(str.charAt(i)!==" "){ newStr=str.substring(i); break; } } } if (newStr.charAt(str.length-1)==" ") { for(var j = newStr.length-1;j>=0;j--){ if(newStr.charAt(j)!==" "){ newStr=str.substring(0,j+1); break; } } } return newStr; }
// 很多同学肯定对于上面的代码看不下去,接下来,我们真正实现一个trim // 对字符串头尾进行空格字符的去除、包括全角半角空格、Tab等,返回一个字符串 // 尝试使用一行简洁的正则表达式完成该题目 function trim(str){ var pattern = /^\s+|\s+$/g;
if (pattern.test(str)) { return str.replace(pattern,""); }else{ return str; } }
7.
// 实现一个遍历数组的方法,针对数组中每一个元素执行fn函数,并将数组索引和元素作为参数传递
function each(arr, fn) { for(var i = 0;i<arr.lrngth;i++){ fn(arr[i],i); } }
8.
// 获取一个对象里面第一层元素的数量,返回一个整数
function getObjectLength(obj) { var length = 0; for(var propName in obj){ if(obj.hasOwnProperty(propName)){ length++; } } return length; }
9.
// 判断是否为邮箱地址(正则真的很恶心,密密麻麻的QAQ)
function isEmail(emailStr) { // your implement var pattern = /^\w+\@+\w+\.([A-Za-z]{2,4})$/; if(!pattern.test(emailStr)){ alert("E-mail有误,请重填"); return false; } }
// 判断是否为手机号
function isMobilePhone(phone) { // your implement var pattern = /^1\d{10}$/; if(!pattern.test(phone)){ alert("手机号码有误,请重填"); return false; } }