js权威指南 读书笔记
- 格式:doc
- 大小:105.50 KB
- 文档页数:14
第一章 词法结构
Js是用Unicode字符集编写的;js区分大小写,而html不区分;直接量;标志符合保留字;分号可选,注意良好的编程习惯。
第二章 类型、值和变量
1.数字
Js不区分整数值和浮点数值,所有值都用浮点数值表示。
整型直接量有十六进制(ox或Ox前缀),八进制(0开始,可能不支持),还有十进制。
Infinity :无穷大
-Infinity :负无穷大
NaN != NaN(返回true)
0 === -0
Js采用一种二进制表示法,不能精确到类似0.1这样的数字,应避免小数,使用大整数,如10分而非0.1元
2.文本
字符串直接量
转义字符: \.....
字符串: js中字符串是固定不变的,使用方法后都返回新字符串,字符串本身不改变。
3.布尔值
任意字符串都可以转换为布尔值,如下列都转换为false
undefined
null
0
-0
NaN
“”
布尔值包含toString()方法
4.null和undefined
typeof(null) //返回object,可以认为null是一个特殊的对象值,即“非对象”。
typeof(undefined) //返回undefine,表明这个值是这个类型的唯一成员。
两者都不包含任何属性和方法。
5.全局对象
比如Math和JSON,全局对象的属性是全局定义的符号,js程序可以直接使用。
在代码最顶级,this可以直接引用全局对象 。
如果代码声明了一个全局变量,这个全局变量就是全局对象的一个属性。
6.包装对象
Js对象是属性或已命名值得集合,通过(.)引用属性值,属性值是函数时,称其为方法。
存取字符串、数字、布尔值的属性时创建的临时对象,它只是偶尔用来区分原始类型和对象,即它们三者并不是对象,但表现出有属性。
可通过String(),Number()或Boollen()显式创建包装对象:
var s = new String();
== 视原始值和包装对象相等, === 不等。
7.原始值(undefined、null、布尔值、数字和字符串)是不可改变的,修改字符串实际上返回了一个新的字符串,原字符串并不改变。原始值的比较是值的比较,只有它们的值相等时才相等。
对象是可变的,值可以修改,但对象的比较并不是值的比较,而是引用的比较,当且它们引用同一个基对象才相等。
8.类型转换
(1)== 符号会偏向把两边数据类型转换为数字进行比较。且其从不试图将其操作数转换为布尔值。
(2)显式类型转换:
Number() // 等价于 x+’’
parseInt() // 只解析整数,可接受第二个参数:parseInt(“11”,2) 结果为3(1*2+1)
parseFloat() // 可解析整数和浮点数。
Boolean() // 等价于 +x ,一元运算符
String() // 等价于 !!x ,一元“!”运算符对操作数转换为布尔值并取反。
Object()
方法(都是转换为字符串):
toString() // 转换为字符串,()中可以接受转换基数
toFixed() // 根据小数点后的指定位数将数字转换为字符串,不使用指数记数。
toExponential() // 参数指定小数点后面位数,且小数点前只有一位,可使用指数记数。
toPrecision() // 参数指定有效位数,有效数字小于数字整数部分数用指数形式。
(3)对象转换为原始值
toString()
valueOf() // 返回对象本身
9.变量声明
Js是动态语言类型,声明变量时不用指明类型。
10.变量作用域
在函数体内,局部变量的优先级高于同名的全局变量。声明局部变量时必须使用var语句,不然会生成全局变量。
Js中没有块级作用域,取而代之的是函数作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。即函数内的变量声明“提前”至函数体顶部,同时变量初始化留在原来的位置。
Js全局变量是全局变量的属性,用var声明的变量是不可配置的,无法用delete删除
未声明的变量可配置。
作用域链
第三章 表达式和运算符
1.原始表达式
如:1.123 “hello” /pattern/
2.对象和数组的初始化表达式
如:var x = [];
var y = {};
3.函数定义表达式
var squre = function(x){ return x*x;}
4.属性访问表达式
两种访问方式:
var o = {x:1,y:{z:3}};
o.x;
o[“x”]
5.调用表达式
是一种调用(或者执行)函数或方法的语法表示。
如:f(0)
Math.max(x,y,z)
a.sort()
6.对象创建表达式
创建一个对象并调用一个函数(构造函数)初始化新对象的属性
如:new object()
new point(2,3)
new object
7.运算符
(1)左值:表达式只能出现在赋值运算符的左侧。Js中变量,对象属性和数组元素都是左值,ECMAScript规范允许内置函数返回一个左值,但自定义的函数不能返回左值。
(2)“+”运算符:二元加法运算符,优先考虑为字符串,两侧都不是字符串时理解为数字。
对于不是原始值的操作数会先做类型转换。
对象到原始值的转换规则:日期对象通过toString()方法执行转换,其他对象则通过valueOF()方法执行转换(如果能返回一个原始值)。但大多数对象都不具备可用的valueOf()方法,则会通过toString()方法来转换。 (3)一元运算符
“+”,“-”:根据需要把操作数转换为数字
“++”:在操作数之前(前增量),对操作数进行增量计算,并返回计算后的值。
在操作数之后(后增量),对操作时进行增量计算,但返回未做增量计算的值。
如:var i = 1, j = ++i; // i和j的值都是2
var I = I, j = i++ // i=2,j=1
“--”:类似上述。
8.关系表达式
(1)相等和不等。
“=”:得到或赋值。
“==”:相等。 // !=
“===”:严格相等。 // !==
注意:NaN和其他任何值都不相等。
(2)比较运算符
操作数只有是数字和字符串才能真正执行比较操作,不是会进行类型转换。
相比“+”运算符,字符运算符更偏爱数字,只有两个操作数都是字符串时才会进行字符串的比较。
(3)in运算符
希望左操作数是一个字符串或者可以转换为字符串,右操作数是一个对象。如果右侧的对象拥有一个名为左操作数值的属性名,则返回true。
注意:var point = {x:1, y:2}
”toString” in point //true
toString in point // false
(4)instanceof运算符
希望左操作数是一个对象,右操作数标识对象的类。如果左侧对象是右侧类的实例,则返回true,否则false。Js对象的类是通过初始化它们的构造函数来定义的,则右操作数是一个函数。
如: var d = new Date();
d instrnceof Date; // true
d instrnceof Object; // true
d instrnceof Number; // false
原型链
9.逻辑表达式
假值:false null undefined 0 -0 NaN
则其他的值包括对象都是真值。
“&&:左操作数为真值时则返回右操作数的结果。
左操作数为假值时则返回左操作数的的结果,即不计算右操作数的值。
“||”:先计算左操作数的值,结果为真值则返回这个结果。否则返回右操作数结果。
“!”:一元运算符,将操作数的布尔值求反。 10.赋值表达式
“=”
Data[i++] *=2;
Data[i++] = Data[i++] * 2; // 结果不一样
11.eval()
解释运行由js源代码组成的字符串,并产生一个值。eval()是一个函数,但被当成运算符对待。
只传入一个参数,如果参数不是字符串则直接返回这个值。是字符串则会当成js代码进行编译,执行后将返回最后一个表达式或语句的值。eval()使用了调用它的变量作用域环境。如:
假如已定义一个局部变量x
eval(“x”) // 返回局部变量的值
全局eval()
通过别名调用时,eval()会将其字符串当成顶级的全局代码来执行,即可能会定义新的全局变量和全局函数,或给全局函数赋值。Ie9之前通过execscript()的全局函数来完成全局eval()的功能。
注:严格模式下eval不能在局部作用域定义新的变量或函数,可查询或更改。
11.其他运算符
“?:”
typeof : 一元运算符,返回值为表示操作数类型的一个字符串。
注:typeof(null)返回object 函数返回function,而不是object。Es3中对所有内置可执行对象,一律返回function,es5中扩充到所有可执行对象,包括内置对象和宿主对象。
Delete:一元操作符,删除对象属性或者数组元素,删除成功返回true,否则返回false。
delete希望操作数是一个左值,不是左值则不做任何操作返回true,一些内置核心和客户端属性不能删除,var语句声明的变量不能删除,通过function语句定义的函数和函数参数也不能删除。不能删除数组的长度,只能删除其属性。
Void:一元运算符,操作数会照常计算,但会忽略结算结果并返回undefined。
“,”:二元运算符,先计算左操作数,再计算右操作数。
第四章 语句
表达式计算出一个值,但语句用来执行使某件事发生。
1.语句块:多条语句连接在一起,花括号括起。Js中没有块级作用域,则语句块中声明的变量并不是语句块私有的。
空语句: ; 如: for(i=0;i
2.声明语句:var
function f() {} 函数声明语句可嵌套在其他函数体内,但此时只能出现在所嵌套函数的顶部。
3.条件语句
if else if