25.Symbol目的:为了解决对象之间属性名冲突的问题,Symbol它是引用数据类型。
Symbol( ),它代表着一个独一无二的值
[name]: '小红',//加中括号代表默认创建了一个Symbol类型 let name = Symbol();
let name = SymboL();
let person = {};
person.name = "张三” ;
person[ name ];
//结果: undefined
person['name' ]; //结果:张三
person . name ;
//结果:张三
person[‘name’]的意思的person[name]是 let name=Symbol()类型转化为普通类型的意思 person.name="张三"
26. Object.getOwnPropertySymbols函数
Object.getOwnPropertySymbols()可以拿所有symbol类型的键。
//定 义两个symbo 1类型的变量name, age
let name = SymboL(”name" );
let age = SymboL(" age");
let person = {
[name ]:"张三”,//symbol类型
[age]:12
//symbol类型
};
object. getOwnPropertySymbols (person);
//结果: [Symbol(name), Symbol(age)]
Reflect.ownKeys函数
Reflect.ownKeys()可以获取对象所有的属性。
//定义一个对象,含有两种类型的属性
let person = {
[ Symbol( ' name ' )]:"张三”,
age" : 21
};
Ref lect . ownKeys (person) ;
//结果: [”age", Symbol(name) ]
27.Symbol.for函数
函数作用:根据参数名,去全局环境中搜索是否有以该symbol.for()参数为名的symbol值,有就返回它,没有就以该参数名来创建一个新的symbol值。是全局的let
let n1 = Symbol. for(' name' ) ;
let n2 = Symbol. for( 'name' );
console. log(n1 === n2) ;
//结果: true
Symbol( )和Symbol.for()的区别:
Symbol.for( )创建的symbol值会被登记在全局环境中,供以后用Symbol.for( )来搜索,而Symbol( )创建的变量就没有这样的效果了,它是局部的不是全局的。
Symbol.keyFor函数
函数作用:返回一个以被登记在全局环境中的symbol值的key,没有就返回undefined。注意这句话的一个关键词:“被登记在全局环境中”,也就是说这个symbol值是被Symbol.for( )创建的,不是被Symbol( )创建的。
Symbol类型,Object.keys( )和for...in for...of都无法获取到它。
28.for…of使用
var arr = [1,2,3,4,5];
for( let value of arr){
console. log(vaLue);
//打印结果:依次输出:12345
for...of的优势:
1. 写法比for循环简洁很多;
2. 可以用break来终止整个循环,或者continute来跳出当前循环,继续后面的循环;
结合keys( )获取到循环的索引,并且是数字类型,而不是字符串类型。
循环可以终止
var arr = [1,2,3,4,5];
for(let vaLue of arr){
if (value == 3){
//终止整个循环
break ;
console. log( value);
//打印结果: 1 2
以上案例:用break实现了终止整个循环,不会继续后面的遍历,所以打印结果为:1 2。
可以跳过当前循环:
var arr = [1,2,3,4,5];
for(let value of arr){
if (value == 3){
//跳过当前循环,继续后面的循环
continue ;
console. log(value);
}
//打印结果: 1 2 4 5
用continue跳过当前循环,继续后面的循环,所以打印结果为:1 2 4 5。
得到数字类型索引
var arr = [1,2,3,4,5];
for(let index of arr .keys()){
console. log ( index);
//打印结果:依次输出:0 1 2 3 4
使用数组的扩展keys( ),获取键名再遍历,得到的index是数字类型的。
此外,相比于for...in循环专门为对象设计,for...of循环的适用范围更广。
遍历字符串
for...of 支持字符串的遍历。
let word=“我是前端君";
for(let W of word){
console. log(w);
//打印结果:我 是 前 端 君
遍历DOM list
for...of支持类数组的遍历,例如DOM List。
<p>1</p>
<p>2</p>
<p>3</p>
//假设有3个p元素
let pList = document . getE lementsByTagName('p ' );
for(let p of pList){
console.1og(p);
}
//打印结果: <p>1</p> // <p>2</p> //<p>3</p>
for...of支持set和map解构的遍历,
for...in、for...of和for...each()区别:
for-of()会获取到数组的每一个的值,更适合于数组对象,不要用于对象。可以使用 break, continue 和 return。
根据of后边的参数来绝定拿到的是string或者number类型。也支持字符串的遍历
var arr=[1,2,3,4,5]
var obj={
key1:'value1',
key2:'value2',
key3:'value3',
key4:'value4',
}
var arObj=[
{k11:'value11'},
{k22:'value22',k21:'value21'},
{k33:'value33',k32:'value32',k31:'value31'},
]
for(var i in arr){
console.log(i)
}
for(var i in obj){
console.log(i)
}
for(var i of arObj){
console.log(i)
} for-in()会获取到数组的下标、会获取到对象的key值。所以for in更适合遍历对象,不要使用for in遍历数组,拿到i是字符串类型。
var arr=[1,2,3,4,5]
var obj={
key1:'value1',
key2:'value2',
key3:'value3',
key4:'value4',
}
for(var i in arr){
console.log(i)
}
for(var i in obj){
console.log(i)
}
forEach()方法 用于调用数组的每个元素,并将元素传递给回调函数。 注意: forEach() 对于空数组是不会执行回调函数的。 array.forEach(function(currentValue, index, arr), thisValue)
参数1:function(currentValue, index, arr) 必需。 数组中每个元素需要调用的函数。 参数2: thisValue 可选。传递给函数的值一般用 "this" 值。
如果这个参数为空, "undefined" 会传递给 "this" 值
<body>
<button onclick="numbers.forEach(myFunction)">点我</button>
<p>数组元素总和:<span id="demo"></span></p>
</body>
<script>
var sum = 0;
var numbers = [65, 44, 12, 4];
function myFunction(item) {
sum += item; demo.innerHTML = sum;
}
</script>
</script>