4-复杂数据类型和函数_娶个村姑当大妾的博客-程序员宝宝

技术标签: 复杂数据类型和函数  HTML+CSS  javascript  

1. 复杂数据类型 Object(对象)
    ECMAScript中的对象其实就是一组数据(属性)和功能(方法)的集合。
    1) 创建(对象)Object实例:
        1.使用构造函数创建,new Object()
            var person = new Object();
            person.name = "briup";
            person.age = 22;

        2.使用对象字面量表示法
            不同的属性之间用','分割,属性名和属性值之间用':'分割
            var person = {
                name : "briup",
                age : 22
            };  (最后一定要加分号结束)
    2) 访问对象属性
        1.点表示法,右侧必须是以属性名称命名的简单标识符
            person.name
        2.中括号表示法,中括号中必须是一个计算结果为字符串的表达式,可以通过变量访问属性,如果属性名中包含语法错误的字符,或者属性名使用的是关键字或保留字,可以使用中括号    person["first name"]
            var a = "name";
            person[a];    //既person["name"]
            person["first name"]
            
    3) 删除属性
        delete只是断开了属性和宿主对象的联系,而不会操作属性中的属性,并且delete只会删除自有属性,不能删除继承属性。在销毁对象时,为了防止内存泄露,遍历对象中的属性,依次删除所有属性。
         语法:delete 属性访问表达式
            例如:
            delete stu.name  //删除学生对象中的name属性
    4) 检测属性
        in 检测某属性是否是某对象的自有属性或者是继承属性
            "toString" in student
        hasOwnProperty()检测给定的属性是否是对象的自有属性,对于继承属性将返回false
            var o = {
                x:1
            }
            o.hasOwnProperty("x");    //true, x 为o的自有属性
            o.hasOwnProperty("y");    //false,o 中不存在属性y
            o.hasOwnProperty("toString");    //toString为继承属性
        propertyIsEnumerable() 检测给定的属性是否是该对象的自有属性,并且该属性是可枚举的通常由JS代码创建的属性都是可枚举的,但是可以使用特殊的方法改变可枚举性。
            student.propertyIsEnumerable("toString")    //false 不可枚举
    5) Object属性及方法
       Object 类型所具有的任何属性和方法也同样存在于其他对象中,任何对象继承于Object对象
       Object中常用的方法:
            hasOwnProperty(propertyName);    
                检查给定的属性名是否是对象的自有属性,
            toString();        
                返回对象的字符串表示
            valueOf();        
                返回对象的字符串,数值,布尔值的表示。
            propertyIsEnumerable(propertyName);    
                检查给定的属性在当前对象实例中是否存在
            constructor:            
                保存用户创建当前对象的函数
            isPrototypeOf(object);        
                检查传入的对象是否是原型
            toLocaleString();    
                返回对象的字符串表示,该字符串与执行环境的地区对应
    6) 对象序列化
        对象序列化是指将对象的状态转换为字符串,也可以反序列化,将字符串还原为对象函数,RegExp,Error对象,undefined值不能序列化和反序列化。
        JSON.stringify(obj)  
            将对象序列化为Json字符串,只能序列化对象可枚举的自有属性。
        JSON.parse(jsonStr)  
            反序列化   JSON.parse将字符串解析为对象

2. 函数(第二部分)
    1) 作为值的函数
        由于函数名本身就是变量,所以函数可以当做值来使用(参数,返回值)。
        function callOther(fun,args){
            return fun(args);
        }
        function show(msg){
            alert(msg);
        }
        callOther(show,"哈哈"); //show为参数
    2) 作为返回值的函数
        eg:多功能自定义排序函数
        function myCompare(pro){
            //函数将作为返回值返回
            return function(obj1,obj2){
                var val1 = obj1[pro];
                var val2 = obj2[pro];
                if(val1<val2){
                    return -1;
                }else if(val1>val2){
                    return 1;
                }else {
                    return 0;
                }
            }
        }
        var data = [
            {
                name : "aaa",
                age :12
            },{
                name:"ccc",
                age : 8
            },{
                name :"bbb",
                age : 71
            }
        ];
        console.log(data);
        data.sort(myCompare("age"));
        console.log(data);
    3) 函数内部属性
        1. arguments :是类数组对象,包含着传入函数中参数,arguments对象还有一个callee的属性,用来指向拥有这个arguments对象的函数
            
            例如:
            num的阶乘,使用递归函数
            function factorial(num){
                if(num<=1){
                    return 1;
                }else{
                    //return num * factorial(num-1);
                    return num * arguments.callee(num-1);
                }
            }
        2. this: 指向的是函数赖以执行的环境(上下文)对象  this指向widow
          window.color = "window";
          var person = {
            color:"person"
          };

          function sayColor(){
            alert(this.color);
          }
          sayColor();  //window对象调用,所以弹出 "window"
          person.sayColor = sayColor; //将该方法赋给person对象
          person.sayColor();//使用person对象调用该方法,弹出"window"
    4) 函数的属性
        length: 表示函数希望接受的命名参数的个数
        function say(msg){} //say.length 1 希望接受一个参数
        function add(m,n){} //add.length 2 希望接受两个参数
        prototype: 保存实例方法的真正所在。在自定义引用数据类型以及继承时非常重要。
    5) 函数的方法
        this->该函数所在的环境对象
        <script>
            var person = {
                name:"terry",
                add:function(){
                    
                }
            }
            person.add();

            function add(a,b){
                alert(a+b);
            }
            add(1,2);// this->window
            =>
            add.call(window,1,2);
        </script>
        

        所有的构造函数首字母大写  (一定!!)
        apply : 参数(在其中运行函数的作用域,参数数组(Array,arguments));
        call  : 参数(在其中运行函数的作用域,参数列表)
        这两个方法作用都是在特定的作用域中调用函数,实际上等于设置函数内部的this的值

        用法一:
            function sum(m,n){
                return m+n;
            }
            function call(m,n){
                //return sum.apply(this,arguments);
                return sum.call(this,m,n);
            }
            alert(call(1,2));    
        用法二:
           扩充函数赖以运行的作用域
           window.color = "window";
           var person = {
            color:"person"
           };

           function sayColor(){
            alert(this.color);
           }
           sayColor.call(this);
           sayColor.call(window);
           sayColor.call(person);
    核心对象 :Object  Date Function Array   等等

3. 基本数据类型,引用数据类型
    基本数据类型的变量:
        可以直接操作保存在变量中的实际的值
        参数传递的时候传递的是实际值
    引用数据类型的变量:  
        不能直接操作对象的内存空间,实际上是在操作对象的引用。
        可以为引用类型变量天极爱属性和方法,也可以改变和删除其属性和方法
        参数传递的时候传递的是引用地址。
    值传递
        值的拷贝
    引用传递

        引用地址的拷贝

******************************************************************

JS基础语句

1. 分支语句
    if(condition){
        
    }

    if(condition){
        
    }else{
        
    }
    => condition?s1:s2

    if(){
    
    }else if(){
    
    }else if(){
    
    }else{
    
    }

    switch(condition){
        case val1:
            //s1
        break;
        case val2:
            //s2
        break;
        case val3:
            //s3
        break;
        default:
            
    }
    比较方式  ===   condition === val1
    default   可以位于任意位置,不管位于哪里,都表示其他case不满足的情况下,执行default,如果default不是位于代码尾,必须加break


2. 循环语句
    初始化条件
    结束判断条件
    迭代条件
    1)for循环
        for(var i = 0;i<=100;i++){
            console.log(i);
        }
    2)while循环
        while(结束判断条件){
            
        }
        while(true){
            break;
        }
    3)do-while循环
        do{
        
        }while();

    4)for-in循环
        用于循环对象的属性
        var person= {
            name:"terry",
            age: 12
        }
        for(var a in person){
            var b = person[a];
            console.log(a);
        }
    continue    
    break
    a:while(true){
        break a;
    }



3. 对象
    所有对象都直接间接继承Object
        Object{
            toString();
            valueOf();
            hasOwnProperty();
            propertyIsEnumerable();
        }
    1. 对象的定义
        对象是属性和方法的集合
    2. 对象的表示
        1)构造函数法
            var p1 = new Object();
            p1.name = "terry";
            p1.age = 12;
            p1.gender ="男";
            p1.sayName = function(){
                alert("my name is:"+this.name);
            }
            p1.sayAge = function(){
                alert("my age is:"+this.age);
            }
            

        2)对象字面量法(JSON) 一个对象可以对应多个属性和方法!!!
            var p2 = {
                name:"larry",
                age:14,
                gender:"男",
                sayName:function(){
                    alert("my name is:"+this.name);
                },
                sayAge:function(){
                    alert("my age is:"+this.age);
                }
            };

    3. 对象的属性访问
        1)点访问法
            p1.name
            p1.age

            var a = "name";
            p1.a
        2)中括号访问法
            支持变量的访问
            p1["name"]
            ==>
            var a = "name";
            p1[a]

    4. 对象的方法访问
        1) 点访问法
            p1.sayName();
            p1.sayName.call(this,a,b);
            p2.sayName.apply(this,[a,b]);
    5. 动态删除和动态添加属性
        删除
            delete 对象名.属性名
    
    6. 对象的属性检测
        1) in   
            属性名 in 对象
            如果该属性存在于(自有以及继承)对象中,返回true
        2) hasOwnProperty()
            对象.hasOwnProperty(属性名)
            当属性名为自有属性的时候,返回true

        ===========================
        class Person{
            private String name;
            private int age;
            public void sayName(){
                syso(this.name);
            }
            public void sayAge(){
                syso(this.age);
            }
        }
        Person p = new Person();
        p.gender = "男";
        Java属性不支持动态添加和动态删除,而在JS中允许
        ===========================


4. 函数
    1.作用:封装实现过程
    2.定义方式:
        函数声明
            function 函数名(形式参数){
                函数体
            }
            <script>
                add(1,2);
                add();

                function add(a, b){
                    return a+b;
                }
                
            </script>

        函数表达式
            add();//报错
            var add = function(){
            
            }
            add();//只能写后面,不然报错
            
            
    3.函数调用
        1) 函数名(实参列表);

    4.函数的内部属性
        1)arugments.callee.  指向的是当前函数
            类数组对象,像数组
            自己属性  callee->指向当前arguments 的函数/任何函数都拥有arguments的函数

        function add(a,b){
            console.log(a,b);
            console.log(arguments);
        }
        add(1,2);
        add();

        数组:存放多个任何数据类型值的集合
        var arr = [10,9,8,7,0,4];
        
        2)this
            指向当前函数赖以生存的变量对象

    5. 作为值的函数
        函数可以当做参数使用  function-当做参数来使用
    6. 作为返回值的函数
        函数可以当做返回值来使用  function-当做返回值使用

    7. 函数的外部属性
        function add(){
        
        }
        add();
        add.length

        var person = {
            name:"terry"
        }
        person.name
        
        函数本质是一个对象,所有的对象直接或间接继承Object,Object中存在的方法,在所有的子对象中都存在
        Object:
            toString();
            valueOf();
            ...
    8. 函数方法
        add();




版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Bug_money/article/details/54458868

智能推荐

(安卓特效) 卡片式控件 CardView_迷人的脚毛的博客-程序员宝宝

效果图:就是实现一个卡片效果   ,具体属性可以查一下CardView 所有属性: 先来导入依赖: compile 'com.android.support:cardview-v7:25.0.0'其实它就是一个控件 直接包裹图片(ImageView)或者文字(TextView)就行了,或者用一个(include)引入布

netty入门_xiaoyaGrace的博客-程序员宝宝

netty入门 Java中的NIO是一种解决阻塞式IO问题的基本技术,但是NIO的编写对java程序员是有比较高的要求的。那么Netty就是一种简化操作的一个成熟的网络IO编程框架。这里简单介绍一个程序,话不多说,直接上代码。一、服务器编写 1、Server代码,监听连接:[Java]纯文本查看复制代码? 01 02 03...

jenkins集成allure_小希zzz的博客-程序员宝宝_jenkins allure

一、jenkins插件中添加allure jenkis Pligin二、本地下载allure并且在jenkins的配置中添加路径三、jenkins构建中添加后置动作3.1 result-path为allure-results生成的原始文件文件夹,需要在源码里配置生成3.2report-path为html文件生成地址,由jenkins完成,我们只需要填写输出路径就可以了,我这边是放在\workspace\pytest_4\file 文件夹下四、file文件夹为.py文件位置用来运行pyte

chrome打开网页很慢,别的浏览器打开相同的网页很快_呼哈吧扎嘿的博客-程序员宝宝

我们的测试环境,同事总是吐槽打开很慢,但是我这里速度很正常,1s打开,他哪里经常性的超时,超时时间10s,开始以为是chrome的某些插件导致的,全部关闭发现不行并且,使用其他浏览器打开就很快,然后开始百度,最终发现,是chrome有一个默认设置,设置项的名称是 使用安全dns,关闭该选项即可...

Opencv学习笔记(八) -- 图像色彩空间转换_张慕风的博客-程序员宝宝

1.常见图像色彩空间RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色。 注: RGB是opencv图像加载时默认的色彩空间。默认的图像通道顺序为BGR。YUV 在现代彩色电视系统中,通常采用三管彩色摄影机或彩色CCD摄影机进行取像,然后...

20170511-algorithm-and-datastructure_deepindeed的博客-程序员宝宝

layout title tags categories date post 沧海遗珠:面试中碰到若干的问题 计算机视觉 CV算法 blog 2017-05-11 05:12:12 -0700 缺省情况下C++在global作用域内...

随便推点

Ubuntu16.04下安装tensorflow-gpu_言寺之风雅颂的博客-程序员宝宝

Tensorflow学习过程中有些代码在windows下运行会有许多问题,ubuntu系统还是得用。开始的时候为了跑通代码,就在虚拟机里面安装了一个Ubuntu16.04,但是这样GPU无法使用,只能用CPU版的tensorflow运行程序,最近在跑一个图像语义分割的训练代码,用i7-8700跑一天特么的才走了4000多次,10万次的话就奔着1个月去了,这可不行,物理机装上Ubuntu,鼓捣一番,...

thchs30跑过程中注意事项_Xwei1226的博客-程序员宝宝

尽量使用最新的版本,之需要改下面的第一个问题,就可以全部跑通,新的版本中beam size 是6, 就不会有问题了。按照github上的版本直接跑的过程中遇到两个问题: 1. 在 make word graph的过程中字典正确的没有拷贝到本地: 在 14.04 下面没有问题,在16.04 下面出现问题了。 cat $thchs/resource/dict/lexicon.txt $thchs/d...

【R语言】解决GO富集分析绘图,标签重叠问题_Mrrunsen的博客-程序员宝宝_r语言go绘图

利用clusterProfiler这个包绘制GO富集分析气泡图和柱形图的时候,发现GO条目的名字都重叠在一起了。气泡图柱形图这个图别说美观了,简直不忍直视。经过小编的认真研究,发现跟R版本有关。前面小编给大家展示的基本都是R 3.6.3做出来的图。很多粉丝可能用的都是最新版本的R 4.1.2。我们知道R的版本在不停的更新,相应的R包也在不停的更新。小编把绘制气泡图和柱形图相关的函数拿出来认真的研究了一下,终于发现的症结所在。dotplot这个函数,多了个label_for

chrome62 js的处理滚动条 以及指定滚动到某一个元素_weixin_30437847的博客-程序员宝宝

按照悠悠书上的去处理。发现我的版本反而行不通。就行着悠悠的路。反过来走。反而通了。不知道为毛。能通就行了版本:chrome62,selenium 3.8.0语言:python 2.7.6js滚动条处理:学习网上各个的方式js = "var q=document.body.scrollTop=100000" 滚动到最底部js1 ="var q=doc...

大一下 数据结构 清华严蔚敏(C语言)版 学习记录——树和二叉树_goodlunatic的博客-程序员宝宝

#include&lt;bits/stdc++.h&gt;#define MAX_TREE_SIZE 100//二叉树的最大结点数#define OK 1#define OVERFLOW -2#define ERROR 0typedef TElemType SqBiTree[MAX_TREE_SIZE];//0号单元存储根节点typedef int Status;SqBiTree bt;typedef struct BiTree{ TElemType data; stru.

grbl学习之旅---serial篇_被选召的孩子的博客-程序员宝宝

serial.c和serial.h文件是实现了通过串行端口发送和接受字节的功能。首先是serial.h中定义了基本函数和常量大小:#ifndef RX_BUFFER_SIZE #define RX_BUFFER_SIZE 128//定义接受缓存的大小#endif#ifndef TX_BUFFER_SIZE #define TX_BUFFER_SIZE 64//定义发送缓存的大小#en...

推荐文章

热门文章

相关标签