JavaScript 高级程序设计 读书笔记

来源:互联网 发布:网络电视有什么功能 编辑:程序博客网 时间:2024/04/29 16:37

var div = document.getElementById("div1");

仅供本人使用,没有很大的阅读价值


2014年2月15日21:52:46

通常javaScript放在head标签之间, 这样的话, 会在所有的javaScript代码都加载完毕之后才开始显示页面, 也就是造成显示的延迟, 这样有两个办法,可以解决, 并且这两个方法等效:

①在<Script>的属性, 设置defer="defer"

②把Script代码写在body之内


2014年2月24日20:44:56

一个变量声明但是没有初始化, 那么它的值自动获得undefined. 使用typeof()函数检测传入的参数时, 对于undefined 类型,得到的是undefined返回值. 而对于赋初值为null的变量, 得到的是object返回值, 也就是说, null 指的是对象指针, 它本身是一个对象. 而奇怪的是 undefined == null 返回的true , 这是需要值得注意的地方.

5

2014年2月25日10:45:55

在《JavaScript高级程序设计》,第二版,30页中, 说对于定义没有赋值的变量、和赋值为null变量, 它们没有toString()方法, 所以最好用String()方法来返回给定对象的值.

而在后文中说, Object的每个实例都有toString()方法, 我的疑问是难道null 和undefined类型的变量不是Object吗, 这里显得很诡异.   后来看到, 所有引用类型的值都是Object的实例.

var c = " 2";var d = 20;var e;alert(e.toString());//忽略alert(d.toString());//有显示
这里说明,他们确实没有这个方法.


2014年2月25日18:56:18

在javaScript当中创建对象和添加属性的方式很灵活

var person = new Object();person.ownName = "special";alert(person.ownName);//将显示special


2014年2月25日19:54:45

监测数据类型时, typeof 是一个很强有力的工具, 但是对于赋初值为null的变量和object类型的变量, 返回的都将是object.

那么可以使用instanceof操作符, 使用方法, result = variable instanceof constructor. 如果是 比如: alert(person instanceof Object);可以检测是不是Object变量.

用typeof检测函数的时候会返回function, safari和Chrome 检测正则表达式的时候会也会返回"function".


2014年2月26日10:46:42

创建对象的方式

var person = new Object();person.name = "Lyle";person.age = 20;

var person = {  name : "Lyle",  age : 20};


2014年2月26日12:01:13

在章节,5.2.2中,有一段代码很有意思.

var colors = new Array("red","blue");colors.push("brown");colors[3] = "black";alert(colors.length);//输出4
那么, 如果我直接,
colors[5] = "pink";
会怎么样.

当然, 都是undefined.

实验代码是:

var colors = ["red","blue"];colors.push("green");colors[6] = "pink";for(var i=0; i<colors.length;++i){    document.write("<p>"+colors[i]+"</p>");    document.write("<br />");};

2014年2月26日16:14:17

写正则表达式的方式有两种 ,

var p = / [bc]at/ i;var p = new RegExp("[bc]at","i");
定义函数有两种方式,

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

2014年2月26日16:42:43

没有重载的概念, 后面定义的同名函数会覆盖前面定义的同名函数.


2014年2月26日21:00:38

原型模式, 据说, 没定义一个方法,在javaScript当中就会有一个对象,  假如在构造函数中定义了一个属于这个类型(构造函数)的方法(展示叫做show()), 那么,每次调用这个构造方法创建对象的时候. 不同的实例中的show()是不一样的. 那么意思就是说, 每个实例的show()功能都是一样的,但是却用的是不同的对象. 多么浪费啊.

解决的办法就是原型模式, 把成员属性和方法都加到构造函数的prototype里面就可以了, 这里需要理解的就是,其实prototype其实也是一个对象.

原型模式的代码:

function Person(){}Person.prototype.name = "Lyle";Person.prototype.age = 20;Person.prototype.job = "software engineer";Person.prototype.sayName = function(){    alert(this.name);};var person1 = new Person();person1.sayName();var person2 = new Person();person2.sayName();

简化模式的带代码

function Person {}Person.prototype = {    name : "Lyle",    age : 20,    job : "software engineer",    sayName : function (){        alert(this.name);    };};

2014年2月27日13:17:36

//一般情况下, 都是构造函数模式和原型模式的组合function Person(name ,age, job){    this.name = name;    this.age = age;    this.job = job;    this.friends = ["shelby","Court"];}Person.prototype = {    constructor : Person ,    sayName : function()    {        alert(this.name);    }}

2014年2月27日13:29:30

我有一个问题不明白, 那就是书里面说寄生构造函数模式 和 稳妥构造函数模式, 的严正区别. 寄生模式,返回的是一个Object对象, 和构造函数原型没有什么区别.

打算先不管这些, 然后那些继承也先不管


2014年2月27日15:28:07

arguments.callee 是指向正在执行函数的指针. 在递归中用它来调用函数是再好不过的选择了.


2014年2月28日11:37:23

获得窗口大小以及窗口位置的方式

var text = "the width of this window is ";text +=window.screen.width;text +="<br /> the height of this window is ";text +=window.screen.height;text +="<br />the screenleft is ";text +=window.screenX;text +="<br />the screenTop is ";text +=window.screenY;document.write(text);

2014年2月28日16:23:14

打开新窗口

window.open("http://www.baidu.com","newWindow","height=400,width=400,top=10,left=20,resizable=yes");


2014年2月28日19:46:23

/*位置操作,立即打开新的URL,这里指的是本地url*//*location.assign("http://www.baidu.com"); *window.location("http://www.baidu.com" * /location.href="http://www.baidu.com";//

2014年3月2日15:14:38

在html中,利用<script language="javascript" type="text/javascript" src="./script.js"></script>引入的两个js是不可以相互调用的


2014年3月2日15:35:43

<div id="div1">    <ul style="background-color: saddlebrown; text-align: left">        <li>生活是一种无奈</li>        <li>生活是不知所措</li>        <li>生活充满了挑战</li>        <li>生活意味你还活着</li>    </ul></div>

在这里,对于

var div = document.getElementById("div1");

返回的div中, div的childNodes 中有三个字节点,如果写成

<div id="div1"><ul style="background-color: saddlebrown; text-align: left">        <li>生活是一种无奈</li>        <li>生活是不知所措</li>        <li>生活充满了挑战</li>        <li>生活意味你还活着</li>    </ul></div>
则,只有一个子节点.

代码如下

var div = document.getElementById("div1");var arrayOfNodes = Array.prototype.slice.call(div.childNodes,0);document.write(arrayOfNodes+"<br />");for(var i=0; i<arrayOfNodes.length; ++i){    var a = arrayOfNodes[i];    document.write(">>>"+a.nodeName+"  "+ a.nodeType+"  "+a.nodeValue+"<br />");}

输出

[object Text],[object HTMLUListElement],[object Text]
>>>#text 3
>>>UL 1 null
>>>#text 3


0 0