JS中有两大数据类型简单数据类型string number undefined null boolean简单数据类型主要是在栈空间开辟空间的,直接开辟空间存储数据复杂数据类型对象 Array Function Math Date RegExp复杂数据类型是在堆空间开辟空间,存储真正的数据还会在栈空间开辟空间,存储数据在堆空间的内存地址,存储一个堆中的引用//=============================变量数据类型的传递=================================//如果实参是一个简单的数据类型,在进行数据传递的时候,是将当前的值复制一份进行传递function getSum(n1,n2){n1=100;n2=200; //当n1 n2 重新赋值的时候 它直接会覆盖掉实参传给形参的值 直接返回300return n1+n2}var n1=20;var n2=30;var sum =getSum(n1,n2)//实参 这时n1 和n2 直接复制一份给 getSum中的形参给到n1 和n2console.log(sum) //300console.log(n1,n2) //还是20 30


//============复杂数据类型的传递(或者引用数据类型的传递)(传递数组)===================//复杂数据类型是将栈空间的内存地址复制一份传递给函数的形参//新参通过这个内存地址也可以找到堆空间中的真正数据,可以进行正常的修改function fn(arr){arr[2]=200;var sum=0for(var i=0;i<arr.length;i++){sum+=arr[i]}return sum}var nums=[20,30,40,50]var sum =fn(arr);console.log(sum);//=================复杂数据类型的传递(或者引用数据类型的传递)(传递对象)=================//创建对象的方式,有两种//new +构造函数//对面字面量的//在传递复杂数据类型的时候,是将复杂类型的栈空间的内存地址复制一份进行传递// 当接收方接受获得这个地址后,会按着这个地址找到堆空间的真正数据function Stu(name,age,sex){this.name =name;this.age =age;this.sex=sex;}var zs =new Stu("张三",15,"男")-------------------------------------------------------------------------function fn(obj){obj.name='李四'//因为操作的是同一空间中的数据console.log(obj.name) //李四}fn(zs)console.log(zs.name);//李四-------------------------再变--------------------------------------------------function fn(obj){obj=new Stu('田七',18,'女')console.log(obj.name) //田七}fn(zs)console.log(zs.name);//张三


instanceof 用于判断当前对象是不是某一个类型的实例其中Object 是对象的顶级instance是实例的意思,就是判断某个实例对象,是不是属于某个构造函数function Stu(name,age,sex){this.name =name;this.age =age;this.sex=sex;}var zs =new Stu("张三",15,"男")console.log(zs instanceof Stu)// trueconsole.log(zs instanceof Object); //truevar obj ={} // 写的是对象字面量的方式,相当于是使用了 new Object() 来创建一个空对象console.log(zs instanceof Object) //trueconsole.log(zs instanceof obj) //false// 数组中的验证var arr =new Array(10,20,30);var arr1 =[40,50,60];consol.log(arr instanceof Array) //trueconsole.log(arr1 instanceof Array) //truevar box=document.getElementByClassName("div");//伪数组console.log(box instanceof Array);//false box是一个伪数组,就是不是使用new Array创建出来的// 伪数组也是数组,也有length属性,也可以存储数据,但是不能使用数组的方法 例如push() shift()
构造函数如果要批量创建对象的话,优先使用new +构造函数构造函数就相当于一类事物的模板,比如老师类、学生类这个模板相当于盖大楼的图纸,有了图纸才能够很好的施工凡是同一类事物,写在构造函数当中,肯定是有同样的属性和方法function Stu(name,age,sex){ //构造函数中的this指代当前的对象,创建那个对象就指向那个对象this.name =name;this.age =age;this.sex=sex;this.sayHi=function(){console.log('大家好,我是'+this.name+',今年'+this.age+'岁,是一名'+this.sex+'生')}}//new 做了一四件事//1.创建了一个新对象//2.return 一个this的返回值//3.将this指向这个空对象//4.执行构造函数里面的代码
prototype是构造函数的一个属性,同时它也是一个对象任何一个构造函数里面都有一个属性prototype任何一个实例对象都有一个属性__proto__Function 所有函数都是由Function 创建出来的构造函数中prototype可以让我们写构造函数的时候,节约大量的内存因为我们把公共的方法写在prototype上凡是在构造函数的prototype属性上定义的方法都可以被所有实例所调用function Stu(name,age,sex){ //构造函数中的this指代当前的对象,创建那个对象就指向那个对象this.name =name;this.age =age;this.sex=sex;}Stu.prototype.sayHi=function(){console.log('大家好,我是'+this.name+',今年'+this.age+'岁,是一名'+this.sex+'生')}Stu.prototype.showInfo =function(){console.log(this.name)}var zs =new Stu("张三",12,"男")zs.sayHi();zs.showInfo();//所有的构造函数都有prototype原型对象//原型对象可以用来扩展方法,给创建出来的实例对象使用//在prototype 上面定义或者扩展的方法,能够被所有的实例对象来调用//原型对象prototype不但可以定义方法还可以添加属性Stu.prototype.address='上海市'//原型对象上的方法和属性被所有的实例对象所共用//如果实例对象上有自己的属性的话,会优先使用自身的属性,如果自身没有这个属性再去原型对象上找//如果原型对象上也没有,则是undefined//一般是用法尽量不要在原型对象上定义属性,把属性定义在自己的构造函数里面//要在原型对象上定义公共方法或者函数
构造函数的特殊情况
function Stu(name,age){this.name=name;this.age =age;//return 123;// return [1,2,3]return new Date();}var tom =new Stu('tom',17);console.log(tom);//返回一个实例对象,当存在return 的时候 且是普通的数据类型的时候 还是返回一个实例对象//当构造函数return 一个数组的时候 直接取代实例对象,返回数组 同样new Date() 也是一样的console.log(tom.name);
