ECMAScript篇:
defer属性和async属性只适用于外部脚本文件
ECMAScript中的一切(变量、函数名、和操作符)都区分大小写。
标识符:就是指变量、函数、属性的名字或者函数的参数。按照惯例ECMAScript标识符采用驼峰大小写格式,也就是第一个字母小写,剩余的每个单词的首字母大写。
要在整个脚本中启用严格模式,可以在顶部添加如下代码:
"use strict"(这行代码看起来像是字符串,而且也没有赋值给任何变量,但其实它是一个编译指示,用于告诉支持的JavaScript引擎切换到严格模式)
ECMAScript中的5种简单数据类型:Undefined、Null、Boolean、Number和String.
复杂数据类型:Object(本质名值对)
null表示一个空对象指针(如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null而不是其他值)
浮点数值的最高精度是17位小数,但在进行算术计算时其精度远远不如整数
var a = 0.1;
var b = 0.2;
if (a + b == 0.3) { //不要做这样的测试!
alert("You got 0.3.");
}
但以下代码ok
var a = 0.05;
var b = 0.25;
if (a + b == 0.3) {
alert("You got 0.3.");
}
NaN与任何值都不相等,包括NaN本身。
alert(NaN == NaN); //false
用parseInt()转换空字符串会返回NaN
字符串要理解的点:
ECMAScript中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,**首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量**。
一元操作符中要注意的(前置和后置)
执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。
var age = 29;
var anotherAge = --age + 2;
alert(age); // 输出28
alert(anotherAge); //输出30
后置递增和递减与前置递增和递减有一个非常重要的区别,即递增和递减操作是在包含它们的语句被求值之后才执行的。
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; //等于22
var num4 = num1 + num2; //等于21
在随后的学习中,学习js数据结构列表时,看到一个后置的一元操作符,瞬间觉得这种前置和后置设计的伟大之处。
/* 给列表添加元素 */
function append(element){
this.dataStore[this.listSize++]=element;
}
我对这个函数的理解:给当前数组位置存一个新值,然后数组的长度加一,既赋值了当前项,又为下一项的保存预先留个空位。(仅个人理解,如有问题,感谢指出)
同时使用两个逻辑非操作符,实际上就会模拟Boolean()转型函数的行为。
逻辑或操作符是短路操作符,如果第一个操作数的求值结果为true,就不会对第二个操作数求值。
这种可以用于给某变量赋值:(妙用如下)
var myObject = preferredObject || backupObject;
我的理解:为了让某个变量赋值的保险起见,一般逻辑或前面的基本都会存在,如果不存在,为其赋值后面一个,加个保险。(仅个人理解,如有问题,感谢指出)
相等操作符:
注意“==”和“===”
记住:null == undefined会返回true,因为它们是类似的值;但null === undefined会返回false,因为它们是不同类型的值。
break和continue语句
break语句会立即退出循环,强制继续执行循环后面的语句。而continue语句虽然也是立即退出循环,但退出循环后会从循环的顶部继续执行。
switch语句在比较值时使用的是全等操作符,因此不会发生类型转换。
ECMAScript中所有函数的参数都是按值传递的。
使用var声明的变量会自动被添加到最接近的环境中。
优化内存占用的最佳方式,就是为执行中的代码只保存必要的数据。一旦数据不再有用,最好通过将其值设置为null来释放其引用—这个做法叫做解除引用。(解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收)
基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中;
引用类型的值是对象,保存在堆内存中;
确定一个值是哪种基本类型可以使用typeof操作符,而确定一个值是哪种引用类型可以使用instanceof操作符
instanceof操作符的问题在于,它假定只有一个全局执行环境。
如果网页中包含多个框架,那实际上就存在两个以上不同的执行环境,从而存在两个以上不同版本的Array构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。
为了解决这个问题,ECMAScript5新增了Array.isArray()方法。这个方法的目的是最终确定某个值到底是不是数组,而不管它是哪个全局执行环境中创建的。这个方法的用法如下:
if (Array.isArray()) {
//对数组执行某些操作
}
函数名仅仅是指向函数的指针。
解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。
BOM篇(HTML5规范)
top对象始终指向最高(最外)层的框架,也就是浏览器窗口。
判断页面是否处于标准模式
document.compatMode == "CSS1Compat"
尝试访问未声明的变量会抛出错误,但是通过查询window对象,可以知道某个可能未声明的变量是否存在。
JavaScript是一个单线程的解释器,因此一定时间内只能执行一段代码。为了控制要执行的代码,就有一个JavaScript任务队列。这些任务会按照将它们添加到队列的顺序执行。setTimeout()的第二个参数告诉JavaScript再过多长时间把当前任务添加到队列中。如果队列是空的,那么添加的代码会立即执行;如果队列不是空的,那么它就要等前面的代码执行完了以后再执行。
在开发环境下,很少使用真正的间歇调用,原因是后一个间歇调用可能会在前一个间歇调用结束之前启动。所以,最好不要使用间歇调用。