javascript 权威指南笔记

第一章:JavaScript 概述

第二章:词法结构

第三章:类型、值和变量

第四章:表达式和运算符

第五章:语法

1.如果没有用var语句给一个变量指初始值,那么虽然这个变量被声明了,但是在给它存一个值之前,它的初始值就是 undefined

2.使用var语句多次声明一个变量不仅是合法的,而且也不会造成任何错误。如果重复的声明有一个初始值,那么它担当的不过是一个赋值语句的角色。

3.虽然在全局作用域中编写代码时可以不使用var语句,但是在声明局部变量时,一定要使用var 语句。下面的代码说明了如果 不这样做,将会发生什么情况。

 scope="global";
function checkscope(){
    scope="local";
   alert(scope) ;
}
checkscope() ;
 scope="global";
function checkscope(){
    scope="local";
   alert(scope) ;
}
checkscope() ;
 scope="global";
function checkscope(){
    scope="local";
   alert(scope) ;
}
checkscope() ;
 scope="global";
function checkscope(){
    scope="local";
   alert(scope) ;
}
checkscope() ;
 scope="global";
function checkscope(){
    scope="local";
   alert(scope) ;
}
checkscope() ;
 scope="global";
 function checkscope(){
    scope="local";  // 改变了全局变量
   alert(scope) ;
}
checkscope() ;

这种情况不是不可以避免的,只要在声明所有变量时全部用var 。

var scope = "global scope" ;
function checkscope(){
    var scope = "local scope" ;
    function nested(){
        var scope = "nested sciope" ;
        alert(scope) ;
    }
    nested() ;
}
checkscope() ;
var scope = "global scope" ;  // 一个全局变量
function checkscope(){
    var scope = "local scope" ;// 一个局部变量
    function nested(){
        var scope = "nested sciope" ;
        alert(scope) ; // 输出局部变量
    }
    nested() ;
}
checkscope() ;
4.没有块级作用域
注意,和C、C++以及Java不同,JavaScript没有块级作用域。函数中声明的所有变量,无论是在哪里声明
的,在王整个函数中它们都是有定义的。在下面的代码中,变量i、j和中的作用域是相同的,它们三个
在整个函数体中都有定义。如果这段代码是用C、C++或Java编写的。情形就不是这样了。
var scope = "global" ;
function f(){
 alert(scope) ;  // 显示<span style="color:#FF0000">"undefined</span>" 而不是"global"
 var scope = "local" ;// 变量在此外被初始化,但到处都有定义
 alert(scope) ;// 显示local
}
                   ||

var f(){
 var scope ; // 全局声明
 alert(scope) ;
 scope = "local" ;// 此处初始化
 alert(scope) ;
}
这个例子说明将所有的变量声明放集中起来放在函数的开头是个好的编程习惯。

5.深入了解变量作用域

6.表达式和运算符

7.运算符

相等(==)/ 等同与(===)

不等(!=)/ 不等同与(!==)

8.JavaScript中字符串的比较

是严格地逐个字符进行比较,采用的是每个字符在Unicode编码集中的数值。虽然在某些情况下,Unicode
标准允许采用不同的字符序列对等价的字符串进行编码,但是JavaScript的比较运算符检测不出这些编码
差别,它们假定所有字符串都是以范式形式表示的。尤其要注意,字符串比较时会区分大小
写,在Unicode编码中(至少对Asscii码子集来说),所有大写字母小于所有小写字母。如果你不熟悉这一
规则,它会产生令你困惑的结果。例如,对于<运算符,字符串“Zoo”小与字符串“aardvark”

9.in运算符和instanceOf 运算符

10.由于 JavaScript 会自动插入分号,所以在 return 关键字和其它的表达式之间不要换行。

11.with 语句使用

   with(object)

       statement

 这一语句能够将object 添加到作用域的头部,然后执行statement ,再把作用链恢复到原始状态。

在实际使用中,使用with 语句可以大量减少输入。

eg:  with(frames[1].document.forms[0]){

    name.value = '' ;

    address.value="" ;

    email.value="" ;

}

这就减少了输入,因为不尽必在每个表单属性前都加前缀 frames[1].document.forms[0]

另:使用了with 语句的 JavaScript 的语句难优化,要比不使用with 的效率慢很多。

可改写为:

 var form = frames[1].document.forms[0] ;

form.name.value = "" ;

form.adress.value="" ;

form.email.value="" ;

12.javascript arguments 并非一个真正的数组,它是一个Arguments对象。虽然每个Arguments 对象都定义了带编码的数组元素和length属性,但它不是数组,将它看成偶然

具有带编码属性的对象更合适一些。

function a(a){
 alert(a) ;  // 10
 arguments[0]=null;
 alert(a) ;  // null
}
a(10);

13.javascript CALLEE函数

引用自身,当前正在执行的函数。这对于匿名函数非常有用。

var a = function(x){
 if(x==1) return x ;
 return x*arguments.callee(x-1) ;
}
alert(a(3)) 
14.定义自己的函数属性

当函数需要一个在整个调用过程中都不改变的值时,使用Function 对象的属性比定义全局变量(这会使名字空间变的散乱)更加方便。

// 创建并初始化静态变量
//因为函数在执行码前处理,所以在函数声明前不能真正实现这个赋值运算
test._a = 10 ;
function test(){ //
 alert(test._a++) ;
}

15.JS NEGATIVE_INFINITY 属性 - 用法

NEGATIVE_INFINITY 属性

返回比 JScript 能够表示的最小负数( -Number.MAX_VALUE )更小的值。

number .NEGATIVE_INFINITY

number 参数是 Number 对象.

说明

在能够访问 NEGATIVE_INFINITY 属性前不必创建 Number 对象。

JScript 将 NEGATIVE_INFINITY 值显示为 -infinity。该值数学上的作用与负无穷相同。

要求

版本 2

参阅

MAX_VALUE 属性 | MIN_VALUE 属性 | NaN 属性 | POSITIVE_INFINITY 属性 | toString 方法

应用于: Number 对象


第六章:对象 

方法有个很重要的属性,,即在函数体内部,关键字 this 的值的就变成了调用该方法的对象 ,


  17.protoType原型对象和继承

 每个对象都有原型对象 ,原型对象的属性是以它为原型的对象的属性。也就是说每个对象都继承原型对象的所有属性。

一个对象的原型是由创建并初始化该对象的构造函数定义的。JavaScript 中所有的对象都有protoType 属性,它引用了一个对象。虽然原型对象初始化时是空的,但是你在其中定义的任何属性都会被该对象创建的对象全部

18.JavaScript 中字符串的比较
19.框架之间的关系

    一个窗口中的任何框架都可以使用window 对象的属性 frames,parent,top属性来引用其它框架。每个窗口都有frames属性。这个属性引用一个window对象数组,其中每个元素代表的是这个窗口中包含的框架(如果一个窗口中没有任何框架,那么frames数组[]是空的,frames.length是0)。这样,窗口(或框架)就可以使用frames[0]来引用它的第一个框架,使用frames[1]引用第二个框架,以此类推。同样,运行在一个窗口中的JavaScript 代码可以引用它的第二个框架的第三个子框架,代码如下:

   frames[1].frames[2]

每个窗口还有一个parent属性,它引用包含这个窗口的window对象。这样窗口中的第一个框架就可以引用它的兄弟框架,代码如下:parent.frames[1]

如果一个窗口是顶级窗口,而不是框架,那么parent属性引用的就是这个窗口本身:parent==self .// 用于顶层窗口。


20.没有块级作用域

var scope = "global";
function disp_alert()
{
   alert(scope) ;  //  显示'undefined' 而不是 'global'
   var scope="local";   // 变量在此处被初始化,但到处都有定义
   alert(scope) ;  // 显示 local
}

等价与

function disp_alert()
{

   var scope ;
   alert(scope) ; 
   scope="local"; 
   alert(scope) ; 

这个例子说明了为什么将所有变量声明集中起来放置在函数的开头是一个好的编程习惯。

21.js 数组有个自定义遍历函数 contain

var x
var mycars = new Array()
mycars[0] = "Saab"
mycars[1] = "Volvo"
mycars[2] = "BMW"


for (x in mycars)
{
console.log(mycars[x] + "-"+x)

console.log(mycars.contain) ;


结果是:

function (a) {
    for (var i = 0; i < this.length; i++) {
        if (this[i].toLowerCase() == a.toLowerCase())
            return true;
    }
    return false;
}

6.2 属性的查询和设置

6.2.2 继承

6.2.3 属性访问错误

// 一种更简单的方法,获取subtitle 的 length 属性或underfined 
var len=book && book.subtitle && book.subtitle.length ;
 // && 运算符的短路行为

6.3 删除属性

delete 可以删除对象属性,但只是断开属性和宿主对象的联系,而不会去操作属性中的属性:

var o={x:1} ; // o 只有一个属性,并继承属性toString() ;
console.log(o.x) ;
delete o.x ;
console.log(o.x) ;
delete o.x ;
delete o.toString() ;
delete 1;

6.4 检测属性

除了使用 in 运算符之外,另一种更简便的方法是使用 “!==” 判断一个属性是否是underfined ,然而有一种场景只能使用 in 运算符而不能使用上述属性访问的方式。in 可以区分存在的属性和存在但值为 underfined 的属性。
“!==”可以区分underfined 和 null。有时则不必作这种区分 。

6.5 枚举属性





























评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值