变量类型,函数类型(传参)
js的变量有按值和引用传递,而参数只能按值来传递;
function addTen(num){
num+=10;
return num;
}
var count =20;
var result=addTen(count);
console.log(count); //结果为20,当作参数传入函数,在函数内执行+操作,但是不会影响外围的count的值;
console.log(result); //结果为30,调用函数后函数抛出执行+10后的结果
function setName( obj){
obj.name="nihao" ;
var obj=new Object();
}
var person=new Object();
setName(person);
console.log(person.name); //结果为nihao
引用类型的传递,
function setName( obj){
obj.name="nihao" ;
var obj=new Object();
obj.name="hello" ;
obj.age="22" ;
}
var person=new Object();
setName(person);
console.log(person.name);
console.log(person.age);
这个函数说明如果函数传参如果是按引用传递的话那么person的值便会更新为hello,这说明即使在函数内修改了参数的值,但是原始的引用仍然保持未变,在obj重写后,此obj便成了局部变量。
类型检测-执行环境及作用域
console.log(person instanceof Function); //检测类型,instanceof 查询person是否是Function,返回的是布尔值,所有引用类型都是object
一般的话习惯用的是typeof
然后检测某个引用是否是数字类型的话可以用 isNaN
var color= "blue";
function changeColor(){
var anotherColor= "red";
function swapColor(){
var tempColor= anotherColor;
console.log("1:::::" +tempColor); //tempColor:red
anotherColor=color; //color:blue
console.log("2:::::" +anotherColor); //anotherColor:blue
color=tempColor; //color=tempcolor=red
console.log("3:::::" +color); // color: red
console.log("4:::::" +tempColor); //tempColor:red
console.log("5:::::" +anotherColor); //anotherColor:blue
}
swapColor();
}
changeColor();
凌乱~
注意:函数一般只能内向外访问,如果需要由外往内访问的话,需要内部抛出或延长作用域链
function builderUrl(){
var qs= "?debug=true";
with(location ){
var url= href+qs;
console.log(href); //结果为当前url地址
console.log(qs); //结果为当前url地址+qs的结果
console.log("111" +qs); //结果qs的结果
console.log("111" +location.href); //结果为当前url地址的结果
}
//with的作用是 ------当你有一个对象的多个属性或者方法需要操作时,就可以使用with,此处的with块相当于:-
/*
*/
return url;
}
console.log(builderUrl());
console.log(window .location.href); //结果为当前url地址
这里的with没怎么看懂,百度的结果是:文中有声明的时候自动调用,
----- with 语句可以用来引用某个特定的对象中已有的属性,但是不能用来给对象添加属性,要给对象添加属性,还要明确的引用该对象。
建议一般不要用with
function add( na1,na2 ){
sum =na1+ na2;
console.log(sum);
}
console.log(add(1 ,2));
由于add函数没有抛出sum所有外围的加法是没法从add函数传出的,只在函数内部执行
注意:此处的sum为全局变量
如果sum为局部变量的话那么即使在add中抛出sum在外围也是无法调用的。
var sum;
function add( na1,na2 ){
sum =na1+ na2;
console.log(sum); //3
return sum;
}
console.log(add(1 ,2));//3
console.log(sum); //3
外围声明全局后,也可以存储sum的值,所以最后输出的值为3.
var color= "blue";
function getColor(){
return color;
}
console.log(getColor()); //blue ---标识符搜索
垃圾回收机制,只需要稍微了解下。
引用类型
对象定义的几种方法:
var person=new Object();
person.name="111";
person.age=22;
或
var person={
name:"111",
age:22
}
或
var person={};
person.name="111";
person.age=22;
对象也可以用数值属性,但是数值属性会自动转化为字符串类型。
function displayInfo( args){
var output ="";
if( typeof args.name== "string"){
output+="Name:" +args.name+ "\n";
}
if( typeof args.age== "number"){
output+="Age:" +args.age+ "\n";
}
console.log(output);
}
displayInfo({
name :"jl",
age: 22
});
displayInfo({
name: "11",
age :11
});
//Name:jl
//Age:22
//Name:11
//Age:11
//相当于封装函数了吧?
Array类型
var color=new Array(3);
var name=new Array("hello"); //创建一个包含字符串hello的数组
检测数组除了之前的instanceof
外在es5后新增了Array.isArray()方法 //isArray支持ie9+
数组也提供了类似于栈的操作,
var a=new Array();
var b=a.push("red","blue");
//向后添加两个参数到a数组,b输出数组长度2,a输出["red","blue"]
var c = a.pop();
//输出的c为blue(取出了最后一个,且返回) ,a的值为["red"]
//栈方法的(栈数据结构)的访问规则是后进先出,而队列方法的数据结构访问规则是先进先出