ES6浅谈 -- 数值扩展,函数扩展

数值扩展:

1.trunc(),去小数,非数字先用Number()转,转不了返回NaN。sign(),判断正负或0,正返回1,负返回-1,转换同上。cbrt(),计算立方根,转换同上。clz32(),计算参数的32位无符号整数前导0的个数。imul(),计算32位带符号整数相乘所得。Math.fround方法返回一个数的32位单精度浮点数形式。Math.hypot方法返回所有参数的平方和的平方根。BigInt数据类型,整数无位数限制,可以非常大。

函数扩展:

1.在看到参数默认值的时候,没有什么大的问题,因为之前也总结了,无非就是不能再声明,惰性求值(只有在需要的时候才获取),不能给参数赋未声明的变量值。这些都没什么问题,但是就突然想到了参数的传递方式。我们都知道在JS高程中说到的,参数是按值传递的,传基本类型的值这个结论非常清楚不需要解释,但是传对象的时候到底是传的什么呢?仔细思考,如果是按值传递,这个是如果是对象本身,那就相当于给给参数了一个新指针,然后堆里有一个新的内存空间,但这种情况显然不对。因为你堆里有新空间跟之前的对象没有联系的话,那么在函数中对形参添加一个属性,而实参作为函数的参数,调用这个实参对象的同名(形参同名)属性应该是没有意义的。所以这种情况排除。第二种情况,如果是直接给一个相同的引用(地址),那么为什么叫做按值传递,为什么不是变量赋值里的按引用传递?形参也是个局部变量啊对不对。所以,真正的传递模式是按共享传递。这里摘抄了一位大佬的结论:

"它与引用传递的不同是,引用并没有内存,例如c语言中的指针,只是一个指向;但是共享传递不是,它会将实参的所在的地址也拷贝进来,这个变量本身就可以看做一个内存,只是这个内存的一个值保存另一块内存的地址。所以我们可以运行上面的函数发现,obj2的值变了,但是person2没有任何影响,因为此时它们是两块不同的内存,而person1和obj1之所以可以变,是因为person1和obj1两块内存中的一个name所在的区域保存了指向一块内容为”张三”的内存的引用(内存地址),并且这块内存是惟一的,所以obj1表现的像是引用传递。"
原文链接:https://blog.csdn.net/babulongbo/article/details/82595119

2.参数默认值可以与解构赋值默认值一起使用。解构赋值默认值有一个问题是如果不传参,那么一定会报错,当然传参肯定也要传一个对象,对象里面用同名属性,然后解构。对解构赋值默认值(是一个对象的样子)这个形参赋一个默认值就可以解决这个报错问题。

3.默认值位置:通常情况定义在尾参数,如果是头参数或中间则如下代码所示,另外赋undefined则当做默认值,null就是null。

// 例一
function f(x = 1, y) {
  return [x, y];
}

f() // [1, undefined]
f(2) // [2, undefined])
f(, 1) // 报错
f(undefined, 1) // [1, 1]

// 例二
function f(x, y = 5, z) {
  return [x, y, z];
}

f() // [undefined, 5, undefined]
f(1) // [1, 5, undefined]
f(1, ,2) // 报错
f(1, undefined, 2) // [1, 5, 2]

先到这里吧

原文地址:https://www.cnblogs.com/harrywu96/p/12146104.html

时间: 2024-10-08 22:09:25

ES6浅谈 -- 数值扩展,函数扩展的相关文章

泛型编程与C++标准模板库 : 浅谈sort()排序函数

以前用sort排序的时候,只知道sort函数有如下两种重载方式. template< class RandomIt > void sort( RandomIt first, RandomIt last ); template< class RandomIt, class Compare > void sort( RandomIt first, RandomIt last, Compare comp ); 当时对这些参数也不是很懂,只知道一些简单的用法. 1).比如: 如下代码可以使

浅谈欧拉函数【复习】

浅谈欧拉函数[复习] 定义: φ(n)表示小于n的正整数中和n互质的个数; 性质: 1.积性函数:φ(n×m)=φ(n)×φ(m)(感性理解) 2.a^φ(n)^≡1(mod n),当且仅当gcd(a,n)==1(感性理解) 3.[1,n]中与n互质的数的和为n×φ(n)/2 4.Σφ(d)=n,其中(d|n)(感性理解) 5.φ(p^a^)=p^a^-p^a-1^,其中(p为素数,a为正整数) 证明: 这里插入个游戏: 问题:求正整数3^83^的最后两位数 回到正题 一:√n求单个数的欧拉函数

ES6浅谈--解构,字符串扩展

解构: 1.大括号在句首会被认为是代码块,通过加圆括号可以解决问题,但是在声明语句中不能加圆括号,只有在赋值语句的非模式部分可以. 2.数值和布尔值解构会先转换成对象,然后用其包装对象的toString方法取得值再赋值. 3.解构用途:交换变量值:函数返回多个值取值:参数定义:提取json数据:参数默认值:遍历map:模块方法. 字符串扩展: 1.大括号增加unicode范围识别,另外支持for of遍历字符串. 2.模板字符串可以用于输入html文本,用${}做变量识别,反引号用反斜杠转义,t

ES6浅谈--数组扩展、对象扩展

数组扩展 1.includes()方法,参数为要检测的值.includes方法有点像indexOf(),indexOf未检测到则返回-1,否则返回下标.includes则是返回true或false.includes可以检测NaN.第二个参数表示从什么位置检测. 2.flat和flatMap.flat负责把数组拉平,意思是一个二维数组调用flat方法会变成一维数组.参数传的是数组的维度.例如传2则表示将3维拉成1维.如果数组中有空位则跳过.flatMap有点像flat方法和Map方法的结合.先对每

ES6浅谈 -- 数组扩展

1.数组可以用spread参数合并,使用该参数要注意被合并的一定是一个数组对象.另外不管是数组合并还是数组拼接都是浅拷贝,实质是拷贝地址(引用). 2.可以和解构赋值混用,如const [first, ...rest] = [1,2,3,4,5]; 还可以将字符串每个字符拆分然后变成数组元素. 3.Array.from(),将类数组对象和可遍历对象转成数组:Array.of(),将一组值转为数组,与Array不同的是,array只跟一个参数会认为输入了这个数组的长度,而array of则认为是输

浅谈Manacher算法与扩展KMP之间的联系

首先,在谈到Manacher算法之前,我们先来看一个小问题:给定一个字符串S,求该字符串的最长回文子串的长度.对于该问题的求解,网上解法颇多,时间复杂度也不尽相同,这里列述几种常见的解法. 解法一 通过枚举S的子串,然后判断该子串是否为回文,由于S的子串个数大约为,加上每次判断需要的时间,所以总的时间复杂度为,空间复杂度为. bool check(string &S, int left, int right) { while (left < right && S[left]

ES6新特性:Function函数扩展, 扩展到看不懂

本文所有Demo的运行环境为nodeJS, 参考:让nodeJS支持ES6的词法----babel的安装和使用 : 函数的默认值: 如果有参数 ,那就用参数, 如果没有参数, 那就用默认的参数: ajax的请求经常要做这些判断, ES6规定了新的表达式, 让判断参数的逻辑更加简单: function fn(a = 1, b = 2, c = 3) { console.log(a,b,c); } fn(); //输出 1, 2, 3; fn(4,5,6); //输出 4, 5, 6 如果调用函数的

ES6浅谈--const,数组解构

关于const: 1.const声明的基本类型的值不可重复声明,不可修改,声明之后需要初始化,声明存在暂时性死区,只在声明的块级作用域内有效. 2.const本质上确保的是变量的内存地址的数值不会被改动,所以对于基本类型的值来说,数值在栈中保存,不会被修改:但是对于对象来说,const声明的对象不可以被改变的是内存地址,数据存在堆中,是可以被修改的,如果想不被修改需要freeze. 3.冻结对象后不能新添加属性,但是还可以修改原有属性,所以需要彻底冻结所有属性. 4.浏览器环境下顶层对象和全局对

浅谈字符串处理函数(三)

前面我们谈到了strcpy和strncpy这两个函数.这两个函数都没有考虑到内存重叠,假如要考虑内存重叠,我们又该如何实现呢?所谓重叠,就是src未处理的部分已经被dst给覆盖了 memcpy的函数原型如下:void *memcpy(void *dest, const void *src, size_t n); memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 函数返回指向dest的指针. 函数实现如下: void *mymem