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

来源:互联网 发布:网络诈骗手段常见哪些 编辑:程序博客网 时间:2024/06/05 20:18

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 引用全局变量coloro.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));                        //120alert(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();                                 //上面已经说了,看函数所在的作用域,现在是网页中的全局,故是redsaycolor.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();                   //11var 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);






原创粉丝点击