读JavaScript权威指南(第六版)笔记(第三章)
第3章类型、值和变量
类型:表示并操作的值(比如数字3.14或文本“hello world”)的类型称做数据类型(type)
变量:就是保存值的容器,是一个值的符号名称。
JavaScript的数据类型分为两类:原始类型 和 对象类型。
原始类型:
1.Number 数字类型(数字包含整数,浮点数,八进值以0开始 十六进制以0x或0X开始)
2.String 字符类型 可以用单引号和双引号括起来
3.Boolean 逻辑类型 true false
4.null类型 对象不存在
5.undefined类型 变量未初始化
// 使用typeof运算符检测原始类型 typeof(2); // ==> "number" typeof(true); // ==>"boolean" typeof("a"); // ==>"string" typeof(null);// ==> "object" typeof(undefined); // ==> "undefined"
Number 数字类型:
1.JavaScript中的算术运算在溢出(超过JavaScript所能表示的数字上限),下溢(当运算结果无限接近0并比JavaScript能表示的最小值还小)或被0整除时不会报错。
2.二进制浮点数和四舍五入错误
JavaScript采用了IEEE-754浮点数表示法,二进制表示法,可以精确地表示分数1/2 1/8 和1/1024等。我常用的是十进制,二进制浮点数表示法不能精确表示类似0.1这样简单的数字。
String 字符类型:
1.字符串是一个组由16位组成的不可变的有序序列,有一个字符通常来自于Unicode字符集。
2.如果在字符串中用到一些特殊的字符,就需要转义。
// 注意 字符串中单引号和双引号可以相互嵌套 'ab"c"d'; // ==> "ab"c"d" "ab'c'd"; // ==> "ab'c'd" // 如果单引号的里的字符包活单引号,就需要转义 因为此时的单引号用标识是字符串的作用,不在单单表示单引号了,要表达是单引号就需要转义,其他的特殊字符也是一样的。在JavaScript中有其他的用处,要表示本意字符就需要转义。 'ab\'c'; // "ab'c"; // 常见的转义字符 \n 换行符 \v 垂直制表符 \f 换页符 \r 回车符 \" 双引号 \' 单引号 ...
逻辑类型:
1.false undefined null 0 -0 NaN "" // 空字符串 都是假值 其余都是真值。
对象类型:对象 数组 和 函数
全局对象:
在启动JavaScript解释器(打开一个新的页面),就会创建一个新的全局对象(global object),全局对象定义的属性和方法,JavaScript程序可以直接使用。
- 全局属性:undefined Infinity NaN
- 全局函数:isNaN() parseInt() eval()
- 构造函数:Date() RegExp() String() Object() Array()
- 全局对象:Math 和 JSON
在代码的最顶级---不在任何函数内的JavaScript代码---可以使用JavaScript关键字this来引用全局对象:
var global = this; // 定义一个引用全局对象的全局变量
包装对象:Number String Boolean类型的原始类型具有包装对象。
包装对象:是存取字符串、数字和布尔值的属性时创建的临时对象称做包装对象,它只是偶尔用来区分字符串值和字符串对象,数字和数字对象和布尔值和布尔对象。
// 这里用字符串举例,布尔值和数字同理的。 var s = "test"; var len = s.length; // 当引用字符串s的属性,JavaScript就会通过new String(s)的方式转换成对临时象。当引用结束临时对象就销毁了。因此字符串布尔值数字的属性都只是只读。 var S = new String(s); // 一个字符串对象 s == S // true; s === S // false; typeof(s); // string typeof(S); // object
不可变的原始值和可变的对象引用
原始值:是不可更改的。其中字符串调用方法,看上去返回一个修改后的字符串(此时生成的是一个新的字符串),原来的字符串是不变的。
原始值的比较:只要值等,就判为相等。其中字符串要索引相等并且一个字符也要相等,这个两个字符串才相等。
对象:是可变的。
对象比较的是引用:仅当它们引用同一个基对象时,它们才相等。
类型转换
值 | 字符串 | 数字 | 布尔值 | 对象 |
undefined | "undefined" | NaN | false | throws TypeError |
null | "null" | NaN | false | throws TypeError |
true | "true" | 1 | new Boolean(true) | |
false | "false" | 0 | new Boolean(false) | |
""(空字符) | 0 | false | new String("") | |
"1,2"(非空,数字) | 1.2 | true | new String("1.2") | |
"one"(非空,非数字) | NaN | true | new String("noe") | |
0 | "0" | flase | new Number(0) | |
-0 | "0" | false | new Number(-0) | |
NaN | "NaN" | false | new Number(NaN) | |
Infinity | "Infinity" | true | new Number(Infinity) | |
-Infinity | "-Infinity" | true | new Number(-Infinity) | |
1(非零) | “1” | true | new Number(1) | |
{}(任意对象) | true | |||
[](任意数组) | “” | 0 | true | |
[9](1个数字元素) | "9" | 9 | true | |
['a'](其他数组) | 使用join()方法 | NaN | true | |
function(){}(任意函数) | NaN | true |
原始类型转换成对象类型,一般都是通过调用String() Number(() Boolean()构造函数。null 和 undefined 例外。
转换和相等性
一个值转换成另外一个值,不以为这个两个值想等。例如在if(undefiend)中,undefined会转换成false布尔值,但不以为着undefined==false.
显示转换
number-to-string
1.number对象的toString()方法 toFixed() toExponential() toPrecision()
2.2 + "" (+字符串连接符)
3.string对象的new String()构造函数
string-to-number
1.number对象的new Number()构造函数
2.全局函数parseInt() parseFloat()
对象转换为原始值
object-to-string
步骤:1.先调用toString()方法转换2.toString()没有就调用valueOf()3.都没有就报错
object-to-number
步骤:1.先调用valueOf()方法转换2.valueOf()方法没有就调用toString()方法3.都没有就报错
变量声明 重复的声明和遗漏声明
通过var 来声明变量,如果没有给变量赋初始值,默认为unfined.
一个变量可以被重复声明,是合法和无害的。
如果遗漏了声明一个变量,ES5严格模式下会报错。其实上会在全局对象里创建一个同名属性。警惕不要这样做,会造成很多bug ,变量一定要先声明再使用。
函数作用域和声明提前
JavaScript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。有意思的是,在函数作用域中变量没有声明就可以使用了,
这是变量声明提前,即在JavaScript函数里声明的所有的变量都被“提前”至函数体的顶部了。(函数中的变量都应该是函数顶部声明,这样可以避免一些其想不到的错误)
作用域链
每一段JavaScript(全部代码或函数)都有一个与之关联的作用域链。这个作用域链是一个对象列表或者链表,这组对象定义了这段代码“作用域中”的变量。
当JavaScript需要查找变量x的值的时候(这个过程称为“变量解析”),就会从链中的第一个对象开始查找,如果第一个对象上有x属性,就直接赋值。
如果没有就找第二对象,以此类推,最后都没有找到就报ReferenceError的异常。