• 重温《js权威指南》 第4、5、6章


    第四章 表达式和运算符

            4.2 对象和数组的初始化表达式

                   数组: []   [3,7] [1+2,3+4] [[1,2,3,],[4,5,6],[7,8,9]]

                   对象:   {x:2.3,y:4.5}

            4.4 属性访问表达式

                   js有两种属性访问方式   expression.identifier     expression[expression]

            4.8.1 "+"运算符

                   尽量转换为字符串再计算

            4.9.1

                    ==  相等运算符    ===  恒等运算符

                    !=                     !==

                    "==="  严格相等运算符首先计算其操作数的值,然后比较这两个值(没有任何类型转换)

                       类型不同不相等                  

                       有NaN,不相等

                       0=-0

                       引用值指向同一个对象、数组或函数,相等

                    "==" 比较不严格,如果比较的不是同一类型,会尝试进行类型转换,转换规则如下:

                        一个字符串,一个数字,字符串尝试转换为数字再比较

                        如果有"true",则将其转换为1再进行比较

              4.9.2 比较运算符

                      1.可以比较任何类型,但真正执行比较操作的只有数字和字符串,其他类型都转换成原始值

                      2.如果一个类型是数字,则原始值转换成数字

                      3.如果其中一个操作数是NaN,比较总返回false

                      4.字符串比较区分大小写   大写  <  小写

              4.9.3  in运算符                   

                      左操作符是一个字符串或可以转换成字符串,有操作数是一个对象

                      若对象有字符串同名的属性名,则返回true

    var point={x:1,y:1};

    x in point;// true

    z in point;// false

    toString in point;// true  默认继承toString方法

               4.9.4 instanceof运算符

                       做操作符是一个对象,右操作符标识对象的类

                       若对象是右侧类的实例,则返回true(会判断父类)

               4.10

                        运算顺序自左向右

                         逻辑运算符会在任何希望使用布尔值的地方返回一个真值或假值,这也意味着逻辑运算符不一定只返回true,false。

    var i=1&&2&&3;

    alert(i);//3 因为运算顺序自左向右

               4.12.1 eval()

                        eval最重要的是它使用了调用它的变量作用域环境

                        全局eval(),这种特性不仅保障了别名eval在函数作用域的安全性,还可以在函数中执行一些对上下文没有依赖的全局脚本代码段

    var geval=eval;

    var x="global",y=”global”;

    function f(){

             var x=”local”;

             eval(”x+=’changed’”);

             return x;

    }

    function y(){

              var y=”local”;

              geval("y+=’changed’”);

              return y;

    }

    console.log(f(),x);

    console.log(y(),y);

            4.13.2 typeof运算符

                     一元操作符,返回操作数的类型

            4.13.3 delete运算符

                     一元操作符,删除对象属性或者数组元素

    第五章  语句

             5.3 声明语句

                    多次声明同一个变量是无所谓的

    第六章  对象

             对象是个复合值,它将很多值聚合在一起,可通过名字访问这些值;对象也可看做是属性的无序集合,每个属性都是一个键值对。

             javascript三类对象和两类属性:

             内置对象:数组,函数,日期,正则表达式

             宿主对象:js解释器所嵌入的宿主环境定义的。

             自定义对象:js代码创建的对象

             自由属性:直接在对象中定义的属性

             继承属性:在对象的原型对象中定义的属性

             6.1 创建对象

                   6.1.1 对象直接量

                            对象直接量是由若干键值对组成的映射表,属性名可以是标识符也可以是字符串直接量,属性值随意。

                            对象直接量是一个表达式,这个表达式每次运算都创建并初始化一个新的对象

                   6.1.2 通过new创建对象

                            关键字new后跟随一个函数调用,这个函数称作构造函数

                   6.1.3 原型

                            每一个js对象都和另一个对象相关联,“另一个对象”就是原型,每一个对象都从原型继承属性。

                   6.1.4 Object.create()

                            var i=Object.create({x:1,y:2});

                            var j=Object.create(Object.prototype);//相当于new Object()

                            var m=Object.create(null);//不继承任何属性和方法

    function inherit(p){
           if(p==null) throw new TypeError();

           if(Object.create) return Object.create(p);

           var getType=typeof p;

           if(p!='object'&&p!='function') throw new TypeError();

           function f(){};

           f.prototype=p;

           return new f();     
    }

            6.2 属性的查询和设置

                  object.property=object['property'];

                  在js中,只有在查询属性时才会体会到继承的存在,而设置属性则和继承无关。属性赋值要么失败,要么创建一个属性,要么在原始对象中设置属性。

                  在非严格模式中,给一个只读的属性赋值,不会报错,属性也不会被修改。

            6.3 delete属性

                   delete运算符可以删除对象的属性。

                   delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性

    var a={p:{x:1}};

    var b=a.p;// b指向 a.p

    alert(delete a.p);//true

    alert(a.p);//undefined

    alert(b.x);//1    只是删掉了a.p的引用,但是b还是指向a.p。销毁对象时,要遍历属性中的属性,依次删除,防止内存泄漏

            6.4 检测属性

                    可以通过in,hasOwnPreperty(),propertyIsEnumerable()方法来检测属性

                     in检测对象的自有属性或继承属性是否包含指定名称属性

                     hasOwnProperty()检测对象的自有属性是否包含指定名称的属性

    var o={x:1};

    "x" in o;// true

    "y" in o;// false

    "toString" in o;//true

    o.hasOwnProperty('x');//true

    o.hasOwnProperty('y');//false

    o.hasOwnProperty('toString');//false

    o.propertyIsEnumerable('x');//true

    o.propertyIsEnumerable('y');//false

    o.propertyIsEnumerable('toString');//false

            6.5 枚举属性

                   for in

                   Object.keys()

                   Object.hasOwnPropertyNames();

            6.6 属性getter和setter(ECMAScript5 后启用)

                   对象直接量方式创建

    var test={

    x:"asd",

    get y(){return "get"+this.x;},//若不用this,则无法访问y

    set y(value){ this.x=value;}

    }

    alert(test.x);

    alert(test.y);

    test.y="opq";

    alert(test.y);

    alert(test.x);

            6.7 属性的特性

                  通过属性setter和getter的设置,可以实现属性的读、写、可枚举、可配置的特性

                  Object.getOwnPropertyDescriptor()可以获得某个对象特定的自有属性的属性描述,      

    Object.getOwnPropertyDescriptor({x:'1'},"x");

    //返回 {value:1,writeable:true,enumerable:true,configurable:true}

                   Object.definePeoperty(),设置属性的特性,或者想让新建属性具有某种特性

    var o={};

    Object.defindePeoperty(o,"x",{value:"abc",writeable:true,enumerable:false,configurable:true});

    o.x;//1  有值

    Object.keys(o)// {}   不可枚举

    Object.definePeoperty(o,"x",{enumerable:true});

    Object.keys(o)//{x:"abc"}

                  Object.definePeoperties(),  可以设置多个属性的版本

                  若给不可创建或修改的属性使用definePeoperty,会报错

    /*不可枚举的extend()方法

    *

    */

    Object.definePeoproty(Object.prototype,"extend",{

               writeable:true,

               enumerable:true,

               configurable:true,

               value:function(o){

                     var names=Object.getOwnpropertyNames(o);

                     for(var i=0;i<names.length;i++)
                    {

                          //若属性已存在,则跳过

                          if(names[i] in this)continue;

                          var desc=Object.getOwnPropertyDescriptor(o,names[i]);

                          Object.defineProperty(this,names[i],desc);
                    }

               }

    });

            6.8 对象的三个属性

               6.8.1 原型属性

                   创建:

    对象直接量,使用Object.prototype作为原型

    new,使用 构造函数的prototype作为原型

    Object.create(),使用 传入的第一个参数作为原型

                   查找:

    Object.getPrototypeOf()//ECMAScript 5

    o.constructor.prototype//ECMAScript 3

              6.8.2 类属性

                    对象的类属性是一个字符串,用以表示对象的类型信息

    function (){

        if(o===null) return "Null";

        if(o===undefined) return "undefined";

        return Object.prototype.toString.Call(o).slice(8,-1);
    }

            6.9 序列化对象

                   JSON.stringify();

                   JSON.parse();

                   注:ECMAScript 5中的这些函数的本地实现和http://json.org/json2.js 基本一样,所以可以引入json2.js在ECMAScript的环境中使用这些函数

  • 相关阅读:
    有效管理时间的十八种方法
    针对某个块下面的按钮注册点击事件
    vs2015运行项目时出现“编译器失败,错误代码为 1”的解决方案
    淘宝API调用 申请 获取session key
    中小型研发团队架构实践:生产环境诊断利器WinDbg帮你快速分析异常情况Dump文件
    中小型研发团队架构实践:如何规范公司所有应用分层?
    中小型研发团队架构实践:电商如何做企业总体架构?
    中小型研发团队架构实践:高效率、低风险,一键发布并测试的持续集成工具Jenkins
    ASP.NET全栈开发验证模块之在Vue中使用前端校验
    计算机基础存储结构
  • 原文地址:https://www.cnblogs.com/qiuyeyaozhuai/p/3457495.html
Copyright © 2020-2023  润新知