读《JavaScript权威指南》笔记(二)
1.加号运算和比较运算符的区别
对于数字和字符串操作符来说,加号运算符和比较运算符的行为都有所不同,前者更偏爱字符串,如果它的其中一个操作数是字符串的话,则进行字符串连接操作。而比较运算符则更偏爱数字,只有在两个操作数都是字符串的时候,才会进行字符串的比较:
1 + 2 // 加法. 结果是3 "1" + "2" // 字符串连接,结果是"12" "1" + 2 // 字符串链接,2转换为"2",结果是"12" 11 < 3 // 数字的比较,结果为false "11" < "3" // 字符串比较,结果为true "11" < 3 // 数字的比较,"11"转换为11,结果为false "one" < 3 // 数字的比较,"one"转换为NaN,结果为false
2.函数声明语句
函数声明语句通常出现在JavaScript代码的最顶层,也可以嵌套在其他函数体内。但在嵌套时,函数声明只能出现在所嵌套函数的顶部。也就是说,函数定义不能出现在if语句、while循环或其他任何语句中。
和通过var声明变量一样,函数定义语句中的函数被显式地“提前”到了脚本或函数的顶部。因此它们在整个脚本和函数内都是可见的。使用var的话,只有变量声明提前了——变量的初始化代码仍然在原来的位置。然而使用函数声明语句的话,函数名称和函数体均提前:脚本中的所有函数和函数中所有嵌套的函数都会在当前上下文中其他代码之前声明。也就是说,可以在声明一个JavaScript函数之前调用它。
3.void操作符
javascript:void(0) void是无返回值的操作。在a标签中,如果href="#",点击后会回到网页顶部,javascript:void(0)会没有任何反应。鼠标移上去时,仍然显示手指形状的图标。
4.左值
左值是一个古老的术语,它是指表达式只能出现在赋值运算符的左侧,在js中,变量,对象属性和数组元素均是左值。
5.delete操作符
delete是一元操作符,它用来删除对象属性或者数组元素。需要注意的是,删除属性或者删除数组元素不仅仅是设置了一个undefined的值。当删除一个属性时,这个属性将不再存在。
6.赋值操作符
赋值操作符的结合性是从右至左,也就是说,如果一个表达式中出现了多个赋值运算符,运算顺序是从右到左。因此,可以通过如下的方式来对多个变量赋值:
i=j=k=0; //把三个变量初始化为0
7.&& 和 ||
// 对于p和q取任意值,这两个等式都永远成立 !(p && q)=== !p || !q !(p || q)=== !p && !q
8.instanceof运算符
instanceof运算符希望左操作数是一个对象,右操作数标识对象的类。如果左侧的对象是右侧类的实例,则表达式返回true;否则返回false。第9章将会讲到,JavaScript中对象的类是通过初始化它们的构造函数来定义的。这样的话,instanceof的右操作数应当是一个函数。比如:
var d = new Date();// 通过Date()构造函数来创建一个新对象 d instanceof Date; // 计算结果为true,d是由Date()创建的 d instanceof Object; // 计算结果为true,所有的对象都是Object的实例 d instanceof Number; // 计算结果为false,d不是一个Number对象 var a = [1, 2, 3]; // 通过数组直接量的写法创建一个数组 a instanceof Array; // 计算结果为true,a是一个数组 a instanceof Object; // 计算结果为true,所有的数组都是对象 a instanceof RegExp; // 计算结果为false,数组不是正则表达式
需要注意的是,所有的对象都是Object的实例。当通过instanceof判断一个对象是否是一个类的实例的时候,这个判断也会包含对“父类”(superclass)的检测。如果instanceof的左操作数不是对象的话,instanceof返回false。如果右操作数不是函数,则抛出一个类型错误异常。
为了理解instanceof运算符是如何工作的,必须首先理解“原型链”(prototype chain)。原型链作为JavaScript的继承机制。为了计算表达式o instanceof f,JavaScript首先计算f.prototype,然后在原型链中查找o,如果找到,那么o是f(或者f的父类)的一个实例,表达式返回true。如果f.prototype不在o的原型链中的话,那么o就不是f的实例,instanceof返回false。
9.in运算符
in运算符希望它的左操作数是一个字符串或可以转换为字符串,希望它的右操作数是一个对象。如果右侧的对象拥有一个名为左操作数值的属性名,那么表达式返回true,例如:
var point = { x:1, y:1 }; // 定义一个对象 "x" in point // => true:对象有一个名为"x"的属性 "z" in point // => false:对象中不存在名为"z"的属性 "toString" in point // => true:对象继承了toString()方法 var data = [7,8,9]; // 拥有三个元素的数组 "0" in data // => true:数组包含元素"0" 1 in data // => true:数字转换为字符串 3 in data // => false:没有索引为3的元素
10.return语句
return语句返回函数表达式的计算结果,只能在函数体内出现,如果不是的话会报语法错误
11.for in 循环
for in循环对象可枚举的属性,可以循环数组的索引属性。如果要循环的表达式为null或者undefined,JavaScirpt解释器将会跳过循环并执行后续的代码。如果表达式等于一个原始值,这个原始值将会转换为与之对应的包装对象
12.for循环
for循环中那三个表达式中的任何一个都可以忽略,但是两个分号必不可少。如果省略test表达式,那么这将是一个死循环
for(initialize ; test ; increment) statement //初始化 检测 更新
13.switch循环
由于对每个case的匹配操作实际上是“===”恒等运算符比较,而不是“==”相等运算符比较,因此,表达式和case的匹配并不会做任何类型转换。
switch(n) { case 1: 执行代码块 1 break; case 2: 执行代码块 2 break; default: n 与 case 1 和 case 2 不同时执行的代码 }
14.标识符
JavaScript标识符必须以字母、下划线(_)或美元符($)开始。后续的字符可以是字母、数字、下划线或美元符(数字是不允许作为首字符出现的,以便JavaScript可以轻易区分开标识符和数字)。