您的位置:首页 > Web前端 > JavaScript

Javascript -- 函数及基本数据类型

2012-09-05 18:43 363 查看
1: 函数,解释不会检查参数的个数,只需用argument[0],argument[1]...来引用就行。

function first(){
alert("hello" + argument[0] + argument[1]);
}
first("world","me");

因为上面的原因,所以Javascript就没有重载现象。

2:只支持值传递

基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置

引用类型值指的是那些保存在堆内存中的对象,意思是变量中保存的实际上只是一个指针,指向内存中的另一位置。

所以说我们在栈中既保存基本类型值,他们占据固定大小的空间,可以顺序访问;同时可以保存一块内存的地址,一个指向堆内存中位置的指针,而保存在堆内存中的数据不是按顺序访问的,因为每个对象所需要的内存空间并不相等。

5种基本数据类型:undefined,null,boolean,number,string他们都是在栈中占据固定大小。

在进行参数赋值或者实参赋值的时候,他们都是值传递,也就是在栈内存中会有一个值的副本,只是当你传给它的是一个对象的时候,因为值传递你把对象的值传给它,也就时传给它了指向堆中空间的地址。所以这个时候的改变可以影响到对象,其他比如基本数据类型了,都是互不相干,值相同而已。

检测类型:
typeof s 如果是string就返回string,但是如果s的值是Null的话,他就返回一个object

person instanceof object 如果person是object对象就返回真

没有块级作用域

比如下面的形式,正常情况下在if结束以后就不能反问到color了,但是在这里我们仍然能够访问到,同样需要注意的是for循环语句for(int i =0; i<5; i++)中的形式。注意不要跟function中的局部变量搞混了。

if (true){
var color = "blue";
}

alert(color);      //"blue"


函数声明与函数表达式

解释器在加载数据的时候会先读取函数声明,也就是编译出二进制代码;而函数表达式必须等到解释器执行它所在的代码行,才会对它进行解释,所以如下

//可以正常运行
alert(sum(10,10));
function sum(num1, num2){     //在代码执行之前就加载到作用域中
return num1 + num2;
}

//没有函数名,因为你可以用sum访问到,并且最后别忘了有分号。
alert(sum(10, 10));           //会报错,因为sum还没有被解释出来
var sum = function(num1, num2){
return num1 + num2;
};


函数名仅仅是一个指针而已,它里面保存的是函数的位置,所以我们可以把它赋给另一个变量,这样新变量同样指向了函数。

window.color = "red";
var o = {color: "blue"};

function saycolor(){
alter(this.color);
}

saycolor();            //red 引用全局变量color

o.saycolor = saycolor; //对象o新建一个属性叫saycolor方法
o.saycolor();          //调用当前对象o的这个方法,所以返回blue

函数的属性和方法

1:this 是函数在执行时所处的作用域(在网页的全局作用域中调用函数时,this对象引用的就是window)

2:arguments 包含函数中的所有参数,它有一个callee属性,该属性是一个指针,用于指向拥有这个arguments对象的函数。

function factorial(n){
if(n <= 1){
return 1;
} else{
return n * factorial(n-1);
}
}

var f = factorial;
alert(factorial(5));                        //120
alert(f(5));                                //0,因为现在函数里面调用的还是factorial的对象

return n * arguments.callee(n-1);           //解决办法


3:每个函数都包含两个非继承而来的方法:apply()和call()。主要用途现在你定义了一个方法f,里面然后你想对对象o也调用这个方法,这个就是一个解决的途径。其实我感觉凡是调用call()的方法,里面的实现肯定是利用this,对当前对象进行处理,否则假设你都是一些类似参数s,根本不牵涉到this的引用,那你还让我们给你传递一个对象干啥。如果对象有this引用的属性的话,就用o的,如果没有就相当与给o新建了这个属性

window.color = "red";
var o ={color:"blue"};

function saycolor(s){
alert(this.color + s );
}

saycolor();                                 //上面已经说了,看函数所在的作用域,现在是网页中的全局,故是red
saycolor.call(o, " car");                   //"blue car"对对象o调用saycolor方法,现在的this就是o中值


基本包装类型

因为我们前面也说了5个基本数据类型,不是对象,但是我们平常有需要对这些基本数据类型进行操作,比方说string.substring(2),本来都是对象才有方法的。现在我们平常如何能够正常使用呢?

实际上每当读取一个基本数据类型的时候,后台都会创建一个对应的基本包装类型的对象。然后用这个对象调用方法,然后再删掉这个对象。这种方式主要用于string,number,boolean值

Number

parseInt()/parseFloat(),如果参数为空字符串,或则字符串的开始字符不是数字时,它将会返回一个NaN(not a number)值.

var num = 10;
alert(num.tostring(2));      //返回字符串"1010",2表示基数参数,默认是十进制

alert(num.toFixed(2));       //返回字符串"10.00",2表示显示几位小数,常用于货币之类的运算

alert(num.toExponential(1)); //返回字符串"1.0e+1",返回指数表示法,1表示小数位数

String 方法

var s= "hello world";
alert(s.charAt(1));           //"e"
alert(s.charCodeAt(1));       //"101"
fromCharCode()            //字符编码转换成字符串
s.length();                   //11
var s1=s.concat("!");         //s1="hello world!"而s="hello world"也就是说改副本
s1 = s + "!";                 //比concat简便并且常用,结果是一样的,改副本

alert(s.slice(3,7));          //"lo w"第一个是起始位置,第二个结束位置
alert(s.substring(3,7));      //"lo w"跟slice等价
alert(s.substr(3,7));          //"lo worl"第二个参数指定的是输出的个数

alert(s.indexof("o"));        //4 从前开始,o的下标
alert(s.lastindexof("o"));    //7 从后开始,o的下标,既然是下标了,所以如果只有一个时它跟上面结果一样
alert(s.indexof("o", 6));     //7 第二个参数指定起始位置
alert(s.lastindexof("o", 6)); //4

alert(s.toUpperCase());       //"HELLO WORLD",是一个副本的值,原值不变
alert(s.toLowerCase());       //"hello world"
Math:

Math.cei() 向上舍如

Math.floor() 向下舍入

Math.round() 标准四舍五入,当时当Math.round(25.5)返回值26

Math.random()返回一个0到1之间的随机数,它常于Math.floor连用,因为它是向下舍入

var a = Math.floor(Math.random() * 10 + 1); // 返回一个介于1到10之间的数

Math.abs(n); //返回绝对值

Math.exp(n); //返回E的n次幂

Math.log(n); //返回n的自然对数

Math.pow(n,p); //返回n的p次幂

Math.sqrt(n); //返回n的平方根

Math.acos(x); //返回x的反余弦值

Math.asin(x); //返回x的反正弦值

Math.atan(x); //返回x的反正切值

Math.atan2(y,x); //返回y/x的反正切值

Math.cos(x);

Math.sin(x);

Math.tan(x);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: