一、JavaScript 函数返回值 1、函数返回值引入 JavaScript 函数 可以 实现某种特定的功能 , 执行完毕后 , 可以返回一个 " 返回值 " ; 当 函数 被调用执行任务完毕时 ,..." 返回值 " 会被返回给调用者 ; 如果 函数 中没有明确 使用 return 关键字 返回 " 返回值 " , 那么函数会默认返回undefined 值 ; 2、函数返回值语法 在 JavaScript...: function functionName(parameters) { // 函数体 return expression; // 返回值 } 在 JavaScript 中的返回值类型..., 返回给 调用者的 默认返回值是 undefined 未定义值 , 使用 变量 ret 接收默认返回值 , 将其打印出来 就是 undefined 值 ; 代码示例 : 执行结果 : 打印出来的 函数返回值 是 undefined 未定义值 ; 4、函数默认返回值 在下面的代码中 , add 函数 中 使用 return 关键字 返回返回值
因为arguments本身并不能调用数组方法,它是一个另外一种对象类型,只不过属性从0开始排,依次为0,1,2...最后还有 callee 和length属性,我们也把这样的对象称为类数组。...那这导致很多数组的方法就不能用了,必要时需要我们将它们转换成数组,有哪些方法呢?...Array.prototype.slice.call() function sum(a, b) { // 将类数组转换为数组 let args = Array.prototype.slice.call...}) console.log(num); }; sum(1,2,3,4,5,6); // 21 Array.from() function sum(a, b) { // 将类数组转换为数组...ES6展开运算符 function sum(a, b) { // 将类数组转换为数组 let args= [...arguments]; // 对转换为数组的方法调用累加
对于一个返回null 而不是零长度数组或者集合的方法,客户端几乎每次用到该方法都可能会忘记写专门处理null 返回值的代码,进而导致NPE。...返回值为null 与性能 有时候会有程序员认为:null 返回值比零长度数组更好,因为它避免了分配数组所需要的开销,但这种观点站不住脚。...在返回值这种级别上担心性能问题是不明智的,除非分析表明这个方法是造成性能问题的真正源头 对于不返回任何元素的调用,每次返回同一个零长度数组是有可能的,因为零长度数组不可变的,而不可变对象可能被自由的共享...,没理由返回null,二是返回一个零长度的数组或者集合。...Java 的返回值为null 的做法,很可能是从C 语言沿袭过来的,在C 中,数组长度是与实际的数组分开返回的,如果返回的数组长度为0,再分配一个数组就没有任何好处了。
一、JavaScript 函数返回值 1、return 关键字终止函数 return 关键字 除了 返回 函数返回值 功能之外 , 还具有 终止 函数执行 的作用 , return 关键字后面的语句... 执行结果 : 只返回了最后一个值 ; 3、return 关键字返回多个值 - 返回数组对象 如果需要返回多个值 , 可以 使用 return 关键字 返回一个数组...; JavaScript 中的数组 相当于 Java 中的 ArrayList , 可以动态改变元素个数 ; 代码示例 : 在下面的代码中 , add 函数返回一个数组 [num1, num2, num1...+ num2] , 此时数组对象被当做一个返回值对待 , 因此 可以使用 return 关键字返回 ; 执行结果 : 返回了 一个数组 , 数组中有 3 个值 ;
如果将一个匿名函数赋值给一个变量,ES5 的 name 属性会返回空字符串,而 ES6 的 name 属性会返回实际的函数名。...函数体内的 this 对象就是定义时所在的对象,而不是使用时所在的对象。 不可以当作构造函数。也就是说,不可以使用 new 命令,否则会抛出一个错误。...蹦床函数(trampoline)可以将递归执行转为循环执行,它接受函数作为参数,只要函数执行后返回函数,就继续执行。 然后将原来的递归函数改写为每一步返回另一个函数。...然后,每一轮递归 sum 返回的都是 undefined,所以就避免了递归执行;而 accumulated 数组存放每一轮 sum 执行的参数,总是有值的,这就保证了 accumulator 函数内部的...空位不是 undefined,一个位置的值等于 undefined 依然是有值的。空位是没有任何值的,in 运算符可以说明这一点。
首先简单回顾一下JSON和JavaScript: 不是所有的合法的JSON都是有效的JavaScript; JSON只是一个文本格式; JSON中的数字是十进制。 1....foo中属性b的值是函数定义,没有被转换而丢失。 还有哪些属性也不能转换? 1. 循环引用 如果一个对象的属性值通过某种间接的方式指回该对象本身,那么就是一个循环引用。...(foo); console.log(fooStringified); // {"b":{"a":{}}} c的属性指向foo对象,foo对象中的b属性又指向bar对象而无法处理,整个被忽略而返回空对象...假想如果服务器只想要ade的全称,而不是分别获取姓和名,我们可以直接定义toJSON来达到目的: Person.prototype.toJSON = function () { return {...函数 过滤函数以对象中的每一个属性和值作为输入,返回值有以下几种情况: 返回undefined表示忽略该属性; 返回字符串,布尔值或则数字将会被stringify; 返回对象将会触发递归调用知道遇到基本类型的属性
undefined 代表的含义是未定义, null 代表的含义是空对象(但又不是对象)。...这里使用了 typeof 函数去判断类型,那么在 javascript 如何准确的判断一个变量的类型呢?...,发现这里的 toString() 不是调用 Object.prototype.toString(),数组内部对这个方法进行重写了。...但是它也存在着以下几个问题: 他无法实现对函数 、RegExp 等特殊对象的克隆 会抛弃对象的 constructor, 所有的构造函数会指向 Object 对象有循环引用, 会报错 • 递归实现...null 和 undefined 是相等的 4、要比较相等性之前,不能将 null 和 undefined 转换成其他任何值 5、如果有一个操作数是 NaN,则相等操作符返回 false ,而不相等操作符返回
javascript函数是基于词法作用域(lexical scoping)的顶级对象,是第一个成为主流的lamda语言。一个糟糕的选择:javascript依赖于全局变量来进行连接。...除了声明时定义的形参,每个函数接收两个附加的参数:this和arguments,arguments.callee(ES5严格模式报错)代表函数自身,通常用于递归。...当return被执行(不管ture or false),函数立即返回而不再执行余下代码。 一个函数总会返回一个值,没有指定返回值,则返回undefined。...如果函数以new方式调用,且返回值不是一个对象,则返回this(该新对象)。 补充:continue中断本次循环,继续下一次循环。break 语句用于跳出循环。...即使quo已经返回了,但get_status方法仍然享有访问quo对象的的status属性的特权。get_status方法并不是访问该参数的一个拷贝,它访问的就是该参数本身。
JavaScript 对象的底层数据结构是什么? 对象数据被存储于堆中 (如对象、数组、函数等,它们是通过拷贝和new出来的)。...至少可以说出三种判断 JavaScript 数据类型的方式,以及他们的优缺点,如何准确的判断数组类型 typeof —— 返回给定变量的数据类型,可能返回如下字符串: 'undefined'——Undefined...true,不是则返回 false。...理解原型设计模式以及 JavaScript 中的原型规则 A. 所有的引用类型(数组、对象、函数),都具有对象特性,即可自由扩展属性; B....理解堆栈溢出和内存泄漏的原理,如何防止 堆栈溢出 的产生是由于过多的函数调用,导致调用堆栈无法容纳这些调用的返回地址,一般在递归中产生。
上面代码使用了对象的解构赋值默认值,而没有使用函数参数的默认值。...调用函数f时,参数形成一个单独的作用域。在这个作用域里面,默认值变量x指向第一个参数x,而不是全局变量x,所以输出是2。 再看下面的例子。...(3)函数的返回值 JavaScript的函数只能返回一个值,如果需要返回多个值,只能返回数组或对象。扩展运算符提供了解决这个问题的一种变通方法。...(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。 (2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。...function f(x){ g(x); return undefined; } 尾调用不一定出现在函数尾部,只要是最后一步操作即可。 尾递归 函数调用自身,称为递归。
如果将一个匿名函数赋值给一个变量,ES5 的name属性,会返回空字符串,而 ES6 的name属性会返回实际的函数名。...x是在函数f的外部声明的,所以它的作用域绑定外层,内部变量a不会到函数f体内取值,所以输出1,而不是2。...当我们在foo外部取出bar执行时,变量x指向的是foo内部的x,而不是foo外部的x。...参数的省略 函数参数不是必需的,Javascript允许省略参数。...return语句不是必需的,如果没有的话,该函数就不返回任何值,或者说返回undefined 函数可以调用自身,这就是递归(recursion)。
//三元表达式:如果不写end参数则为undefined说明第一次调用所以结束索引为arr.length-1 //如果是递归调用则使用传进来的参数end值 var end=...Js中数组是如何在内存中存储的? 数组不是以一组连续的区域存储在内存中,而是一种哈希映射的形式。它可以通过多种数据结构来实现,其中一种是链表。 4....in 获取的是对象的键名; for… in 会遍历对象的整个原型链,性能非常差不推荐使用,而 for … of 只遍历当前对象不会遍历原型链; 对于数组的遍历,for…in 会返回数组中所有可枚举的属性...不同的对象类型调用toString方法时,根据原型链的知识,调用的是对应的重写之后的toString方法(function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串…),而不会去调用...9. isNaN 和 Number.isNaN 函数有什么区别? NaN:全局属性 NaN 的值表示不是一个数字(Not-A-Number)。
,将两个链表头部较小的一个与剩下的元素合并,并返回排好序的链表头,当两条链表中的一条为空时终止递归。...笔记 变量 JavaScript的类型有数字,字符串,布尔值,函数和对象,还有undefined和null,数组,日期,正则表达式。...在JavaScript中,使用关键字var,而不必指定变量类型,所以,JavaScript不是强类型语言。...原型方法只能声明公共函数和属性,而类定义可以声明只在类的内部访问的私有函数和属性。 ECMAScript是一种脚本语言规范,JavaScript是这个规范的一个实现。...// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
这些名字被当做字面量名而不是变量名来对待,所以对象的属性名在编译时才能知道。属性的值就是表达式。...P20 简单类型: 数字,字符串,布尔值,null值和undefined值 对象类型:数组,函数,正则表达式,对象。 对象是可变的键控集合,对象是属性的容器,每个属性都拥有名字和值。...P31 当函数被调用时,会得到一个免费奉送的参数,arguments数组。 arguments并不是一个真正的数组。它只是一个类似数组(array-like)的对象。...一个函数总是会返回一个值。如果没有指定返回值,则返回undefined。 如果函数以在前面加上new前缀的方式来调用,且返回值不是一个对象,则返回this(该新对象)。...P43 级联 没有返回值的方法会返回undefined, 如果我们让方法返回this而不是undefined,就可以启用级联。
arguments对象不是数组,而是一个类似数组的对象。所以为了使用数组的方法,必须使用Array.prototype.slice.call先将其转为数组。...如果将一个匿名函数赋值给一个变量,ES5 的name属性,会返回空字符串,而 ES6 的name属性会返回实际的函数名。...箭头函数可以让setTimeout里面的this,绑定定义时所在的作用域,而不是指向运行时所在的作用域。下面是另一个例子。...只要f执行后返回一个函数,就继续执行。注意,这里是返回一个函数,然后执行该函数,而不是函数里面调用函数,这样就避免了递归执行,从而就消除了调用栈过大的问题。...然后,每一轮递归sum返回的都是undefined,所以就避免了递归执行;而accumulated数组存放每一轮sum执行的参数,总是有值的,这就保证了accumulator函数内部的while循环总是会执行
1.如果obj里面有时间对象,则JSON.stringify后再JSON.parse的结果,时间将只是字符串的形式,而不是对象的形式2.如果obj里有RegExp(正则表达式的缩写)、Error对象,则序列化的结果将只得到空对象...常见的类数组对象有 arguments 和 DOM 方法的返回结果,函数参数也可以被看作是类数组对象,因为它含有 length属性值,代表可接收的参数个数。...,因此它会被then捕获而不是catch。原型链指向p.__proto__ // Person.prototypePerson.prototype....迭代查询与递归查询实际上,DNS解析是一个包含迭代查询和递归查询的过程。递归查询指的是查询请求发出后,域名服务器代为向下一级域名服务器发出请求,最后向用户返回查询的最终结果。...例如 Infinity、NaN、undefined、null 字面量(2)函数属性,全局函数可以直接调用,不需要在调用时指定所属对象,执行结束后会将结果直接返回给调用者。
reverse() 方法返回一个到数组本身的引用(在这种情况下即,arr1)。其结果为,arr2 仅仅是一个到 arr1的引用(而不是副本)。...16.下面的递归代码在数组列表偏大的情况下会导致堆栈溢出。在保留递归模式的基础上,你怎么解决这个问题?...,而不是调用堆栈。...这就解释了为什么,有些令人奇怪的是, 1 && 2返回 2(而不是你以为的可能返回 true 或 1)。 20.执行下面的代码时将输出什么?请解释。...原因是: 命名函数 f()递归地调用本身,当调用 f(1)的时候,只简单地返回1。
: b = 3;var a = b; 所以 b 成了全局变量,而 a 是自执行函数的一个局部变量。...6、下面两个函数的返回值是一样的吗?为什么?...: function foo2(){ return; { bar: "hello" }; } 所以第二个函数是返回 undefined。...reverse() 会改变数组本身,并返回原数组的引用。 15、下面的代码会输出什么?为什么?...这是一个递归调用,为了简化,我初始化 n=5,则调用链和返回链如下: 递归 23、解释下面代码的输出 (function(x) { return (function(y) { console.log
这种行为也被认为是遵循了在JavaScript中将一行开头大括号放在行尾的约定,而不是在新行的开头。如此处所示,这不仅仅是JavaScript中的一种风格偏好。 7、什么是NaN?它的类型是什么?...reverse()方法返回对数组本身的引用(即,在这种情况下为arr1)。因此,arr2仅仅是对arr1的引用(而不是副本)。...16、如果数组列表太大,以下递归代码将导致堆栈溢出。你如何解决这个问题,仍然保留递归模式?...setTimeout( nextListItem, 0); }}; 堆栈溢出被消除,因为事件循环处理递归,而不是调用堆栈。...注意:JavaScript区分大小写,我们在这里使用NULL而不是null。 36、代码返回后会怎么样?
content {:toc} 本文为慕课网 JavaScript深入浅出 JavaScript 函数笔记。 概念 函数是一块JavaScript代码,被定义一次,但可执行和调用多次。...callee 属性是 arguments 对象的一个成员,它表示对函数对象本身的引用,这有利于匿名函数的递归或者保证函数的封装性,例如下边示例的递归计算1到n的自然数之和。...call 为扁平化传参,apply 后面的参数为数组 传入 null/undefined 时,实际为 Window 对象 在严格模式下:上述代码最后两行分别输出 null, undefined bind...在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。...而原函数 foo 的返回值不是对象,所以会直接忽视这个 return 方法。而是变为 return this;。
领取专属 10元无门槛券
手把手带您无忧上云