第二章在html中使用Javascript
2.1<script>
在使用<script>嵌入JS代码时,不要再代码中的任何地方出现"</script>"字符串,否则会产生错误,可以这样用"<\/script>"
2.1.2延迟脚本
在<script>元素中设置defer属性,相当于告诉浏览器立即下载,但延迟执行。只适用于外部JS文件,IE4~7支持defer
2.4<noscript><p>本页需要浏览器支持(启用)JS</p></noscript>
2.5一般把<script>元素放在</body>标签前面
第三章基本概念
3.1.2标识符
所谓标识符就是指变量、函数、属性的名字或者函数的参数。第一个字符必须是字母或_或$,其他字符可以是字母、_、$、数字
3.3变量 变量可以用来保存任何值
在函数中使用var定义的变量是局部变量,这个变量在函数退出后会被销毁,因此在外部不能访问了
在函数内部省略var操作符可以定义全局变量,但不推荐,会导致不必要的混乱
可以使用一条语句定义多个变量,中间用逗号分隔
3.4数据类型
JS中有5中基本(标准)类型undefined null boolean number string和一种对象类型Object
3.4.1 typeof操作符
typeof可以识别标准类型(null除外)不能识别具体的对象类型(function除外)
如果这个值未定义 undefined 若果这个值是对象或null object 如果这个值是函数 function
typeof是一个操作符不是函数,圆括号可用,但不是必须
3.4.2undefined类型
对未初始化的变量执行typeof操作符会返回undefined值,而对未声明的变量执行typeof操作符同样会返回undefined值
3.4.3null类型
如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null,这样一来只要检查null值就可以知道相应的变量是否已经保存一个对象的引用
3.4.4boolean类型
可以对任何数据类型的值调用boolean()函数,而且该值总会返回一个boolean值 在if语句中很重要,会自动调用boolean函数
3.4.5number类型
在进行算术计算时,所有八进制和十六进制表示的数值都将被转化为十进制数值
isFinite()在参数位于最小和最大数值之间时会返回true
任何涉及NaN的操作都会返回NaN,NaN与任何值都不相等,包括NaN本身
isNaN()函数在接到值后会尝试将这个值转化为数值,不能转为数值的这个函数返回false
有3个函数可以把非数值转化为数值 返回的是NaN或十进制的数值
number()可用于任何数据类型,
parseInt()函数会忽略字符串前的空格,如果第一个字符不是数字或负号会返NaN,若是数字继续解析第二个,直到解析完所有后续字符或者遇到了一个非数字字符为止。parseInt("oxAF",16)指定基数16作为第二个参数,返回的是十进制的数
parseFloat()从第一个字符解析直到遇见一个无效的浮点数字字符为止,(第二个小数点无效),只解析十进制值,其他进制值返回0
3.4.6string类型
var text="this is the letter sigma:\u03a3.";
alert(text.length); //28 6个字符长的转义序列表示1个字符
数值、布尔值、对象、字符串值都有tostring()方法,null undefined没有该方法
默认情况下tostring()方法以十进制格式返回数值的字符串表示,通过传递基数可以输出其他进制格式
在不知道要转化的值是不是null undefined的情况下,可以使用string()函数 string(null); //"null"
3.4.7object类型
object的每个实例都具有下列属性
constructor:保存着用于创建当前对象的函数
hasownproperty(propertyname):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在.ropertyname必须以字符串形式指定
isprototypeof(object):用于检查传入的对象是否是另一个对象的原型
propertyIsEnumberable(propertyname):用于检查给定的的属性能否使用for -in语句来枚举
toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应
toString()返回对象的字符串表示
valueof()返回对象的字符串、数值或布尔值
3.5操作符
3.5.1一元操作符+ - ++ --
前置递增或递减操作符时,变量的值都是在语句被求值以前改变的
后置递增或递减操作是在包含他们的语句被求值之后才执行的
这4个操作符还可以用于字符串、布尔值、浮点数值和对象
3.5.2位操作符
3.5.3布尔操作符 ! && ||
1逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再求其反。同时使用两个逻辑非操作符会将一个值转化为与其对应的布尔值,相当于boolean()
2逻辑与操作符
逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作不一定返回布尔值
如果第一个操作数的布尔值为false,则不解析第二个操作数直接返回第一个操作数,如果第一个的布尔值为true第二个操作数的布尔值为false,则返回第二个操作数
如果有一个操作数为null或NaN或undefined则返回null NaN undefined
3逻辑或操作符
逻辑或操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作不一定返回布尔值
如果第一个操作数的布尔值为true,则不解析第二个操作数直接返回第一个操作数,如果第一个的布尔值为false第二个操作数的布尔值为true,则返回第二个操作数
如果有一个操作数为null或NaN或undefined则返回null NaN undefined
3.5.4乘性操作符 * / %
在操作数为非数值的情况下会自动执行隐式类型转换
3.5.5 加性操作符
1加法 如果有一个操作数是字符串,则将另一个操作数转化为字符串,再拼接起来
如果有一个操作数是对象、布尔值,则调用他们的toString()方法取得相应的字符串
3.5.6关系操作符 < > <= >=
3.5.7相等操作符 相等==和不相等!=——先转换为数值在比较 全等===和不全等!==——仅比较不转换
null和undefined是相等的 null和undefined不全等 数据类型不同
3.5.8条件操作符 var boolean_expression?true_value:flase_value
3.5.9复制操作符
3.5.10 逗号操作符 使用逗号操作符可以再一条语句中执行多个操作,多用于声明多个变量
3.6语句
通过for-in 语句循环输出的属性名的顺序是不可预测的
label语句 可以再代码中添加标签,以便将来使用
with语句的作用是将代码的作用域设置到一个特定的对象中
switch语句中可以使用任何数据类型
3.7函数 argument.length用来确定传递进来多少个参数,arguments[0]表示第一个参数 与数组类似
第四章变量、作用域和内存问题
4.1基本类型的值和引用类型的值
在给变量赋值时,解析器必须确定这个值是基本类型还是引用类型
基本类型是按值访问的
引用类型是按引用访问的,其值保存在内存中,在操作对象时是操作对象的引用
4.1.1动态的属性
对于引用类型,我们可以为其添加属性和方法,也可以改变和删除其属性和方法,但是我们不能给基本类型的值添加属性,尽管不出错
4.1.2复制变量值
如果从一个变量向另一个变量复制基本类型的值时,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上,这两个值是独立的不会互相影响。
如果一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份到为新变量分配的空间中,不同的是这个副本其实是一个指针。复制操作结束后,两个变量实际上将引用同一个对象,因此改变其中一个变量就会影响另一个变量。
4.1.3 传递参数
ECMAscript中所有函数的参数都是按值传递的,基本类型值和引用类型值的传递就如同其变量的复制一样
4.1.4 检测类型
typeof常用于检测基本数据类型(null除外) typeof null; //object typeof不能识别具体的对象类型(function除外)
如果变量是给定引用类型的实例,那么instanceof操作符就会返回true person instanceof Object; //true
4.2执行环境
全局执行环境被认为是window对象,所有全局变量和函数都作为window对象的属性和方法创建的
内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数
4.2.1延长作用域链
try-catch语句的catch块会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明
witch语句会将指定的对象添加到作用域链中
4.2.2JS没有块级作用域
1声明变量
使用var声明的变量会自动被添加到最接近的环境中,如果初始化变量时没有使用var,该变量会自动被添加到全局环境
在编写JS过程中,不声明而直接初始化变量是一个常见的错误做法
2查询标识符
沿着作用域链向上逐级查找,找到后即搜索停止
4.4小结
基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中
从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本
引用类型的值是对象,保存在对内存中
从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象
确定一个值是哪种基本类型可以使用typeof操作符,而确定一个值是哪种引用类型可以使用instanceof
所有变量(基本类型和引用类型)都存在于一个执行环境中,这个执行环境决定了变量的生命周期
函数的局部环境不仅能访问函数作用域中的变量,而且能访问其父环境乃至全局环境中的变量
第五章 引用类型
5.6基本包装类型
每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象
toFixed()方法会按照指定的小数位返回数值的字符串表示
toExponential()方法返回以指数表示法
toPrecision()方法可能返回固定大小格式
charAt()方法以单字符子字符串的形式返回给定位置的那个字符
contact()可以接收任意多个参数,可以拼接任意多个字符串
第六章 面向对象的程序设计
6.2.2构造函数模式 构造函数始终都应该以一个大写字母开头,必须使用new操作符
6.2.3原型模式 这个对象的用途是包含可以由特定的所有实例共享的属性和方法
isPrototypeOf()方法来确定对象之间是否存在指向关系
alert(Person.prototype.isPrototypeOf(person1)); //true
Object.getPrototypeOf()返回取得一个对象的原型
使用hasOnProperty()方法可以检测一个属性是存在实例中,还是存在原型中。是从Object继承来的
原型与in操作符
单独使用和for-in循环中使用
在单独使用时 in操作符会在对象都够访问给定属性时返回true,无论该属性存在实例中还是原型中
6.2.4组合使用构造函数模式和原型模式
6.3.2借用构造函数
通过使用apply()和call()也可以在新创建的对象上执行构造函数,从而实现继承
6.3.3组合继承
将原型链和借用构造函数的技术组合到一起,使用原型链实现对原型链属性和方法的继承,而通过借用狗仔函数实现对实力属性的继承
第七章 函数表达式
创建函数的两种方式:函数声明function关键字和函数表达式var functionname=function() 匿名函数 函数表达式在调用前必须先赋值
函数声明提升 是指在执行代码之前会先读取函数声明,这意味着可以把函数声明放在调用他的语句后面
7.1递归
递归函数是在一个函数通过名字调用自身的情况下构成的
arguments.callee是一个指向正在执行的函数的指针,因此可以用来实现对函数的递归调用,比使用函数名更保险 在严格模式下不能通过脚本访问callee,可以使用命名函数表达式来实现相同的效果
7.2闭包
闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式,就是在一个函数内部创建另一个函数,