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。