函数与Symbol

1.数字类型用法
(1)Number.isNaN()函数
传统的isNaN函数会把非数值的参数转化成数值再进行判断,而Number. isNaN只对数值类型有效,非数值类型的参数一律返回false。

Number.isNaN不再有隐式类型转化。

(2)Number.isFinite()函数
        用来检查一个数值是否非无穷(有限)

        isFinite函数跟isNaN函数一样,也只是对数值类型有效,对非数值类型的参数一律返回false。

        当Number.isFinite函数返回false的时候,参数不一定就是一个无穷的数值类型,也有可能是一个非数值类型的参数。如:字符串’abc’

(3)Number.parseInt()函数
        parseInt函数:解析一个字符串,返回一个整数(向下取整)

(4)Number.isInteger()函数
        Number.isInteger函数:用来判断是否是整数

        数值3.0和3.00都会被认为是整数

(5)Math.trunc()函数
         Math.trunc函数:用于去除一个数的小数部分,返回整数部分

(6)Math.sign()函数
        Math.sign函数:用来判断一个数到底是正数、负数、还是零

参数如果是正数,结果返回1;如果是负数,结果返回-1;如果是0,结果返回0;如果是一个非数值类型的参数,结果返回:NaN

2.对象的使用
1.如果属性名和属性值相同,可以简写,只写属性名

        var person = {name,age}

2.函数简写,去掉冒号和function,只留下小括号和大括号

        var person = {say(){}}

(1)ECMAScript6中属性名的更新
用字面量定义一个对象的时候,可以用表达式作为对象的属性名或者方法名。

 (2)Object.is函数 相当于三个等号===
函数的作用:比较两个值是否严格相等,或者说全等。

 (3)Object.assign函数 只能深拷贝一层
        函数作用:将源对象的属性赋值到目标对象上。

Object.assign(对象1,对象2,对象3....)//将后边的多个对象赋值到第一个目标对象中,若属性重复,后边覆盖前面的

Let obj5 = Object.assign({},obj4)  //实现对obj4第一层的深拷贝

只能深拷贝一层

        let obj5 = Object.assign({},obj4)

 (4)Object.getPrototypeOf函数
        函数作用:获取一个对象的prototype属性

(5)Object.setPrototypeOf函数
函数作用:设置一个对象的prototype属性。(设置原型对象)

3.函数的使用
(1)参数的默认值
把默认值的设定放在参数上:function person(name='zs',age=15){ }

如果函数有多个参数,但只有部分需要指定默认值,另一部分不需要的话,那么,设定默认值的参数一定要放在最后。

只有当传入的参数为undefined,才会触发默认值赋值。否则,哪怕你传的参数值为0,false,null都不会触发默认值赋值

函数的参数是默认声明的,声明过的变量,就不能用let或者const关键字再次声明

(2)rest参数(...value,  ’...’ 是扩展运算符)
        rest参数必须是函数的最后一个参数,后面不能再跟其他参数

错误写法:function sum(result,...values,mult){}

正确写法:function sum(result,mult,...values){}

(3)扩展运算符
表示法使用...(三个点)

        var arr = [10,20,30,40]

  // 1、遍历数组

          console.log(...arr);

  // 2、当做数组的元素

          console.log("哈哈", 10, 20, 30, 40, true);    

          console.log(["哈哈", ...arr, true]);   //数组

  // 3、用于深拷贝  

          var arrNew = [];

          // arrNew = [...arr];

          [...arrNew] = arr;

          console.log(arrNew);

          arr.push(50);

          console.log(arr);

          console.log(arrNew);

  // 4、用于函数的调用

          function demo1(x, y, z, m) {

            console.log(x + y + z + m);

          }

          demo1(arrNew[0], arrNew[1], arrNew[2], arrNew[3]);

          demo1(...arrNew);

  // 5、与解构赋值结合

          var [a, ...arr1] = arrNew;

          // console.log(a, b, c, d);

          console.log(a, ...arr1);

  // 6、转化成真正的数组

          var str = "hello";

          var arrStr = Array.from(str);

          console.log(arrStr);

          console.log(...str);

          console.log([...str]);

        7.对象深拷贝  //只能深拷贝一层

         8.对象的合并  //后面覆盖前面

        9.利用循环和递归实现对象深拷贝

 4.箭头函数
 (1)基础语法
箭头函数不能用于构造函数

当函数参数只有一个,括号可以省略;但是没有参数时,括号不可以省略。

如果只有return,可以省略大括号和return

        // 无参

        var fn1 = function() {}

        var fn1 = () => {}

         // 单个参数

        var fn2 = function(a) {}

        var fn2 = a => {}

         // 多个参数

        var fn3 = function(a, b) {}

        var fn3 = (a, b) => {}

         // 可变参数

        var fn4 = function(a, b, ...args) {}

        var fn4 = (a, b, ...args) => {}

如果返回一个对象,需要特别注意,如果是单表达式要返回自定义对象,不写括号会报错,因为和函数体的{ ... }有语法冲突。

注意,用小括号包含大括号则是对象的定义,而非函数主体

x => {key: x} // 报错

x => ({key: x}) // 正确

(2)箭头函数基本特点 
1. 箭头函数this为父作用域的this,不是调用时的this

箭头函数的this永远指向其父作用域,任何方法都改变不了,包括call,apply,bind。

2. 箭头函数不能作为构造函数,不能使用new

        //如果用箭头函数作为构造函数,则如下

        var Person = (p) => {

            this.name = p.name;

        }

3.箭头函数没有arguments,caller,callee

4.箭头函数通过call和apply调用,不会改变this指向,只会传入参数

5. 箭头函数没有原型属性

6.箭头函数不能作为Generator函数,不能使用yield关键字

7.箭头函数返回对象时,要加一个小括号

        var func = () => ({ foo: 1 }); //正确

        var func = () => { foo: 1 };   //错误

      8.箭头函数在ES6 class中声明的方法为实例方法,不是原型方法

9.箭头函数就是一个高阶函数,相当于内嵌函数

5.symbol数据类型
        JavaScript有6中数据类型,分别是:String字符串类型;Number数字类型;Object对象类型;Boolean布尔值类型;Null空值;Undefined 未定义;

        Symbol的初衷:解决对象的属性名冲突

        let sm1 = Symbol('sm1')

        let sm2 = Symbol('sm2')

        sm1 === sm2  //结果:false

symbol永远都是独一无二的值

(1)属性名遍历
        当symbol类型的值作为属性名的时候,该属性是不会出现在for...in和for...of中的,也不会被Object.keys( )获取到。

(2)Object.getOwnPropertySymbols(对象)函数,返回数组
函数作用:找到symbol类型的属性并且返回一个数组,数组的成员就是symbol类型的属性值

(3)Reflect.ownKeys函数,返回所有类型数组
函数作用:返回所有类型的属性数组,包括symbol类型

(4)Symbol.for函数

函数作用:根据参数名,去全局环境中搜索是否有以该symbol.for()参数为名的symbol值,有就返回它,没有就以该参数名来创建一个新的symbol值。

(6)Symbol.keyFor函数

函数作用:返回一个已被登记在全局环境中的symbol值的key,没有就返回undefined。注意这句话的一个关键词:“被登记在全局环境中”,也就是说这个symbol值是被Symbol.for( )创建的,不是被Symbol( )创建的。

1、Symbol( )创建symbol值不会被登记在全局环境中供Symbol.for( )和Symbol.keyFor( )搜索;2、Symbol.keyFor( )函数在全局环境中找不到对应的symbol,就回返回undefined。
 

你可能感兴趣的:(javascript,前端,html,http,服务器)