[关闭]
@Belinda 2015-05-06T13:39:12.000000Z 字数 7609 阅读 1217

js笔记

学习笔记


数据类型

数据类型分为:基础类型和对象类型。

基础类型:Number、String、Boolean、Null、Undefined

对象类型:object

JavaScript不支持创建任何自定义的类型,所有的值都是上述中六种数据类型之一。

大家可能会觉得不对呀,数组类型跑到哪里去了?

对象类型Object包括:Array、Function、Date...

对象类型我们会在后面的章节主要讲解,本章讲解的主要内容是基本数据类型。

number类型

在JavaScript中不区分整数值和浮点数值(在Java中也称为双精度数值)。还有一种特殊的数值即NaN(Not a Number),下面进行详细的讲解:

浮点数值:

浮点数值就是该数值中包含一个小数点,并且小数点后面必须至少有一个数字。如下定义了两个浮点数值的变量。

    var floatN1 = 0.4;
    var floatN2 = 3.4;

在保存浮点数值时需要的内存空间是整数值的两倍,因此JavaScript在一些情况下会将 浮点数值转换为整数值。如下列情况:

小数点后面没有跟任何的数字;
本身表示的就是一个整数(像3.0)。
示例:

    var floatN1 = 3.;  //小数点后面没有数字,解析为3
    var floatN2 = 3.0; //本身表示整数,解析为3

NaN:

NaN是一个数值,它表示一个不能产生正常结果的运算结果。NaN不等于任何值,包括它自己本身。我们可以用函数isNaN(number)检测NaN。

number参数可以是任意类型,而函数会帮我们确定这个参数是否“不是数值”。这个函数在接收一个值之后,会尝试将这个值转换为数值。而任何不能被转换为数值的值都会导致这个函数返回true。

    示例:

    alert(isNaN(NaN));  //true
    alert(isNaN(3));    //false(3是一个数值)
    alert(isNaN("3"));  //false(可以被转换成数值3)
    alert(isNaN("boolean"));//false(被转换成数值0)
    alert(isNaN("bool"));   //true(不能被转换成数值)

String类型

String 类型用于表示由零或多个 16位 Unicode 字符组成的字符序列,即字符串。字符串可以被包含在一对双引号或单引号中来表示。

    示例:

    var strN1 = "jason";
    var strN2 = 'huizhi';

这两种表示字符串的方式没有区别。需要注意的是以双引号开头的字符串也一定要以双引号结尾,单引号同上。

如果字符串里面包含字符串,有两种解决方法:

    1.双引号里面用单引号;
    2.单引号里面用双引号。
    如下示例:

    var strN1 = "My name is 'xiaoming'";
    var strN2 = 'My name is "xiaoming"';

但是如果字符串里面需要包含单个单引号,该怎么办呢?

转义字符

在我们写JavaScript代码的时候可能需要在用到特殊的字符(比如前文中提到的引号)。这个时候我们就用到了转义字符。这样我们我可以避免了和标示字符串的引号发生混乱的事情。

javascript使用以下八种转义字符,它们都是以反斜杠(\)开始。当JavaScript解析器看到反斜杠的时候,就会把程序员所要表达的意思表现出来。

    序号  转义字符    使用说明
    1   \b  后退一格
    2   \f  换页
    3   \n  换行
    4   \r  返回
    5   \t  制表符
    6   \'  单引号
    7   \"  双引号
    8   \\  反斜杠

创建一个包含单个单引号的字符串,然后利用document.write进行输出。

Boolean类型

该类型只有两个值:true和false。不管是True和False还是其他形式的大小写混合都只是标识符,不是Boolean类型。

    var True = true;
    var False = false;

Boolean类型用在最多的地方就是if/else语句。如下:

    if(i == 3){
      i = i + 1;
    }else{
      i = i - 1;
    }

上面的代码检测i是否等于,如果等于i则加1,否则减1。

任意的JavaScript的值都能转换为布尔值,如下图:

    数据类型    转换为true的值   转换为false的值
    Boolean true    后退一格
    String  任何非空字符串 ""(空字符串)
    Number  任何非零数字值(包括无穷大)  0和NaN
    Object  任何对象    null
    Undefined   不适用 undefined

示例:

    var str = "hello";
    if(str){
      alert('is true');
    }

运行上面的示例会弹出一个警告框,是因为字符串str转换成了对应的Boolean值(true)。

定义一个字符串,在利用if弹出一个警告框。

Null和Undefined类型

Null和Undefined类型都只有唯一的特殊值,即null和undefined。不过null是关键字而undefined不是。

JavaScript把两者定义为相等的,如下代码可以验证:

    alert(null == undefined);//会弹出true。

尽管这两个值相等,但是它们的含义不同。undefined表示更深层次的“空值”,它是变量的一种取值,表明变量没有初始化。null 则用于表示尚未存在的对象。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。所以:

    alert(null === undefined);//会弹出false

你也可以认为undefined是表示系统级的、出乎意料的或类似错误的值的“空值”;而null表示程序级的、意料之中的值的“空值”。如果你想吧两者赋值给变量或者属性等,最好的选择是null

创建对象

对象(object)是JavaScript的基本数据类型之一。对象是一种复合值:它把多个值(原始值或者其他对象)聚合在一起,可以通过名字访问这些值。对象也可看做是 属性的无序集合,每个属性都是一个名/值对。属性名是字符串,因此我们可以把对象 看成是从字符串到值的映射。

创建对象的两种方式:

第一种是使用new操作符后跟object 构造函数,如下:

    var obj = new Object(); 
    obj.name = "MangGuo"; 
    obj.age = 25;

第二种方式是使用对象字面量表示法。如下创建了一个和上面一样的对象:

    var obj = {
        name : "MangGuo", //name是属性名,"MangGuo"是值
        age : 25
    }

在对象字面量中,使用逗号来分隔不同的属性,因此"mangGuo"后面是一个逗号。但是,在age属性的值25的后面不能添加逗号,因为age是这个对象的最后一个属性。

使用对象字面量创建对象需要注意:当属性名中含有空格、特殊字符或者是保留字的时候一定要加上引号,其他情况下可加可不加。如下

    var obj = {
        "name" : "huizhi",    
        "hui zhi" : "hubwiz", //属性名中有空格
        "hui-zhi" : "hubwiz", //属性名中有特殊字符
        "for" : "baoliuzi"     //属性名是保留字
    }
    document.write(obj.name);  //输出obj对象属性名为name的值

创建一个对象,包含属性名name、age,且输出对象中属性名是name的值。

访问属性

访问对象的属性有两种方式:点或者中括号操作符。点操作符在我们上一页当中已经应用到了。

1.使用点操作符

    语法:objectName.propertyName

其中,objectName 为对象名称,propertyName为属性名称。

2.使用中括号操作符

    语法:objectName[propertyName]

其中,objectName 为对象名称,propertyName 为属性名称。

示例:

    var cat = {
        "name": "tom",
        "sex": "man",
        "color": "yellow"
    }
    var name1 = cat.name; //通过点操作符来访问对象属性
    var name2 = cat["name"]; //通过中括号操作符来访问对象属性

上述中name1和name2的值是相等的。在实际的开发当中使用点操作符的情况会比较多一些。

创建一个dog的对象,有属性:name、age和varieties。然后通过document.write输出对象的全部属性。

删除属性

delete 操作符是删除属性的唯一方法。把属性设置为undefined或者null不能真正的删除属性,它只是移除了属性和值的关联。

语法:delete 对象名.属性名;

示例:

创建一个cat对象,包含属性:name、sex和color。然后删除name属性,给sex赋值为undefined,给color赋值为null。在对各个属性进行判断是否存在。

    var cat = {
        "name": "tom",
        "sex": "man",
        "color": "yellow"
    }
    delete cat.name;
    cat.sex = undefined;
    cat.color = null;
    alert("name属性是否存在:" + cat.hasOwnProperty("name"));  //false
    alert("sex属性是否存在:" + cat.hasOwnProperty("sex"));  //true
    alert("color属性是否存在:" + cat.hasOwnProperty("color"));  //true
    PS: hasOwnProperty函数是判断某个属性是否存在于某个对象当中。

创建一个对象,里面包含几个属性,利用delete删除其中一个属性,在通过hasOwnProperty()判断删除的属性是否存在。

hasOwnProperty()函数

对象是属性的集合,我们经常会检测集合中成员的所属关系——判断某个属性是否属于某个对象。这个时候就用到了我们前文提到的:hasOwnProperty 函数。

语法:object.hasOwnProperty(proName);

参数说明:
object

为必需参数,是对象的实例。

proName

必需参数。 一个属性名称的字符串值

详解:如果object对象中存在指定名称的属性,则返回true,反之则返回false。如下代码:

    var mouse = {
      "name": "betta",
      "age": 3,
      "varieties": "milaoshu"
    }

    mouse.hasOwnProperty("name"); // true
    mouse.hasOwnProperty("sex");  //false

PS:hasOwnProperty 是 JavaScript 中唯一一个处理属性但是不查找原型的函数。那什么是原型呢?

原型

每一个对象都连接到一个原型对象,并且可以从中继承属性。所有通过字面量创建 的对象都具有同一个原型对象,并可以通过Object.prototype获取对原型 对象的引用。通过new关键字后跟构造函数创建的对象的原型,就是构造函数的prototype 属性的值。

比如通过new Object()创建的对象和字面量创建的对象一样也继承自 Object.prototype。

    var sum = {
      name: "汇智网",
      type: "加法"
    }
    Object.prototype.add = function(){
      alert("原型对象的方法");
    }
    sum.add(); // =>原型对象的方法

遍历属性

我们除了检测属性的存在,我们还经常对属性进行遍历。通常我们会用:for/in

for / in 语句可用来遍历一个对象的所有属性名。它会将所有的属性(包括函数和原型中的属性)。如下代码:

        var cat = {
            "name": "小白",
            "type": "汇智网",
            "eat": function(){
            alert("吃老鼠");
            }
        }
        Object.prototype.color = "白色";
        var name;
        for(name in cat){
            document.write(cat[name] + "<br>")
        }

仿照上述示例创建一个dog对象,属性和上述一样,然后利用for/in 遍历对象属性。

创建数组

Array类型是Javascript中比较常用的类型,它和其他语言的数组有很大的区别,虽然它们数组的数据都是有序列表。但是JavaScript的数组可以保存任意类型的数据(包括它本身)。且大小是动态的,可以随着数据的添加而自动增长。

创建数组的两种方式:

第一种方式:使用Array构造函数

    var arr = new Array();

如果知道数组中的数据,可以把数据包含到构造函数中。比如:

    var arr = new Array("cat","dog","mouse");

如果数组中的数据只有一个且是数值时,用引号引起来length是1,不用引号的话数值是几就表示length是都少。比如:

    var arr = new Array("3"); //创建了一个包含字符串是3的数组,length为1。
    var arr = new Array(3);   //创建了一个length为3的数组
    第二种方式:使用字面量表示法

var arr = [];

上面创建了一个空数组,如果你知道其中的数据,可以如下使用:

var arr = ["cat", "dog", "mouse"];

学会了吗?做一些下面的小练习。后面我们将讲解数组当中一些常用的方法。

数组长度

每个数组都有一个长度,要想获得这个长度,我们通过数组的length属性来获取。 length属性值代表数组中元素的个数。比如如下示例:

    var arr1 = [];
    arr1.length; // 值为0 数组中元素个数为0
    var arr2 = ["jason","abc",[1,2,3],232];
    arr2.length; // 值为4 数组中元素个数为4

但是有情况是例外的,那就是稀疏数组。

稀疏数组

稀疏函数就是从0开始的不连续索引的数组。

通常情况下,数组中length属性值代表着元素的个数,那就是稀疏数组。就像上文中提到的。示例如下:

    var arr = new Array(3);
    arr.length; // 
    arr[0] = 1;
    arr[100] = 98;
    arr.length;

遍历数组

数组就是对象,所以我们可以用 for/in 来遍历数组。可惜 for/in 不能保证属性的顺序,但是大多数情况下都希望按照 阿拉伯数组顺序来产生元素。

要想解决这个问题,我们可以用最常规的 for 来遍历数组。如下示例:

    var arr = [1,22,3,333,322,444];

    for(var i = 0;i < arr.length; i++){
        document.write("第" + i + "元素:" + arr[i] + "\n");
    }

任务:创建一个数组,然后利用常规的 for 来遍历这个数组。

函数声明和函数表达式

JavaScript解析器在向执行环境加载数据的时候,对函数声明和函数表达式并不是一视同仁的。 对于前者解析器会率先读取,并使其在执行任何代码之前可用;对于后者,则必须等到解析器执行 到它所在的代码行,才会真正被解析执行。看如下中的示例:

    alert(sum(3,11));  //弹出14
    function sum(x, y) {
        return x + y;
    }

把上面的函数声明定义的函数转换为函数表达式定义函数。如下:

    alert(sum(3,11);   // unexpected identifier 意外标识符错误
    var sum = function (x, y) {
        return x + y;
    }

上述中第二段代码与西宁会产生错误,因为在执行到函数所在的语句之前,变量sum 中不会保存有对函数的引用;而且由于第一行代码就会报错,也不会执行到下一行。

除了什么时候通过变量访问函数这一点区别外,函数声明与函数表达式的语法是等价的。

作为值的函数

JavaScript中的函数名本身就是变量,所以函数也可以作为值来使用。看如下示例:

    function funcName(someFunc, someParam){
        return someFunc(someParam)
    }

这个函数接收两个函数。第一个参数是一个函数,第二个参数是要传递给该函数的一个值

    如下示例:

    function funcName(someFunc, someParam){
        return someFunc(someParam)
    }
    function sum(num){
        return num + 3;
    }
    var result = funcName(sum, 5);
    alert(result);  //=>8

把上述中的示例在左侧代码框中练习一下。

函数调用

JavaScript函数在定义时并不会去执行,只有我们在调用定义的函数时,它才会去执行。

在JavaScript中有四种方式调用函数,如下:

    1.方法调用模式;
    2.函数调用模式;
    3.构造器调用模式;
    4.apply调用模式。

以上四种调用模式我们在下文中会一一讲解。

方法调用模式

当一个函数被保存为对象的一个属性时,我们称它为一个方法。如果调用表达式包含一个提取属性 的动作(即我们在讲解对象时说的 . 操作符),那么它就被当做一个方法来调用。

如下示例:

    var myObj = {//对象字面量
        param1: 1,
        param2: 2,
        sum: function (){
        //this关键字只带当前的对象
        return this.result = this.param1 + this.param2; 
        }
    }
    myObj.sum(); //=>2

函数调用模式

函数调用模式即通常的函数调用,属于全局性调用。如下:

    var add = function(a, b){
        return a + b;
    }
    //函数调用模式
    add(1,2);  //=>3

上述代码等价:

    function add(a, b){
        return a + b;
    }
    add(1,2);//=>3

构造器调用模式

JavaScript中函数还可以是构造器. 将函数作为构造器来使用的语法就是在函数调用前面加上一个new关键字.

    // 构造器调用模式
    var obj = new add(); //obj是一个对象
    obj.sum(1,2);  //=>3

上述中的代码创建了一个构造函数add,然后使用构造函数创建对象obj。这里使用了new关键字。然后使用对象调用sum()方法。

apply调用模式

JavaScript中函数也是对象,也可以拥有方法。其中call()和apply()用来间接的调用函数。称之为apply调用模式。

apply方法让我们构建一个参数数组传递给调用函数。它也允许我们选择this的值。 apply方法接收两个参数,第一个是要绑定给this的值,第二个就是一个参数数组。

语法:函数名.apply(对象, 参数数组);

示例:

    var add = function (a, b) {
        return a + b;
    }

add.apply(null,[1,2]); //=>3
call方法与apply方法类似,区别在call第二参数不是一个数组而是需要列举出来。比如上述中的代码用call方法来实现,如下

    var add = function (a, b) {
        return a + b;
    }
    add.call(null,1,2); //=>3
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注