1.数据类型——
原始类型(不可变类型):
数字(10和16进制)
字符串
布尔值
特殊原始值:
undefined:代表变量未初始化,对象属性和数组元素不存在,函数无返回值对象(系统级的错误的值空缺),
null:代表变量是空值,特殊的对象(程序级的正常的值空缺)
if(undefined==null) → true
if(undefined===null) → false
if(undefined || null) → false
对象:(可变类型)
(1)普通对象:构造函数的实例
Math,
JSON,
location,
localStorage
(2)构造函数:
对象类(Object)
函数类(Function)
数组类(Array)
日期类(Date)
正则类(RegExp)
错误类(Error)
所有对象都是Object类型,所有函数和构造函数都是Function类型
2.变量——
垃圾回收机制,不分类型
函数作用域:只要在函数内任意位置出现过声明(所以函数变量声明最好统一到开头)
因为变量声明和子函数会被提到函数最开头执行
全局作用域:未曾出现过声明则会一层层引用上一个函数作用域的变量,一直到全局变量
3.全局对象:
Window构造函数的实例,通过window,this获取。
全局变量 == 全局对象的属性
4.包装对象:
String,Number,Boolean
当原始值引用属性和方法时,系统创建对应包装类临时对象去处理,如
"abc".indexOf("a"),"abc".length
if("abc" == new String("abc")) → true
if("abc" === new String("abc")) → false
4.构造函数:
function fun () {
this.a = "1";
this.b = function() {};
}
//静态变量和静态函数,其实就是给变量fun赋属性
fun.c = "2";
fun.d = function() {};
5.函数:
(1)定义方式
new Function(参数,参数,方法体字符串) —— 所有的函数都是Function的实例
function a() {} —— 默认在顶部创建变量a,赋予此函数。手动创建变量a会覆盖,使原方法不能用。
var a = function() {} —— 函数表达式,右边是匿名函数,先定义后使用
var a = function aa(){} -- aa将作为函数的局部变量,递归时aa和a都可用
var c = a; —— 将变量a赋给变量c,调用c()同样可以执行
(2)调用方式
function fun(value) {
this.bb = value;
}
var a = {},c={};
a.fun = fun;
fun(1); //函数调用:this是window;
a.fun(1); //方法调用:this是a;
var b = new fun(1); //构造函数调用:this是b
fun.apply(c,[1]); //间接调用:this是c
fun.call(c,1);
6.创建对象:
new构造函数,
普通对象 {} = new Object(),
数组对象 [1,,3,] = new Array()
设置对象属性和方法:
在构造器中:this.a = "1";
this.b = function() {};
在对象中:object.a/object["a"]="1";
object.b = function() {};
获取对象属性和方法
object.a/object["a"]; object.b()
7.常用运算符
typeof:返回类型字符串,对于对象都返回Object
instanceof:判断类型,返回布尔值
eval():参数不是字符串则返回参数,否则执行字符串,返回执行结果
可以eval("({a:1,b:2})")将json字符串转成json对象
delete:删除属性
in:检测属性是否存在(包括继承的属性)
for/in:遍历对象可枚举的属性或数组的成员;会遍历自身的属性,方法,以及继承的属性
JSON.stringify():将对象可枚举的自身属性转为字符串
8.存取器属性
var a = {
aa:1,
get cc() {
return this.aa;
},
set cc(value) {
this.aa = value;
}
};
a.cc = 4;
alert(a.cc);//返回4
8.属性的特性
数据属性的特性:value(值),writable(可写性),enumerable(可枚举性),configurable(可配置性)
存取器属性的特性:get(读),set(写),enumerable(可枚举性),configurable(可配置性)
相关方法:
hasOwnProperty():检测自身属性是否存在
propertyIsEnumerable():检测自身是否属性且可枚举的
Object.keys(对象):返回对象的可枚举的自身属性名称的数组
Object.getOwnPropertyNames(对象):返回对象所有的自身属性名称的数组
Object.defineProperty(b,"aa",{value:2,
writable:true,
enumerable:false,
configurable:true}) :设置对象属性特性
Object.definePropertys({},{
x:{value:2}
y:{get:function(){return 1;},set:undefined}
})
Object.getOwnPropertyDescriptor(b,"aa"):返回对象自身属性的特性的描述
不可配置详解:
(1)不能编辑可配置性和可枚举性,可写性只能由true设为false
(2)数据属性和存取器属性不能相互转换,存取器属性不能更改setter和getter方法
(3)属性不能删除
6.对象的原型属性
每个对象都从原型对象继承属性,根原型对象就是Object.prototype
指定原型:
Object.create(原型)
为构造函数指定原型属性prototype
获取原型:
Object.getPrototypeOf(对象);
检查原型:
原型.isPrototypeOf(对象)
7.对象的类属性
Object.prototype.toString.call(对象):获取类属性
8.对象的可拓展性:是否可以添加新属性
判断是否可拓展:Object.esExtensible(对象)——(删改查)
设置为不可拓展:Object.preventExtensions(对象),设置后不可逆转,仍会继承给原型的新属性
判断是否封闭:Object.isSealed(对象)——(改查)
设置为封闭:Object.seal(对象),属性不可拓展,不可配置。不能解封
判断是否冻结:Ojbect.isFrozen(对象)——(查)
设置为冻结:Object.freeze(对象),属性不可拓展不可配置,数据属性为只读
7.数组
创建数组:[1,2],new Array(),new Array(1),new Array(1,2)
添加元素:push(),unshift()
删除元素:pop(),shift()
数组的方法:
join() 以参数作为分隔符,将数组转为字符串
reverse() 将数组中的元素颠倒顺序
concat([1,2]) 连接2个数组,返回一个新数组
slice(0,3) 返回一个子数组
splice(a,b,c,d) a:操作的位置,b:删除的个数,c,d:插入的元素 返回被删掉的元素组成的数组
indexOf() 具有给定值的元素的索引
lastIndexOf() 具有给定值的最后一个元素的索引
7.闭包:
(1)变量作用域由函数定义时决定,所以函数对象内部状态还包括作用域链
(2)作用域链是定义作用域中变量的对象列表,函数内部的变量都可以保存在作用域链中。
(3)例子--当外部函数返回嵌套函数对象,并在外面执行嵌套函数