JS学习笔记(三)
类型系统
- Undefined,Null,Boolean,Number,String等物种类型是原始类型。 这些类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们通过按值来访问的。
- Object类型为引用类型。引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象。是按引用访问的。 如上图所示:栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间。
Undefined类型 (undefined)
- 已声明未赋值的变量
var a; //a的类型是undefined
- 获取对象不存在的属性
var Obj = {a:1}; Obj.b; //类型为Undefined
- 无返回值的函数的执行结果
function a() { alert(1); } var b = a(); //b的类型为undefined
- 函数的参数没有传入
function a(i,j) { console.log(i); console.log(j); }; a(1); //类型为undefined
类型转换:
Null类型 (null)
- 表示对象不存在
document.getElementById("a"); //若id = a不存在,则类型为null
类型转换:
Boolean类型 (true、false)
- 条件语句导致的隐式类型转换
if(...){...} else {...}
- 变量定义
true; var a = false;
类型转换:
String类型
类型转换:
Number类型
类型转换:
Obiect类型
- Object是一组属性的集合(var obj = {name:’jerry’,age:10};)
类型转换:
类型识别
1、typeof
- 可以识别标准类型,除了NaN
- 不能识别具体的内置对象,除了function
2、Object.prototype.toString
- 可以识别标注类型和内置对象类型
- 不能识别自定义类型,如function
3、constructor (构造器中的方法)
- 可以识别标准类型,Undefined、Null除外
- 可以识别内置对象类型
- 可以识别自定义对象类型
4、Instanceof
- 可以识别内置对象类型
- 不能识别原始类型
- 可以识别自定义对象类型
变量作用域 (生命周期、作用范围)
解析方式:
静态作用域:由程序定义位置决定,不考虑执行顺序
动态作用域:程序运行时刻决定 - JS使用静态作用域,且没有块级作用域 - 一段代码执行前,先初始化词法环境
运算符和表达式
1、算数运算符:+ - * / %
2、关系运算符:> < ==(对象或值) != >= <= ===(类型及值) !==
3、逻辑运算:&& || !
4、位运算符:&(按位与)|(按位或) ^(异或) ~(按位取非) <<(左移一位) >>(右移一位)
5、赋值运算 =
6、条件运算 ? :
7、逗号运算 ,
8、对象运算符:new delete .和[] (取对象属性) instanceof(判别自定义对象类型)
注:
null == undefined
null/undefined进行 == 运算时不进行隐式类型转换
逻辑运算中,!x 表示取boolean值后取反,!!x取x的boolean值
优先级:算数运算符 > 逻辑运算符 > 条件运算符
语句
1、循环语句
- for/in 循环控制,用于遍历(遍历对象属性)
- continue 退出此循环并进入下一个循环
- break 退出整个循环
2、异常处理语句
try/catch/finally throw
3、with语句
- 用于缩短特定情况下必须写的代码量
- 暂时改变变量的作用域链,将with语句中的对象添加到作用域链的头部