• JavaScript统计数据处理(2)


    JavaScript是一种广泛使用网页编程语言,
    在浏览器中运用JavaScript技术处理统计数据具有最佳的推广传播效果

    对象(Object)在编程语言中是一个比较抽象、牵涉内容非常多的概念。对于JavaScript来说,对象可以是一个变量、一个数据结构、或是一个函数。对象既表示客观世界问题空间中的某个具体的事物,又表示软件系统解空间中的基本元素。

    在软件系统中,对象具有唯一的标识符,对象包括属性(Properties)和方法(Methods)。属性就是需要记忆的信息,方法就是对象能够提供的服务。

    JavaScript提供多个内建对象,比如String、Date、Array、Math等等。对象是带有属性和方法的特殊数据类型,JavaScript的内建对象需要在学习JavaScript语法知识时加以掌握。

    本文介绍利用花括弧“{}”对象建立和操作统计数据结构,并结合上文介绍的数组知识进一步学习JSON数据结构。


    导读

    1、创建对象及对象属性

     [返回]

    console.clear();
    var obj1 = {
        name: "Arvin",    //nameww为属性名称、Arvin为属性值
        gender: "Female"
    };
    console.log(obj1);
    //创建嵌套的对象obj2
    var obj2 = {
        name: "Arvin",
        contact: {
            qq: "1465712345",
            tel: "1465712311",
            mail: "1465712311@163.com"
        }
    };
    console.log(obj2);
    //同时嵌套数组和对象obj3
    var obj3 = {
        name: "Arvin",
        contact: {
            qq: "1465712345",
            tel: "1465712311",
            mail: "1465712311@163.com"
        },
        absent: [12,15,24]    
    };
    console.log(obj3);
    //数组元素也可以是对象
    var arr = [
        20, 45,
        obj = {name: "Arvin", gender: "Female"},
        val = [1,2,3,4,5]    
    ];
    console.log(arr);
    

    注:这里只涉及对象的属性,关于对象的方法在学习JS函数后再进一步介绍

    在创建对象的代码中可以看到JS对象和数组的运用非常灵活,可以根据统计数据结构的特点任意嵌套创建对象和数组(数组也是JS的一个内建对象)。对象和数组嵌套结构可以描述我们在实践工作中遇到的各种数据,所有的数据最终都可以分解成三种类型:

    • 第一种类型是标量(scalar):指一个单独的字符串(string)或数字(numbers);
    • 第二种类型是序列(sequence):指由相关的数据按照一定顺序并列在一起,又叫做数组(array);
    • 第三种类型是映射(mapping):也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值。

    数据结构的构成竟是如此的简单!在编程语言中,只要有了数组(array)和对象(object)就能够描述、储存一切数据了。

    21世纪初,Douglas Crockford尝试寻找一种简便的数据交换格式,能够在服务器之间交换数据。当时通用的数据交换语言是XML(Extensible Markup Language,可扩展标记语言),但是Douglas Crockford觉得XML的生成和解析都太麻烦,所以他提出了一种简化格式,也就是JSON

    JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(网络传输速率)。

    Json的规格比较简单,只用一个页面几百个字就能说清楚,而且Douglas Crockford声称这个规格永远不必升级,因为该规定的都规定了。

    JSON数据格式规则:

    • 并列的数据之间用逗号(", ")分隔;
    • 映射用冒号(": ")表示;
    • 并列数据的集合(数组)用方括号("[]")表示;
    • 映射的集合(对象)用花括号("{}")表示。

    上面四条规则,就是Json格式的所有内容,就是我们前面提到的对象和数组嵌套结构。

    2、JSON属性引用和修改

     [返回]

    console.clear();
    var obj = {
        name: "Arvin",
        contact: {
            qq: "1465712345",
            tel: "1465712311",
            mail: "1465712311@163.com"
        },
        absent: [12,15,24]    
    };
    var temp = obj.name;     //获得属性值Arvin
    temp = obj.contact.tel;  //1465712311  
    temp = obj.absent[1];    //15
    console.log(temp);
    obj.name = "Carolyn";    //属性修改
    obj.absent[1] = 99;
    console.log(obj);
    var obj1 = {
        "name": "Arvin",
        "age": 18   
    };
    console.log(obj1.name);
    

    注:JSON对象属性名称可以加引号,也可以不加引号;JSON对象属性值为字符时必须加引号,为数值时不加引号

    3、JSON属性和对象添加

     [返回]

    console.clear();
    //建立一个简单对象
    var obj = {
        name: "Arvin"
    };
    obj.lastname = "Joe";  //添加属性名/值对
    obj.contact = {};      //添加对象
    obj.contact.qq = "1465712345";  //为新对象添加属性名/值对
    obj.contact.tel = "1465712311";
    obj.contact.mail = "1465712311@163.com";
    obj.absent = [12,15,24];    //添加属性名/数组
    console.log(obj);
    

    4、JSON属性和对象删除

     [返回]

    console.clear();
    var obj = {
        name: "Arvin",
        contact: {
            qq: "1465712345",
            tel: "1465712311",
            mail: "1465712311@163.com"
        },
        absent: [12,15,24,67]    
    };
    delete obj.name;  //删除name属性
    delete obj.contact.mail;
    delete obj.contact;  //对象删除
    //删除absent属性数组最后一个元素(此时下标值删除,但数组长度不变)
    delete obj.absent[3];
    //彻底删除absent属性数组最后一个元素(此时下标值删除,数组长度变化)
    obj.absent.splice(3,1);  
    console.log(obj);
    

    5、JSON对象和JSON字符互相转换

     [返回]

    JSON是简便、最广泛使用的数据交换格式,也是统计学数据结构的最佳载体。运用JSON对象描述统计数据非常JS编程进行各种统计运算,当要存储数据时,需要将JSON对象转换为字符;而处理数据时,又需要读取JSON字符后转换为对象。

    console.clear();
    JSON字符转对象
    var jsonStr = '[{"CityId":18,"CityName":"西安"},{"CityId":53,"CityName":"广州"}]';
    var jsonObj = eval("("+jsonStr+")");  //使用eval函数将JSON字符转换为对象
    console.log(jsonObj[0]["CityName"]);
    var jsonObj = JSON.parse(jsonStr);    //使用JSON.parse()方法进行转换
    console.log(jsonObj[1]["CityName"]);
    var jsonObj = {
        "CityId":"18",
        "CityName":"西安2"
    };
    //JSON对象转字符
    var jsonStr = JSON.stringify(jsonObj);
    console.log(jsonStr);
    

    注:使用JSON.parse()方法和JSON.stringify方法是,JSON对象属性名需要加引号

    6、JS对象的属性特性(*)

     [返回]

    ECMAScript对象中目前存在的属性描述符主要有两种,数据描述符(数据属性)和存取描述符(访问器属性),数据描述符是一个拥有可写或不可写值的属性。存取描述符是由一对 getter-setter 函数功能来描述的属性。

    • JS对象数据描述符(数据属性):
      • Configurable(可配置属性): 表示能否通过delete删除此属性,能否修改属性的特性,默认值为true
      • Enumerable(可枚举属性): 表示该属性是否可枚举,即是否通过for-in循环或Object.keys()返回属性,默认值为true
      • Writable(可读属性): 能否修改属性的值,默认值为true
      • Value(数值属性): 该属性对应的值,默认为undefined
    • JS对象存取描述符(访问器属性):
      • Configurable(可配置属性): 和数据属性的Configurable一样,表示能否通过delete删除此属性,能否修改属性的特性,或能否修改把属性修改为访问器属性,默认值为true
      • Enumerable(可枚举属性): 和数据属性的Configurable一样,表示该属性是否可枚举,即是否通过for-in循环或Object.keys()返回属性,默认值为true
      • Get(获得): 一个给属性提供 getter 的方法(访问对象属性时调用的函数,返回值就是当前属性的值),如果没有 getter 则为 undefined。该方法返回值被用作属性值。默认为 undefined
      • Value(设置): 一个给属性提供 setter 的方法(给对象属性设置值时调用的函数),如果没有 setter 则为 undefined。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认为 undefined

    I、属性测试

    console.clear();
    var obj = {
        name: "Arvin",
        contact: {
            qq: "1465712345",
            tel: "1465712311",
            mail: "1465712311@163.com"
        },
        absent: [12,15,24,67]    
    };
    console.log(obj.hasOwnProperty("name"));
    console.log(obj.contact.hasOwnProperty("qq"));
    console.log(obj.hasOwnProperty("absent"));
    

    II、创建/修改/获取属性的方法

    a. Object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。如果不指定configurable, writable, enumerable,则这些属性默认值为false,如果不指定value, get, set,则这些属性默认值为undefined

    console.clear();
    var obj = new Object();
    //
    Object.defineProperty(obj, 'name', {
        configurable: false,
        writable: true,
        enumerable: true,
        value: '张三'
    })
    console.log(obj.name)  //张三
    

    b. Object.defineProperties()方法直接在一个对象上定义一个或多个新的属性或修改现有属性,并返回该对象。

    console.clear();
    var obj = {};
    Object.defineProperties(obj, {
        name: {
            value: '张三',
            configurable: false,
            writable: true,
            enumerable: true
        },
        age: {
            value: 18,
            configurable: true
        }
    })
    console.log(obj.name, obj.age) // 张三, 18
    

    c. Object.getOwnPropertyDescriptor()方法返回指定对象上一个自有属性对应的属性描述符。

    console.clear();
    var person = {
        name: '张三',
        age: 18
    }
    var desc = Object.getOwnPropertyDescriptor(person, 'name'); 
    console.log(desc);
    

    d. Object. getOwnPropertyDescriptors()所指定对象的所有自身属性的描述符。

    console.clear();
    var person = {
        name: '张三',
        age: 18
    }
    var desc = Object.getOwnPropertyDescriptors(person);
    console.log(desc);
    

    e. Configurable(可配置属性):如果设置configrubale属性为false,则不可使用delete操作符, 修改所有内部属性值会抛出错误。

    console.clear();
    var person = {};
    Object.defineProperty(person, 'name', {
        configurable: false,
        value: 'John'
    }) ;
    delete person.name   // 严格模式下抛出错误
    console.log(person.name)  // 'John'  没有删除
    Object.defineProperty(person, 'name', {
        configurable: true  //报错
    });
    Object.defineProperty(person, 'name', {
        enumerable: 2  //报错
    });
    Object.defineProperty(person, 'name', {
        writable: true  //报错
    });
    Object.defineProperty(person, 'name', {
        value: 2  //报错
    });
    

    f. Writable(可读属性):当writable为false(并且configrubale为true),value可以通过defineeProperty修改, 但不能直接赋值修改。

    console.clear();
    var obj = {}
    Object.defineProperty(obj, 'a', {
        configurable: true,
        enumerable: false,
        writable: false,
        value: 1
    });
    obj.a=2;
    var d = Object.getOwnPropertyDescriptor(obj, 'a')
    console.log(d); // 结果如下
    // {
    //     value: 1,  // 没有做出修改
    //     writable: false, 
    //     enumerable: true, 
    //     configurable: false
    // }
    

    g. Enumerable(可枚举属性):当Enumerable为false(并且configrubale为true),该属性不能被枚举显示。

    console.clear();
    var obj = {}
    Object.defineProperty(obj, 'a', {
        configurable: true,
        enumerable: false,
        writable: false,
        value: 1
    });
    obj.a=2;
    var d = Object.getOwnPropertyDescriptor(obj, 'a')
    console.log(d); // 结果如下
    // {
    //     value: 1,  // 没有做出修改
    //     writable: false, 
    //     enumerable: true, 
    //     configurable: false
    // }
    

    III、添加存取描述符属性

    get/set(读/写)通过get/set函数为对象指定属性设置读写功能。

    console.clear();
    var obj = {};
    var aValue; //如果不初始化变量, 不给下面的a属性设置值,直接读取会报错aValue is not defined
    var b;
    Object.defineProperty(obj, 'a', {
        configurable : true,
        enumerable : true,
        get: function() {
            return aValue
        },
        set: function(newValue) {
            aValue = newValue;
            b = newValue + 1
        }
    })
    console.log(b) // undefined
    console.log(obj.a)  // undefined, 当读取属性值时,调用get方法,返回undefined
    obj.a = 2;  // 当设置属性值时,调用set方法,aValue为2
    console.log(obj.a) // 2  读取属性值,调用get方法,此时aValue为2
    console.log(b) // 3  再给obj.a赋值时,执行set方法,b的值被修改为2
    console.clear();
    //obj的y属性值只读
    var obj = {
        x:1, 
        get y(){return x;},
        //set y(value){x = value;}
    };
    obj.y=10  //修改无效
    console.log(obj);
    //obj的y属性值可读写
    var obj = {
        x:1, 
        get y(){return x;},
        set y(value){x = value;}
    };
    obj.y=10  //修改有效
    console.log(obj);
    

    本文只介绍了JS对象属性的基本用法,当我们循序学完函数、方法等知识后,再进一步介绍JS对象的方法及面向对象编程。标记(*)号部分初学者可以忽略。

    提示:本页中JS脚本代码可复制粘贴到JS代码运行窗口调试体验; 文本编辑快捷键:Ctrl+A - 全选;Ctrl+C - 复制; Ctrl+X - 剪切;Ctrl+V - 粘贴

  • 相关阅读:
    setContentView和inflate区别
    eclipse中自动添加注释(作者,时间)
    ImageLoader must be init with configuration before using
    repo用法详解
    SQL 中的N'xx'的作用
    DataRow复制一行到另一个DataTable
    MS SQL SERVER搜索某个表的主键所在的列名
    Win2008 Server R2个人PC化设置
    C# DataTable的詳細用法
    如何解决arcmap中的反走样问题。
  • 原文地址:https://www.cnblogs.com/cloudtj/p/12903238.html
Copyright © 2020-2023  润新知