Function函数
* 如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined
* 如果return语句后不跟任何值就相当于返回一个undefined
* 如果函数中不写return,则也会返回undefined
--函数的声明提前
* 使用函数声明形式创建的函数 function 函数(){} * 它会在所有的代码执行之前就被创建,所以我们可以在函数声明前来调用函数
function fun(){ console.log("我是一个fun函数"); }
* 使用函数表达式创建的函数,不会被声明提前,所以不能在声明前调用
var fun2 = function(){ console.log("我是fun2函数"); };
构造函数和new关键字
* 构造函数和普通函数的区别就是调用方式的不同
* 普通函数是直接调用,而构造函数需要使用new关键字来调用
构造函数的执行流程:
* 1.新建一个空对象
* 2.将空对象的原型指向构造函数的prototype
* 3.将this指向新建的对象
* 4.逐行执行函数中的代码
* 5.将新建的对象作为返回值返回 (以new调用 将无视内部自己手动指定的return值)
使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类。
我们将通过一个构造函数创建的对象,称为是该类的实例
this的指向
* 解析器在调用函数每次都会向函数内部传递进一个隐含的参数,
* 这个隐含的参数就是this,this指向的是一个对象,
* 这个对象我们称为函数执行的 上下文对象,
根据函数的调用方式的不同,this会指向不同的对象
* 1.以函数的形式调用时,this永远都是window
* 2.以方法的形式调用时,this就是调用方法的那个对象
* 3.当以构造函数的形式调用时,this就是新创建的那个对象
* 4.使用call和apply , this就是传入的对象
call和apply
函数对象的方法 用于改变函数执行上下文this指向的对象
fun.call( obj , 2 , 3) fun.apply(obj , [ 2 ,3 ] )
arguments 类数组
* 调用函数时,每次都会传递进两个隐含的参数: 1.函数的上下文对象 this 2.封装实参的对象 arguments
* 在调用函数时,我们所传递的实参都会在arguments中保存 即使不定义形参,也可以通过arguments来使用
* arguments.length可以用来获取实参的长度
* arguments.callee,这个属性对应一个函数对象,就是当前正在执行的函数
instanceof
使用instanceof可以检查一个对象是否是一个类的实例 ,
* 语法: 对象A instanceof 构造函数B
* 如果B函数的显示原型对象在A对象的隐式原型链上,则返回true,否则返回false
console.log(per instanceof Person);
* 所有的对象都是Object的后代,所以任何对象和Object做instanceof检查时都会返回true
console.log(dog instanceof Object);
对象属性读取
* 如果要使用特殊的属性名,不能采用.的方式来操作 需要使用另一种方式: 语法:对象["属性名"] = 属性值 读取时也需要采用这种方式
使用[]这种形式去操作属性,更加的灵活,在[]中可以直接传递一个变量,这样变量值是多少就会读取那个属性
obj["123"] = 789 obj[ n ] obj[ method ]()
* 如果读取对象中没有的属性,不会报错而是会返回undefined
in 运算符
* - 通过该运算符可以检查一个对象中是否含有指定的属性 如果有则返回true,没有则返回false
- 语法: "属性名" in 对象 console.log( " test2 " in obj);
如果原型对象中存在 该属性也会返回true , 判断当前对象自身是否有这个属性使用hasOwnProperty
obj.hasOwnProperty( ' name' )
对象的引用
JS中的变量都是保存到栈内存中的,基本数据类型的值直接在栈内存中存储,值与值之间是独立存在,修改一个变量不会影响其他的变量
对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间,
而变量保存的是对象的内存地址(对象的引用),如果两个变量保存的是同一个对象引用,
当一个通过一个变量修改属性时,另一个也会受到影响
比较两个引用数据类型时,它是比较的对象的内存地址
for in 枚举对象属性
var obj = {name:"zs",age:18,sex:"boy"};
for(var n in obj){
console.log(n+"-"+obj[n]); 属性是一个变量的话 必须使用[]
}
删除对象的属性
语法:delete 对象.属性名
delete obj.name;
网友评论