【读书笔记】细读《JavaScript权威指南》(一)

2.1字符集

javascirpt程序是用Unicode字符集编写的。是一门大小写敏感的语言。
需要注意的是,HTML并不区分大小写。


2.3直接量

直接量(literal): 程序中直接使用的数据值。


2.4标识符与保留字

js标识符必须以字母、美元符号或下划线开头,后续字符可以是字母、数字、美元符号或下划线。


2.5 可选的分号

var a
a
=
3
console.log(a)

输出结果为3;
JS并不是在所有换行处都填补分号,只有在缺少分号就无法正确解析代码的时候填补。但这也不是绝对的,所以有时候会引发一些歧义:

function f (a) {return a * 2}
var a = 3;
var b = a + f
(a).toString();
console.log(b);

输出结果为36;
js实际上是执行了var b = a + f(a).toString()。然而var b = a + f是可以被正确解析的。
通常,如果一条语句以‘(’, ‘[‘, ‘/’, ‘+’ 或 ‘-‘开头,那么它有可能会跟前一条语句合在一起解析。
改一下上文标粗的结论: 如果当前语句和下一行语句无法合并解析,js则会在第一行后添加分号。但存在以下两个例外:

  1. 涉及到return、break和continue语句,这三个关键字后换行就要加分号。

    return 
    false;
    

    会被解析成:return; false

  2. 涉及到++、- -运算符,优先用作前缀表达式而非后缀表达式。

    x
    ++
    y

    会被解析成: x; ++y

阅读更多

JavaScript权威指南 读书笔记(一)

01-05

[code=JScript]rnjs是区分大小写的,但html不区分,所以容易混淆。rnrnrnjs关键字(部分):in,default,with,deleternrnrn如果尝试给一个未用var声明的变量赋值,JS会隐式声明该变量,但隐式声明的变量总是被创建为全局变量。rnrnrnJS没有块级作用域,函数中声明的所有变量,无论是在哪里声明的,在整个函数中它们都是有定义的。rn示例1:rnif(..)rn var j=0;rn rnalert(j); //j仍有定义,但没有被初始化,显示"undefined"rn示例2:rnvar scope='global';rnfunction f()rn alert(scope); // 显示"undefined",而不是"global"rn var scope = "local";rn alert(scope);rnrn上面的示例相当于:rnvar scope='global';rnfunction f()rn var scope;rn alert(scope); // 知道为什么结果是"undefined"了吧rn scope = "local";rn alert(scope);rnrn这个例子说明了把所有变量的声明放在函数的开头是一个好的编程习惯。(在java中恐怕这不是好习惯)rnrnrnrnvar x; // 声明一个未赋值的变量,它的值为undefinedrnalert(u); // 使用未声明的变量将引发错误rnu=3; // 给未声明的变量赋值,将创建该变量rnrnrnrnvar f = new Function("x","y","return x*y;"); // Function()构造函数 每次调用都会解析和编译一次rn等价于rnfunction f(x,y) return x*y; // function语句rn等价于rnvar f = funtion(x,y) return x*y; // 函数直接量 只被解析和编译一次rnrnrnrnrn原型对象:rnrn//为我们的类定义一个构造函数方法rnfunction Circle(x,y,r)rn this.x=x;rn this.y=y;rn this.r=r;rnrnrn//为了能和JavaScript1.1兼容,在使用原型对象给那个类的对象赋予方法和常量之前,rn//至少应该创建该类的一个对象。rnnew Circle(1,2,3);rnrn//定义一个常量,即所有Circle对象共享的属性rnCircle.prototype.pi = 3.14159;rnrn//定义一个计算圆周长的方法rnfunction Circle_circumference()rn return 2 * this.pi * this.r;rnrn//然后把它赋值给原型对象的属性rnCricle.prototype.circumference = Circle_circumference;rnrn//定义另一个方法 这次使用函数直接量来定义函数rnCircle.prototype.area = function() rn return this.pi * this.r * this.r;rnrnrn//重写Object的toString方法rnCircle.prototype.toString = function() rn return "this is a circle.";rnrnrn//重写Object的valueof方法rnCircle.prototype.valueof = function() rn return "It's area is " + this.area();rnrnrn//类方法,构造函数自身的属性(而不是构造函数的原型对象的属性),注意区别rn//这里不能用this,相当于Java的静态方法,\(^o^)/~rnCircle.getPi = function() return 3.14159;rnrn//现在我们可以创建一个实例并调用它的方法rnvar c = new Circle(1.1, 1.2, 1.0);rnvar a = c.area();rnvar p = c.circumference();rnvar pi = Circle.getPi();rnalert(c); // 相当于 alert(c.valueof()); rn//当进行对象到字符串的自动转换时,valueof()的优先级高于toString()rnrn//系统类 原型对象使用举例rnString.prototype.endsWith = function(c)rn return c == this.charAt(this.length-1);rnrnrn附:单词circle、prototype的读写rnrnrnrn虽然JavaScript不是一种以类为基础的面向对象程序设计语言,但JavaScript大量的使用了对象,而且它还有自己的以原型对象为基础的继承机制,这些又说明JavaScript是一种真正的面向对象语言。虽然JavaScript并没有正式的类的概念,但它用构造函数和原型对象模拟了类。rnrnrnrnobject.property 等价于 object["property"] rn后者更灵活,比如有时候可能写成object[str+""+i]rnrnrnrnObject类的部分属性和方法:rn1、toString()方法rn Object的toString()方法返回的字符串形式总是 [object class] ,class是对象的内部类型,通常对应于该对象的构造函数名。rn2、valueof()方法rn 相似于toString()方法。定义valueof()时需要注意,某些环境中,当进行对象到字符串的自动转换时,valueof()的优先级高于toString()。rn3、hasOwnProperty()方法rn var o = new Object();rn o.hasOwnProperty("under"); // false,没有定义该属性rn o.hasOwnProperty("toString"); // false,toString是一个继承属性rn Math.hasOwnProperty("cos"); // true,Math对象有cos属性rnrnrnrn正则表达式:rnvar pattern = /s$/; 等价于 var pattern = new RegExp("s$");rn就像字符串直接量被定义为包含在引号内的字符一样,正则表达式直接量也被定义为包含在一对斜杠之间的字符。rn[/code]才看了一半,忍不住发到这共享给大家看[img=http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/onion/9.gif][/img]

没有更多推荐了,返回首页