ECMAScript
函数参数的默认值
ES6允许给函数参数赋值初始值
特性:
1.形参初始值,具有默认值的的形参,一般位置要靠后(潜规则)
2.可以与解构赋值一起使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=
, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 1.形参初始值,具有默认值的的形参,一般位置要靠后(潜规则)
// 当没有传递给c实参时,c会默认等于10
/* function add(a, b, c = 10) {
return a + b + c;
};
//c没有初始值,且没有对应c的实参,c就是undefined的,然后1+2+undefined就等于NaN
let res = add(1, 2); //NaN
console.log(res); */
// 2.可以与解构赋值一起使用
/* function connect(options) {
let host = options.host;
let username = options.username;
let password = options.password;
let port = options.port
}; */
// 同名赋值
function connect({
host = '127.0.0.1', //当host没有传,就可以使用初始值
username,
password,
port
}) {
console.log(host);
console.log(username);
console.log(password);
console.log(port);
};
connect({
// host: 'localhost',
username: 'oot',
password: 'root',
port: 3306
})
</script>
</body>
</html>
rest参数
ES6引入rest参数,用于获取函数的实参,用来代替arguments
rest参数必须放到参数最后
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// ES5获取实参的方式——arguments
/* function func() {
console.log(arguments);//是一个数组对象,是对象,不是数组
};
func(1, 2, 3, 4); */
// ES6获取实参的方式——rest
// args是自定义的
/* function func(...args) {
console.log(args); //是一个数组,所以可以使用数组API的方法,如:filter,map,some等等
}
func(1, 2, 3, 4); */
// res:存放剩余的参数,形成一个数组
function fun(a, b, ...res) {
console.log(a);
console.log(b);
console.log(res);
}
fun(1, 2, 3, 4, 5, 6, 7)
</script>
</body>
</html>
扩展运算符
[…]:扩展运算符能将[数组]转换为逗号分隔的[参数序列]
rest参数是放在形参里面,扩展运算符是放在实参里面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
//声明一个数组
const goods = ['香蕉', '草莓', '葡萄', '苹果'];
// 声明一个函数
function changed() {
console.log(arguments);
// return arguments
};
// const res = changed(...goods);
// console.log(res[0]);
changed(...goods); //changed('香蕉', '草莓', '葡萄', '苹果')
</script>
</body>
</html>
扩展运算符的应用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div></div>
<div></div>
<div></div>
<script>
// 1.数组合并
/* const arr1 = ['孙悟空', '猪八戒', '沙和尚', '唐僧'];
const arr2 = ['白骨精', '蜘蛛精', '蛇精', '妖精'];
// 合并两个数组
// const res = arr1.concat(arr2);
const res = [...arr1, ...arr2];
console.log(res); */
// 2.数组的克隆
/* const arr1 = ['孙悟空', '猪八戒', '沙和尚', '唐僧'];
// 里面是引用数据类型的话,也是浅拷贝(拷贝引用地址,会互相影响)
const res = [...arr1]; //['孙悟空', '猪八戒', '沙和尚', '唐僧']
console.log(res); */
// 3.将伪数组转为真正的数组
const divs = document.querySelectorAll('div');
console.log(divs); //伪数组,不可使用数组的API
const divsArr = [...divs];
console.log(divsArr); //可以使用数组的API
</script>
</body>
</html>
Symbol基本使用
ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是Javascript语言的第七种数据类型,是一种类似于字符串的数据类型
特点:
1.symbol的值是唯一的,用来解决命名冲突的问题(作唯一标识的)
- symbol值不能与其他数据进行运算
- symbol定义的对象属性不能使用for…in循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 创建
let s = Symbol();
console.log(typeof s); //symbol
let s2 = Symbol('zs');
let s3 = Symbol('zs');
console.log(s2 === s3); //false;s2和s3只是一个编号,内容是一样的,但是编号的不一样的,
// 比如身份证,人名是一样,但是身份证号不一致
// 2.创建(函数对象),登记在全局供搜索
let s4 = Symbol.for('ls');
let s5 = Symbol.for('ls');
console.log(s4 === s5); //true
// 1.不能与其他数据进行运算
let res = s + 100;
console.log(res); //报错:Uncaught TypeError: Cannot convert a Symbol value to a number
</script>
</body>
</html>
js的数据类型:USONB
U:undefined
S:String、Symbol
O:Object
N:null
B:Boolean
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 向对象中添加方法
let obj = {};
// 先声明一个对象
let methods = {
up: Symbol(),
down: Symbol()
};
// 1.添加方式,很安全,不会与原有的同名属性冲突
/* obj[methods.up] = function() {
console.log("我要努力的往上爬");
};
obj[methods.down] = function() {
console.log("我可以快速的向下滚");
};
// 调用
obj[methods.up](); */
let game = {
name: '王者荣耀',
[Symbol('king')]: function() {
console.log('王者段位');
},
[Symbol('lower')]: function() {
console.log('菜鸟级别');
}
}
console.log(game);
</script>
</body>
</html>
Symbol的内置值
除了自己定义的Symbol值之外,ES6还提供了11个内置的Symbol值(Symbol的属性),指向语言内部使用的方法
这些内置都当做对象的属性存在