1、JavaScript的数据类型分为两类:原始类型、对象类型。原始类型包含:数字、字符串、布尔值
两个特殊的原始值:null(空)与undefined(未定义),不属于数字、字符与布尔值。
2、对象是属性的集合,每个属性都是一个名/值 对,值可以使原始类型,也可以是对象类型。
3、数组、函数都是JavaScript定义的特殊对象。预先定义的对象有:Date(日期)、RegExp(正则)、Error(错误)。
4、JavaScript内置内存管理机制,不用手动进行对象的销毁。
5、JavaScript数据类型分为可变类型和不可变类型。对象和数组属于可变类型,数字、布尔值、null和undefined属于不可变类型。字符串可以看成是由字符组成的数组,但是属于不可变类型。
6、JavaScript变量是无类型的,同一个变量可以赋予任何类型的值。
7、JavaScript中不是所有环境都支持8进制数,慎用,最好不用。
8、JavaScript中的算术运算有:加(+)、减(-)、乘(*)、除(/)、求余(%)。可以利用Math对象进行复杂运算。
9、被0整除在JavaScript中并不报错,只是简单返回无穷大(Infinity)或者负无穷大(-Infinity)。零除以零结果无意义,返回非数字(NaN)。
10、浮点数表示数字的近似值,不能直接比较相等。
11、字符串的长度是其所含16位值的个数。字符串的索引从0开始,空字符串长度为0。
12、JavaScript和HTML一起使用的时候,需要各自采用不同的引号风格。一般原则为javascrip使用单引号,HTML使用双引号,字符串内部引号必须用转义符号。
13、JavaScript中进行布尔值转换的时候,这些值会被转换成false:undefined、null、0、-0、NaN、“”(空字符串),其他所有值都会转换成true。
14、对null执行typeof运算,结果返回字符串“object”,函数没有返回任何值,则返回的是undefined,没有提供实参的函数形参的值也只会得到undefined。
null == undefined 的结果为true,null === undefined 的结果为false
undefined不能赋值给任何变量。
15、JavaScript的全局对象是解释器启动的时候创建的,并进行初始化。JavaScript可以直接使用,具有初始属性如下:
全局属性:undefined、Infinity、NaN
全局函数:isNaN()、parseInt()、eval()
构造函数:Date()、RegExp()、String()、Object()、Array()
全局对象:Math、JSON
对于客户端JavaScript来说,Windows对象定义了一些额外的全局属性。
不在任何函数内的代码,可以用this来引用全局对象。
16、存取字符串、数字、布尔值的属性时创建的临时对象称作包装对象。可以通过String()、Number()、Boolean()构造函数来显式创建包装对象。JavaScript在必要时可以将包装对象转换成原始值。包装对象与原始值之间用“==”运算符的结果为true,采用“===”运算符时,结果为null。
17、对象的比较并非值的比较,即使两个对象包含相同的属性及相同的值,也是不相等的。当两个对象引用同一个基对象时,它们才相等。将对象(数组)赋值给一个变量,仅仅是赋值的引用值,对象本身并没有复制一次。如果想得到一个对象的副本,必须显示赋值对象的每个属性或者数组的每个元素。
18、加法运算的强制类型转换规则:
如果两个操作值都是数值,其规则为:
(1)如果一个操作数为NaN,则结果为NaN
(2)如果是Infinity+Infinity,结果是Infinity
(3)如果是-Infinity+(-Infinity),结果是-Infinity
(4)如果是Infinity+(-Infinity),结果是NaN
(5)如果是+0+(+0),结果为+0
(6)如果是(-0)+(-0),结果为-0
(7)如果是(+0)+(-0),结果为+0
如果有一个操作值为字符串,则:
如果两个操作值都是字符串,则将它们拼接起来
如果只有一个操作值为字符串,则将另外操作值转换为字符串,然后拼接起来
如果一个操作数是对象、数值或者布尔值,则调用toString()方法取得字符串值,然后再应用前面的字符串规则。对于undefined和null,分别调用String()显式转换为字符串。
可以看出,加法运算中,如果有一个操作值为字符串类型,则将另一个操作值转换为字符串,最后连接起来。
19、如果未在var声明语句中给变量指定初始值,那么虽然声明了这个变量,但在给它存入一个值之前,它的初始值就是undefined。
20、JavaScript中给一个未声明的变量赋值,默认给全局对象创建一个同名属性,它工作起来像一个正确声明的全局变量,这是一个不好的习惯并会造成很多bug。
21、在函数内声明的变量为局部变量,仅在函数体内有定义。在函数体中,局部变量的优先级高于全局变量,遇到重名现象,则局部变量会覆盖全局变量。
JavaScript中变量没有块级作用域,取而代之的是函数作用域,意味着变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。产生了变量在函数体中“声明提前”的现象。
在ES6中,可以用let关键字声明的变量的作用域为块级。
22、采用var声明一个全局变量,是作为全局对象的一个不可配置属性,不能删除。不直接用var,直接给一个全局变量赋值,则此变量是作为全局对象的一个可配置属性,可以删除。例如:
var truevar = 1; //声明一个不可删除的全局变量
fakevar = 2; //创建全局对象的一个可删除属性
this.fakevar2 = 3; //同上
delete truevar //-》false:变量并没有被删除
delete fakevar //-》true:变量被删除
delete this.fakevar2 //-》true:变量被删除