Javascript中函数相关知识点

PS:本内容属于Javascript中基础知识,适合初学者或者基础知识不牢固者

/** * ECMAScript中所有函数的参数都是  “按值传递”  的,也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到两一个变量一样。 * 值得注意的是,访问变量有“按值”和”按引用”两种方式,而参数只能 “按值传递”。 * PS1:在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,或者还用ECMAScript的概念来说,就是arguments对象中的一个元素)。 * 在向参数传递引用类型的值的时候, * 会把这个值在内存中的地址复制给一个局部变量,因为这个局部变量的变化会反映在函数的外部。 * **/

function addTen(num){    num +=10;    return num;}var count = 20;var result = addTen(count);console.log(count);  // 20console.log(result); // 30

//function setName(obj){    obj.name = "Andy";}var person = new Object();setName(person);console.log(person.name);  // Andy

// 解析:以上代码中创建了一个对象,并将起保存在了变量person中,然后,这个变量被传递到setName()函数中之后就被复制给了obj。这个函数内部,obj和person引用的是同一个对象。// 换句话说,即使这个变量是按值传递的,obj也会按引用来访问同一个对象。// 很多人错误的认为:在局部作用域中修改的对象会在全局作用域中反映出来,就说明参数是按引用传递的。为了证明对象是按值传递的,我们看下面一个例子:

function setName2(obj){    obj.name = ‘Andy‘;    obj =  new Object();    obj.name = ‘Greg‘;}var person2 = new  Object();setName2(person2);console.log(person2.name);//  Andy

/** * 如果person是按引用传递的,那么person就会自动被修改为指向其name属性值为“Greg”的新对象。 * 但是,当接下来再访问person.name时,显示的值仍然是“Andy”。这说明即使在函数内部修改了参数的值,但原始的引用仍然保持未变。 * 实际上,当再函数内部重新obj时,这个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁; * **/

/** * 执行环境以及作用域 * 每个函数都有自己的执行环境。当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。 * ECMAScript程序中的执行流正式由这个方便的机制控制着。 * * **/

/** * 管理内存: * 确保占用最少的内存可以让页面获得更好的性能。而优化内存占用的最佳方式,就是为执行中的代码只保存必要的数据。一旦数据不再有用,最好通过将其值设置为null来释放其引用--这个做法叫做解除引用。 * 这一做法适用于大多数全局变量和全局对象的属性。局部变量会在他们离开执行环境时被解除引用。 * 不过,解除一个值的引用并不意味着自动回收该值所占用的内存。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。 * **/

function createPerson(name){    var localPerson = new Object();    localPerson.name = name;    console.log(localPerson.name);  // Andy    return localPerson;}var globalPerson = createPerson(‘Andy‘);globalPerson = null;

/** * 引用类型: * 引用类型的值(对象)是引用类型的一个实例。在ECMASript中,引用类型是一种数据结构,用于将数据和功能组织在一起。它也常被称为“类”。但这种称呼并不妥当。 * 1,Object类型 * 创建Object实例的方式有两种。第一种是使用new操作符后跟Object构造函数如: * var person = new Object(); * person.name = "Andy"; * person.age = ‘27‘; * 另外一种方式是使用对象字面量表示法 * var person ={ *      name:"Andy", *      age :27 * } * 一般说来,访问对象属性时使用的都是点表示法,这也是很多面向对象语言中通用的语法。不过在Js中也可以使用方括号表示法来访问对象的属性。在使用方括号语法时,应该将要访问的属性以字符串的形式放在 * 方括号里。如 * alert(person["name"]);  >>>>  alert(person.name) * 从功能上看,这两种访问对象属性的方法没有任何区别,但方括号语法的主要优点是可以通过变量来访问属性,如: * var proptrtyName = ‘name‘; * alert(person[proptrtyName]); * 如果属性名中包含会导致语法错误的字符,或者属性名使用的是关键字或保留字,也可以使用方括号表示法:如 * person["first name"] = "Andy"; // 由于“first name”中包含一个空格,所以不能用点表示法来访问它。 * **/

/** * 2,Array类型 * 创建数组的基本方式有两种。 * 第一种是使用Array构造函数, * var color = new Array(); *第二种是使用数组字面量表示法。 * var color = ["red","blue","green"]; * * 数组的length属性很有特点--它不是只读的。因此,通过设置这个属性,可以从数组的末尾移除项或向数组中添加新项 * **/var colors = ["red","blue","green"];colors.length =2;console.log(colors[2]);   //  undefined;// 如果将其length属性设置为大于数组项数的值,则新增的每一个项都会取得undefined的值var colors2=["red","blue","green"];colors2.length =4;console.log(colors2[3]);   // undefined;// 所以,利用length属性也可以方便地在数组末尾添加新项;

/** * 检测数组 * if( value instanceof Array ){ *    // TO DO... * } * 不过,如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的Array构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个 * 框架中原生创建的数组分别具有各自不同的构造函数。 * 为了解决这个问题,ECMAScript5新增了Array.isArray()方法; * * if (Array.isArray(value)){    支持Array.isArray() 方法的浏览器有IE9+,..... *      // TO DO... * } * 如果要解决浏览器兼容性问题,由于在任何值上调用Object原生的toString()方法,都会返回一个【object NativeConstrucotrName】格式的字符串,每个类在内部都有一个[[Class]]属性, * 这个属性中就指定了上述字符串中的构造函数名。 * 由于原生数组的构造函数名与全局作用域无关,因此使用toString()能够保证返回一致的值。利用这一点,我们解决下浏览器对检测数组的兼容性问题; * **/function isArray(value){    return Object.prototype.toString.call(value) == ‘[object Array]‘;}// 同样,也可以基于这一个思路来测试某个值是不是原生函数或正则表达式:function isFunction(value){    return Object.prototype.toString.call(value) == ‘[object Function]‘;}function isRegExp(value){    return Object.prototype.toString.call(value) == ‘[object RegExp]‘;}

/** * 转换方法: * 其实,所有对象都具有toLocaleString()/toString()/valueOf()方法,其中,调用数组的toString()方法会返回有数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串。而调用 * valueOf()返回的还是数组。 * **/var colors3 = ["red","blue","green"];console.log(colors3.toString());  // red,blue,greenconsole.log(colors3.valueOf());     // ["red", "blue", "green"]console.log(colors3);               //["red", "blue", "green"]// console.log(colors3)要接收字符串参数,所以它会在后台调用toString()方法,由此会得到与直接调用toString()方法相同的结果;

/** * 栈方法:(后进先出) * ECMAScript数组也提供了一种让数组的行为类似于其他数据结构的方法。具体说来,数组可以表现的像栈一样,后者是一种可以限制插入和删除项的数据结构。 * ECMAScript为数组专门提供了push()和pop()方法,以便实现类似栈的行为。 * push():把他们逐个添加到数组末尾,并返回  修改后数组的长度 ; * pop():方法则从数组末尾移除最后一项,然后返回  移除的项 ; * **/

/** * 队列方法:(先进先出) * 队列在列表的末端添加项,从列表的前端移除项。 * shift():它能够移除数组中的第一个项并返回  该项 ,同时将数组长度减1 * unshift(): * **/

var colors4 =new Array();var count4= colors4.push(‘red‘,‘green‘);console.log(count4);  //2count4 = colors4.push(‘black‘);console.log(count4);    //3

var item = colors4.shift();console.log(item);  // ‘red‘console.log(colors4.length);  // 2

var colors5 =new Array();var count5 = colors5.unshift(‘red‘,‘green‘);console.log(count5)count5 = colors5.unshift(‘black‘)console.log(colors5)
时间: 2024-11-02 06:00:44

Javascript中函数相关知识点的相关文章

私人定制javascript中数组小知识点(Only For Me)

先上笑话,1.刚看到一个游泳的,想起公司组织去三亚旅游,老板跳海里,各种挣扎,捞上来老板第一句话:我记得我会游泳的啊. 2.媳妇说:老公对不起,我把你新买的自行车撞散架了! 老公:没事宝贝,你若安好,便是晴天! 媳妇说:老公你太有诗意了. 老公:滚犊子,安不好我整死你! 数组的概念 javascript数组是值得有序集合,不过它实属一个javascript对象的特殊形式,这是一个很重点的定性. 创建数组 1.var a=new Array();//等同于[] 2.var a=new Array(

私人定制javascript中对象小知识点(Only For Me)

废话不多讲,先上笑话,然后再,.看懂这个的说明你的节操已经不再了. 晚饭后去理发店理发...割了吧...老板问我怎么剪,我悠悠的来一句往帅了剪...高潮往往令人想不到....旁边一在焗油烫头发的大妈说到 别这样为难老板,人家赚点钱不容易...首先如果你是高手那么请出门右转,如果你是菜鸟那么恭喜你,go on吧 全局对象在javascript程序中任何位置,都可以拈来就用的这种东西,是全局对象的属性.那么属性所在的对象也就是全局对象了.当javascript解释器启动时(或者任何Web浏览器加载新

私人定制javascript中函数小知识点

函数的定义 首先在javascript中,函数就是对象,程序可以随意操控它们.比如,可以给它们设置属性,甚至调用它们的方法.函数使用function关键字来定义.它既可以用在函数定义表达式,也可以用在函数声明语句中.函数声明function后面必须要更上函数名称也就是所谓的函数名称标识符.如果是函数表达式函数名称标识符可有可无.这段重点是函数是对象,所以函数表现出来的种种行为你想想成对象,那么很多疑惑可能就恍如昨日初见. 函数调用 4种方式来调用javascript函数: 1.作为函数 就是函数

Javascript中的Form表单知识点总结

在HTML中,表单是由form元素来表示的,但是在javascript中,表单则由HTMLFormElement类型,此元素继承了HTMLElement,因此与其他HTML元素具有相同的默认属性:HTMLFormElement有自己以下属性和方法: acceptCharset: 服务器能够处理的字符集:等价于HTML中的accept-charset特性: action:  接收请求的URL,等价于HTML中的action elements: 表单中所有控件的集合. enctype: 请求的编码类

Javascript易错知识点

? JS易错知识点总结: == 和 === 的区别: ==:判断两个变量的值是否相等. ===:判断两个变量的类型和值是否都相等,两个条件同时满足时,表达式为True. switch中break的作用: 如果一个case后面的语句,没有写break,那么程序会向下执行,而不会退出: 例如:当满足条件的case 2下面没有break时,case 3也会执行 1 var num = 2; 2 switch(num){ 3 case 1: 4 alert('case 1'); 5 break; 6 c

JavaScript一些重要知识点结合题目的表现!

function Foo() { //① 声明一个Foo的函数 getName = function () { alert (1); }; return this; } Foo.getName = function () { alert (2);}; ② 为Foo创建一个叫getName的静态属性存储一个匿名函数 Foo.prototype.getName = function () { alert (3);}; ③为Foo的原型对象创建一个叫getName的匿名函数 var getName =

深入理解JavaScript中创建对象模式的演变(原型)

创建对象的模式多种多样,但是各种模式又有怎样的利弊呢?有没有一种最为完美的模式呢?下面我将就以下几个方面来分析创建对象的几种模式: Object构造函数和对象字面量方法 工厂模式 自定义构造函数模式 原型模式 组合使用自定义构造函数模式和原型模式 动态原型模式.寄生构造函数模式.稳妥构造函数模式 第一部分:Object构造函数和对象字面量方法 我之前在博文<javascript中对象字面量的理解>中讲到过这两种方法,如何大家不熟悉,可以点进去看一看回顾一下.它们的优点是用来创建单个的对象非常方

JavaScript中的函数表达式

在JavaScript中,函数是个非常重要的对象,函数通常有三种表现形式:函数声明,函数表达式和函数构造器创建的函数. 本文中主要看看函数表达式及其相关的知识点. 函数表达式 首先,看看函数表达式的表现形式,函数表达式(Function Expression, FE)有下面四个特点: 在代码中须出现在表达式的位置 有可选的函数名称 不会影响变量对象(VO) 在代码执行阶段创建 下面就通过一些例子来看看函数表达式的这四个特点. FE特点分析 例子一:在下面代码中,"add"是一个函数对象

全面理解Javascript中Promise

全面理解Javascript中Promise 最近在学习Promise的时候,在网上收集了一些资料,发现很多的知识点不够系统,所以小编特意为大家整理了一些自认为 比较好的文章,供大家更好地学习js中非常有趣的Promise Promise概念 2015 年 6 月,ECMAScript 6 的正式版 终于发布了. ECMAScript 是 JavaScript 语言的国际标准,javascript 是 ECMAScript 的实现.ES6 的目标,是使得 JavaScript 语言可以用来编写大