我真的很佩服副院长~他是一个很有耐心 极其细致的人

工作态度严谨  代码简洁风格统一~再乱遭遭的代码只要经过他的手就会变的很漂亮

羡煞我也~

不说废话了  还是乖乖看书吧~maybe可能也许的某一天 我也可以。。。咕~~(╯﹏╰)b还是别做白日梦了

--------------part2--------------------------------------------------------------------------------------------------------

注释:ECMA5-ECMAScript5
在开始之前,先讲一下关于变量的知识:

好的习惯1:把所有的变量声明放置在函数的开头是一个好的编程习惯

还有一个很重要的概念~不可变的原始值和可变的对象引用(基本类型和引用类型

javascript中的原始值:undefined null boolean  string number   原始值是不可修改的。只有他们的值相等时他们才会相等。

引用类型:对象(包括数组和函数)  他们的值是可以修改的。对象的比较均是引用的比较,当且仅当他们引用同一个基对象时,他们才相等。

这就是为什么在工作中碰到一个问题~就是我明明没有对一个数组进行操作,为什么最后它的值却改变了

记住这一句话:变量保存了基本类型的实际值,而对于引用类型只保存对它的引用值。

eg:基本类型(数值  布尔值,null和undefined)
var a=1;
var b=a;
var a = 3.14;
alert(b) b = 1 引用类型(对象,数组和函数)
var a =[1,2,3]
var b =a;
a[0] = 99;
alert(b) b = [99,2,3]

先了解下typeof运算符:

   x                                        typeof x
undefined "undefined"
null "object"
true/false "boolean"
任意数字或NaN "number"
任意字符串 "string"
任意函数 "function"
任意内置对象(非函数) "object"

 

对象

  除了字符串、数字、true、false、null和undefined之外,javascript中的值都是对象,尽管,最常见的用法是创建,设置,查找, 删除,检测和枚举。

  1:对象的创建

    可以通过对象直接量,关键字new和ECMA5中的object.creat()创建对象。

    我想前面2个大家都很熟悉,对于第3个的方式首先解释下原型。这也是我很薄弱但是确又是很重要的知识点(\(^o^)/~我要开始啰嗦了哈)。

    每个Javascript对象(null除外)都和一个对象相关联。“另一个”对象就是我们熟知的原型,每一个对象都从原型继承属性。

    现在我们来分析下~

    对象直接量创建对象都具有同一个原型-object.prototype

    通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值。

    没有原型的对象为数不多,object.prototype就是其中之一。他不继承任何属性。其他的对象的原型都是普通对象,普通对象都具有原型。所有的内置构造函数(以及大部分自定义的构造函数)都具有一个继承自object.prototype的原型。

    eg,Date.prototype的属性继承自object.prototype。这一系列链接的原型对象就是所谓的“原型链”

    object.creat({x:1;y:2})它创建了一个对象,第一个参数是这个对象的原型。

    object.creat({object.prototype});      //他和{}和new object()一样

    object.creat()他实现了“可以使任意对象可继承”,这是一个强大的特性。此方法是ECMA5才有,那ECMA3如何去实现呢?  

eg:通过原型继承创建一个新的对象
function inherit(p){
if(p == null) throw TypeError();
if(object.create)
return object.creat(p);
var t = typeof p;
if(p!=="object" && p!== "function")
    throw TypeError()
 function f(){}
 f.prototype = p;
 return new f(); //返回一个新的对象 它是原型是p
}
inherit()函数的其中一个用途就是防止库函数无意间(非恶意的)修改那些不受你控制的对象
var o={x:"donit change this value"};
library_function(inherit(0));

  2:对象的查询及设置

    对像的查询还有设置可以用a.name 或者a[name].

    注意只有在查询属性时才会体会到继承的存在,而设置属性则和继承无关。

    属性访问错误:当查询对象一个不存在的属性时不会报错,o.x返回undefined;但是查询不存在对象的属性时就会报错,o.x.length(null,undefined没有属性)

    可以用更简练的方法  var len = book&&book.x&&book.x.length;

  3:删除属性

     delete运算符可以只能删除对象可枚举的自有属性。

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

    eg:a={b:{c:1}};var t = a.b;delete a.b;consolse.log({"x":t.c}) //{x:1}

    由于已经删除的属性的引用依然存在,所以t.c的值还是1,所以在销毁对象的时候,要遍历属性中的属性,依次删除。否则会造成内存泄漏。

  4:检测属性

    in:"x" in o; 检测自有属性和继承属性

    hasOwnProperty:o.hasOwnProperty("x")  检测自有属性

    propertyIsEnumberable():o.propertyIsEnumberable("x")  他是hasOwnProperty的增强版,检测可枚举的自有属性时返回true。

                  某些内置属性是不可枚举的,通常由javascript代码创建的属性都是可枚举的,除非在ECMA5中使用一个特殊的方法来改变属性的可枚举性。

    还有一种更简单的 o.x!==undefined;if(o.x) o.x *=2;

  5:枚举属性

    for/in:遍历对象中可枚举的自有属性和继承属性。对象继承的内置对象是不可枚举的。

    要获取一个对象的自有属性经常这个样子

    for(prop in p){

      if(p.hasOwnProperty(prop)){

        .....

      }

    }

  6:属性setter和getter

    对象属性是由名字,值和一组特性(attribute)构成的。在ECMA5中,属性值可以用一个或两个方法替代,就是getter和setter。

    由getter和setter定义的属性称做“存取器属性”,它不同于”数据属性“,数据属性只有一个简单的值。

    当程序查询存取器属性时,调用getter方法。设置一个存取器属性的值时,调用setter方法。

    和数据属性不同,存取器属性不具有可写性。如果属性同时具有getter和setter,那么他是一个读/写属性。如果他只有getter方法,那么它是一个只读属性。如果它只有setter方法,那么它是一个只写属性,读取只写属性总是返回Unedfined.

    和数据属性相同的是存取器属性时可以继承的。

    eg:var o = {

        x:value,

        get access(){/*函数体*/},

        set access(){/*函数体*/}      

      };

  7:属性的特性

    所有通过ECMA3的程序创建的属性都是可写的,可枚举的和可配置的,且无法对这些特性做修改的。

    但是ECMA5是可以查询和设置这些属性特性的API,这些API对于库的开发者来说是非常重要的:

      * 可以通过这些API给原型对象添加方法,并将它们设置成不可枚举的,这让它们看起来更像内置方法

      *   可以通过这些API给对象定义不能修改或删除的属性,借此"锁定"这个对象。

    属性包含一个名字和4个特性。数据属性的4个特性是值(value)、可写性(writable)、可枚举性(enumberable)和可配置性(configurable)。

    存取器属性的4个特性是读取(get)、写入(set)、可枚举性和可配置性。

    为了实现属性特性的查询和设置操作,ECMA5定义了一个“属性描述符”的对象

    object.getOwnPropertyDescriptor({x:1},x):获取某个对象特定属性的属性描述符,稚嫩而过得到自有属性的描述符。要想获得继承属性的特性,需要遍历原型链(object.getPrototypeOf())

    var o ={};     

    object.defineProperty(o,"x",{value:1,writable:true,enumerable:false,configurable:true});o.x;//1  object.keys(o);//[]

    这个方法要么修改已有属性要么新建自有属性,但不能修改继承属性。

    object.defineProperties():同时修改或创建多个属性

    这个我就不在深入讨论了~细节问题请看Page136

  7:对象的三个属性

    每个对象都有与之相关联的原型(prototype),类(class)和可扩展性(extensible)。这些属性有什么作用呢,以及如何去查询和设置他们呢?

    原型属性:在实例对象创建之初就是设置好的~这个我就不继续多说了。

         在ECMA5中,Object.getPrototypeOf()可以查询他的原型链,ECMA3中灭有等价的函数,可以用o.constructor.prototype来检测一个对象的原型,这种方式并不可靠,请参考后面的内容“类和模块”的讲解。

          isPrototype():检测一个对象是否是另一个对象的原型(或处于原型链中)

          instanceof :判断一个对象是否是一个类的实例。

                var d= new Date();

                d.instanceof Date; //true

                d.instanceof Object; //true 

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

    可扩展性:对象的可扩展性用以表示是否可以给对像添加新属性。对象的可扩展性通常和属性的可配置行与可写性配合使用  

  8:序列化对象

    对象序列化是指将对象的状态转化为字符串,也可将字符串转化成对象。只能序列化对象可枚举的自有属性。对于一个不能序列化的属性俩说,在序列化的输出字符串中会将这个属性省略掉。

    ECMA5中提供了JSON.stringify()和JSON.parse()用来序列化和还原

    ECMA3中可以通过引入json2.js模块来使用ECMAScript5中的这些函数

  9:toString()方法

    默认的toString方法的返回值带有的信息量很少,因此很多类都带有自定义的toString().eg:Array.toString(),Date.toString()以及Function.toString();

  10:valueOf()

    跟toString方法类似,转化为数字的时候用这个方法,返回值带有的信息量很少,因此很多类都带有自定义的valueOf().

    

  

《javascript权威指南》读书笔记 -part2的更多相关文章

  1. JavaScript权威指南读书笔记

    JavaScript 1.变量 变量是一个表示值的符号,是一个名字,他的本质是值: var x; //----声明一个变量: 值通过等号“=”赋给变量,x = 16; 对象是名/值对的集合,或字符串到 ...

  2. JavaScript权威指南读书笔记【第一章】

    第一章 JavaScript概述 前端三大技能: HTML: 描述网页内容 CSS: 描述网页样式 JavaScript: 描述网页行为 特点:动态.弱类型.适合面向对象和函数式编程的风格 语法源自J ...

  3. Javascript权威指南——读书笔记

    一.JavaScript核心语法 1.字符串中接受RegExp参数的方法 (1)text.search(pattern)返回首次匹配成功的位置 (2)text.match(pattern)返回匹配组成 ...

  4. JavaScript 权威指南-学习笔记(一)

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! ## JavaScript 权威指南-学 ...

  5. JavaScript权威指南学习笔记6

    这两天主要翻看了书中的第18-22章,重点看了第17章:事件化处理,其它几章节主要是翻了下书知道有相关的概念,没有真正理解其中的内容,或者没有考虑究竟如何能把里面的内容应用到实际的项目中.说的讽刺一点 ...

  6. Javascript权威指南阅读笔记--第3章类型、值和变量(1)

    之前一直有个想法,好好读完JS权威指南,便于自己对于JS有个较为全面的了解.毕竟本人非计算机专业出生,虽然做着相关行业的工作,但总觉得对于基础的掌握并没有相关专业学者扎实,正好因为辞职待业等原因,还是 ...

  7. HTTP权威指南读书笔记

    HTTP权威指南笔记 读书有两种境界,第一种境界是将书读薄,另一种是读厚.本篇文章就是HTTP权威指南的读书笔记,算是读书的第一重境界,将厚书读薄.文章对HTTP的一些关键概念做了比较详细的概述,通读 ...

  8. css权威指南读书笔记

    今天翻手机,翻到了许久之前看css权威指南时的笔记,遂移到博客中来. 1.属性选择器p.one class名为one的p元素p[class][name] 含有class和name属性的p元素p[cla ...

  9. 经典的性能优化最佳实践 web性能权威指南 读书笔记

    web性能权威指南 page 203 经典的性能优化最佳实践 无论什么网络,也不管所用网络协议是什么版本,所有应用都应该致力于消除或减 少不必要的网络延迟,将需要传输的数据压缩至最少.这两条标准是经典 ...

  10. css权威指南读书笔记-第10章浮动和定位

    这一章看了之后真是豁然开朗,之前虽然写了圣杯布局和双飞翼布局,有些地方也是模糊的,现在打算总结之后再写一遍. 以下都是从<css权威指南>中摘抄的我认为很有用的说明. 浮动元素 一个元素浮 ...

随机推荐

  1. BAT之间的区别(学点网页编程,然后开始研究)

    A: 阿里不就是靠网页起家的吗? T: 腾讯靠客户端. B: 百度是靠网页背后的算法技术支持- 最近网页技术又发布了很多新功能,而现在网页功能也已经很强大了. 不知道自己是不是老了,总觉得不喜欢网页( ...

  2. MIUI是小米的核心竞争力

    MIUI与众多顶尖的互联网公司合作开发系统功能,题主说的很不完全,当然估计除了MIUI开发组也没人能说的很完整,我试着总结了一下,欢迎补充: 1.云服务:金山云(小米公司持有金山云公司9.87%的股份 ...

  3. Best Time to Buy and Sell Stock——LeetCode

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  4. SVN项目库错误Unsupported FS format svn: Expected FS format between '1' and '4'; found format '6'

    SVN项目库错误Unsupported FS format svn: Expected FS format between '1' and '4'; found format '6' 从这里找到解决方 ...

  5. 几何学中的欧拉公式:V-E+F = 2

    几何学中的欧拉公式:V-E+F = 2,V.E.F表示简单几何体的顶点数.边数.面数. 证明: 它的证明有多种,这里呈现一种递归证法. 对于任意简单几何体(几何体的边界不是曲线),我们考察这个几何体的 ...

  6. 【树形动态规划】【CTSC1997】选课 解题报告

    CTSC1997-选课 描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修了这 ...

  7. Android应用开发学习之图片切换器

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 如果我们要实现类似Windows的照片查看器切换上一张下一张照片的效果,可以使用图片切换器ImageSwitcher ...

  8. Jetty开发指导:框架

    Spring设置 你能嵌入Jetty到你的项目中,也能够使用差点儿全部的IoC类型框架,包含Spring.假设全部你想做的是在你的Spring中设置Jetty Server,那么以下的xml片段能够作 ...

  9. MFC中全局变量的定义及使用

    用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行.实际上有多种方法可以实现,这里只介绍两种 ...

  10. linux下清理系统垃圾

    可以使用以下命令清理系统垃圾sudo apt-get autoclean 清理旧版本的软件缓存sudo apt-get clean 清理所有软件缓存sudo apt-get autoremove 删除 ...