// 判断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');
}
// 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝
// 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、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函数
// 对数组进行去重操作,只考虑数组中元素为数字或字符串,返回一个去重后的数组
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;
}
// 很多同学肯定对于上面的代码看不下去,接下来,我们真正实现一个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*/,'');
}
// 实现一个遍历数组的方法,针对数组中每一个元素执行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);
}
}
// 获取一个对象里面第一层元素的数量,返回一个整数
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;
}