1. JavaScript值类型和引用类型
(1)值类型:数值、布尔值、null、undefined。
(2)引用类型:对象、数组、函数。
2. 判断数据类型
typeof 区分数字、字符串、布尔值、undefined
var str="hello"; console.log(typeof(str));//string
nar n=12345; console.log(typeof(n));//number
var bool=true; console.log(typeof(bool));//boolean
var undefinedO=undefined; console.log(typeof(undefinedO));//undefined
function fn() { alert("hi");}
console.log(typeof(fn)); //function
要想区别对象、数组单纯使用 typeof 是不行的
可以用Object.prototype.toString.call()
console.log(Object.prototype.toString.call({})) //[object Object]
console.log(Object.prototype.toString.call([])) //[object Array]
其他也可以用Object.prototype.toString.call()来返回数据类型
console.log(Object.prototype.toString.call(123)) //[object Number]
console.log(Object.prototype.toString.call('123')) //[object String]
console.log(Object.prototype.toString.call(undefined)) //[object Undefined]
console.log(Object.prototype.toString.call(true)) //[object Boolean]
console.log(Object.prototype.toString.call({})) //[object Object]
console.log(Object.prototype.toString.call([])) //[object Array]
console.log(Object.prototype.toString.call(function(){})) //[object Function]
3. 使用递归来实现一个深度克隆
代码如下:
复制的对象类型会被限制为数字、字符串、布尔、日期、数组、Object对象。不会包含函数、正则对象等
function cloneObject(src) {
var result;
if (typeof(src) === "object") { //检测src是否是object
if (Object.prototype.toString.call(src) == "[object Date]") {//日期对象可以直接赋值
result = src;
}else{ result= Object.prototype.toString.call(src)==="[object Array]"?[] : {};
for (var i in src) {
if(src.hasOwnProperty(i)){//清除继承属性
if (typeof src[i] === "object") {
result[i] = cloneObject(src[i]);//递归
}else{ result[i] = src[i]; }//直接赋值
}
}
}
}else{
result = src;//对于值类型直接赋值
}
return result;
}
注:
[object Date] Date首字母大写;
测试用例:
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"
4.对数组进行去重操作
只考虑数组中元素为数字或字符串,返回一个去重后的数组
var arr1 = [1,2,2,3,4,4,5,7,9,9]; var b1 = uniqArray(arr1); console.log(b1); function uniqArray(arr) { var result=[]; for(var i = 0;i<arr.length;i++) { if(result.indexOf(arr[i])=== -1){//用indexOf判断是否含有某个值,不含有则返回-1 result.push(arr[i]);//将arr[i]从result底部进入 } } return result; }
5. 正则表达式删除首尾空白符
var str = ' hi! '; str = trim(str); console.log(str); // 'hi!' function trim(str) { var result = ""; result = str.replace(/^\s+|\s+$/g, ""); //使用正则进行字符串替换 return result; }
result = str.replace(/^\s+|\s+$/g, "") 中的|(或),第一个匹配为/^\s+(首),第二个匹配为\s+&(尾)
\s 空白符,\S非空白符
6.实现一个遍历数组的方法,针对数组中每一个元素执行fn函数,并将数组索引和元素作为参数传递
function each(arr, fn) { // your implement for (var i = 0; i < arr.length; i++) {//遍历传参 fn(arr[i], i); } } function output(item, index) { console.log(index + ': ' + item) } var arr = ['java', 'c', 'php', 'html']; each(arr, output); // java, c, php, html
function each(arr, fn)中的fn指的是一个函数。在最后一句each(arr, output)中,指明了这个函数是output
7.获取一个对象里面第一层元素的数量,返回一个整数
function getObjectLength(obj) { var count=0; for (var i in obj) { if (obj.hasOwnProperty) count++; } return count; }
console.log(getObjectLength(obj));
测试用例:
var obj = {
a: 1,
b: 2,
c: {
c1: 3,
c2: 4
}
};
console.log(getObjectLength(obj)); //3
使用for in遍历时,直接获取到的就是第一层的结果。排除继承来的属性,使用外部变量保存循环次数
8. 正则表达式常用判断
判断是否为邮箱地址
function isEmail(emailStr){ var reg = /^(\w+\.)*\w+@\w+(\.\w+)+$/; return reg.test(emailStr); } var em = "531014270@qq.com"; alert(isEmail(em));//ture
判断是否为手机号码
function isMobilePhone(phone) { var reg = /^1\d{10}/; return reg.test(phone); } var pn = "13608305021"; alert(isMobilePhone(pn));//true