1、计算机程序的运行需要对值(value)进行操作。在编程语言中,能够表示并操作的值得类型称做数据类型(type)。当程序需要将值保存起来以备将来使用时,便将其赋值给一个变量(variable)。变量是一个值得符号名称,可以通过名称来获得对值得引用。
2、从技术上讲,只有JavaScript对象才能拥有方法;然后数字、字符串和布尔值也可以拥有自己的方法。在JavaScript中,只有null和undefined是无法拥有方法的值。
3、由于某些JavaScript的实现支持八进制直接量、而有些不支持,因此最好不要使用以0为前缀的整形直接量。在ECMAScript 6的严格模式下,八进制直接量是明令禁止的。
4、浮点型直接量语法表示:[digits].[digits][(E|e) [(+|-)] digits ]
5、JavaScript预定义了全局变量Infinity和NaN,用来表示正无穷大和非数字值。在ECMAScript3中,这两个值是可读/写的,并可修改。在ECMAScript5修正了这个错误,将它们定义为只读的。在ECMAScript3中Number对象定义的属性值也是只读的。一些例子:
Infinity //将一个可读/写的变量初始化为infinity
Number.POSITIVE_INFINITY //同样的值,只读
1/0 //这也是同样的值
Number.MAX_VALUE + 1 //计算结果还是Infinity
Number.NEGATIVE_INFINITY //该表达式表示了负无穷大
-Infinity
-1/0
-Number.MAX_VALUE – 1
NaN //将一个可读/写的变量初始化为NaN
Number.NaN //同样的值,但是只读
0/0 //计算结果是NaN
Number.MIN_VALUE / 2 //发生下溢:计算结果为0
-Number.MIN_VALUE / 2 //负零
-1/Infinity //同样是负零
-0
Var zero = 0; var negz = -0; zero === negz //true (正零和负零恒等)
6、JavaScript中的非数字值(NaN)有一点特殊:它和任何值都不相等,包括自身。因此可以使用x!=x来判断,当且仅当x为NaN的时候,该表达式的结果才为true,函数isNaN()的作用与此类似。
7、字符串是一组由16位值组成的比可变的有序序列,每个字符通常来自于Unicode字符集。JavaScript通过字符串类型来表示文本。字符串的长度是其所含16位值的个数。JavaScript定义的各式字符串操作方法均作用于16位值,而非字符,且不会对代理项对做单独处理,同样JavaScript不会对字符串做标准化的加工,甚至不能保证字符串是合法的UTF-16格式。
8、在ECMAScript 3中,字符串直接量必须写在一行中,而在ECMAScript 5中,字符串直接量可以拆分成数行,每行必须以反斜线(\)结束,反斜线和行结束符都不算是字符串直接量的内容。如果希望在字符串直接量中另起一行,可以使用转义字符\n。
9、“基本多语种平面”(BasicMultilingual Plane, BMP),也称“零断面”(Plan 0),是Unicode中的一个编码区段。编码介于U+0000~U+FFFF之间。
10、false、和6个可以转换成false的值(undefined、null、0、-0、NaN和空字符串””)称做“假值”,其他值称做“真值”。
11、null是JavaScript语言的关键字,它表示一个特殊值,常用来描述“空值”。对null执行typeof预算,结果返回字符串”object”,也就是说,可以将null认为是一个特殊的对象值,含义是”非对象”。但实际上,通常认为null是它自有类型的唯一一个成员,它可以表示数字、字符串和对象是“无值”的。、
12、JavaScript还有第二个值来表示值得空缺。用未定义的值表示更深层次的“空值”。它是变量的一种取值,表明变量没有初始化,如果要查询对象属性或数组元素的值时返回undefinde则说明这个属性或元素不存在。如果函数没有返回任何值,则返回undefinded。引用没有提供实参的函数形参的值也只会得到undefined。Undefined是预定义的全局变量(它和null不一样,它不是关键字),它的值就是“未定义”。在ECMAScript 3中,undefined是可读/写的变量,可以给它赋任意值。这个错误在ECMAScript 5中做了修正,undefined在该版本中是只读的。如果使用typeof运算符得到undefined的类型,则返回”undefined”,表明这个值是这个类型的唯一成员。null和undefined都不包含任何属性和方法。实际上,使用”.”和”[]”来存取这两个值得成员或方法都会产生一个类型错误。可以认为undefined是表示系统级的、出乎意料的或类似错误的值得空缺、而null是表示程序级的、正常的或在意料之中的值得空缺。如果你想将它们赋值给变量或者属性,或将它们作为参数传入函数,最佳选择是使用null。
13、全局对象的属性是全局定义的符号,JavaScript程序可以直接使用。当JavaScript解释器启动时(或者任何Web浏览器加载新页面的时候),它将创建一个新的全局对象,并给它一组定义的初始属性:全局属性(如undefined、Infinity和NaN)、全局函数(如isNaN()、parseInt())、构造函数(如Date()、RegExp()、String()、Objet()和Array())、全局对象(如Math和JSON)。
14、字符串既然不是对象,为什么它会有属性呢?只要引用了字符串s的属性,JavaScript就会将字符串值通过调用new String(s)的方式转换成对象,这个对象继承了字符串的方法,并被用来处理属性的引用。
15、JavaScript类型转换(空单元格表示不必要也没有执行转换)
值 | 转换为: 字符串 |
数字 |
布尔值 |
对象 |
undefined null | “undefined” “null” | NaN 0 | false false | throws TypeError throws TypeError |
true false | “true” “false” | 1 0 |
| new Boolean(true) new Boolean(false) |
“”(空字符串) “1.2”(非空,数字) “one”(非空,非数字) |
| 0 1.2 NaN | false true true | new String(“”) new String(“1.2”) new String(“one”) |
0 -0 NaN Infinity -Infinity 1(非无穷大,非零) | “0” “0” “NaN” “Infinity” “-Infinity” “1” |
| false false false true true true | new Number(0) new Number(-0) new Number(NaN) new Number(Infinity) new Number(-Infinity) new Number(1) |
{}(任意对象) [](任意数组) [9](1个数字元素) [‘a’](其他数组) Function(){}(任意函数) | 参考3.8.3 “” “9” 使用join()方法 参考3.8.3 | 参考3.8.3 0 9 NaN NaN | true true true true true |
|
16、除了null和undefined之外的任何值都具有toString()方法。如果试图把null或undefined转换为对象,则会抛出类型错误。Object()函数在这种情况下不会抛出异常:它仅简单地返回一个新创建的空对象。
17、x + “” //等价于String(x)
+x //等价于Number(x)。也可以写成x-0
!!x //等价于Boolean(x)。注意是双叹号
18、对象转换为原始值:
19、对象到数字的转换过程,和对象到字符串类似,只是它会首先尝试使用valueOf()方法:
- l 如果对象具有valueOf()方法,后者返回一个原始值,则JavaScript将这个原始值转换为数字并返回这个数字。
- l 否则,如果对象具有toString()方法,后者返回一个原始值,则JavaScript将其转换并返回。
- l 否则,JavaScript抛出一个类型错误异常。
20、”+”、”==”、”!=”和关系运算符在处理对象时,首先执行对象到原始值的转换;日期类是JavaScript语言核心中唯一的预先定义类型。对于所有非日期的对象来说,对象到原始值的转换行是对象到数字的转换(首先调用valueOf()),日期对象则使用对象到字符串的转换模式,在运算符中的操作数对象通过valueOf()或toString()转换为原始值后直接被使用,不会被强制转换为数字或字符串。
21、JavaScript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。这意味着变量在生命观之前甚至已经可用。JavaScript的这个特性被非正式地称为声明提前(hoisting),即JavaScript函数里声明的所有变量(但不涉及赋值)都被“提前”至函数体的顶部(注:“声明提前”这步操作是在JavaScript引擎的“预编译”时进行的,是在代码开始运行之前。)。
22、JavaScript全局变量是全局对象的属性,这是在ECMAScript规范中强制规定的。对于局部变量则没有如此规定,但我们可以想象得到,局部变量当做跟函数调用相关的某个对象的属性。ECMAScript 3规范称该对象为“调用对象”(call object),ECMAScript 5规范称为“声明上下文对象”(declarative environment record)。
23、作用域链