数据类型及语言基础

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

 

 
 
posted @ 2016-02-29 11:32  CassieLY  阅读(225)  评论(0编辑  收藏  举报