引用类型和值类型
所有的基本类型都是值类型
传递的值
所有的复杂类型都是引用类型
传递的地址
<script>
// var n1 = 10;
// var n2 = n1;
// n2 = 3000;
// console.log(n1,n2);
// var obj1 = {name:"jack"}
// var obj2 = obj1;
// obj2.name = "rose";
// console.log(obj1,obj2);
// var obj1 = {name:"jack"}
// var obj2 = obj1.name;
// obj2 = "rose";
// console.log(obj1,obj2);
// function f1(s){
// //形参也相当于是局部变量,所以也要开空间
// s = 3000;
// }
// var n1 = 10;
// f1(n1);
// console.log(n1);//10
// function f2(s){
// s.age = 999;
// }
// var obj = {name:"kack", age:16}
// f2(obj)
// console.log(obj);
// function f3(s){
// s = { name:"rose",age:999 } //只要有大括号就会开辟新的空间
// }
// var obj = {name:"jack", age:16}
// f3(obj)
// console.log(obj); //jack 16
// function f4(s){
// s = 999; //只是改s自己空间,而不是它指向的空间 把开始存的地址改为999
// }
// var obj = { name:"jack", age:16 };
// f4(obj);
// console.log(obj);//jack 16
// function f5(s){
// s = 999;
// }
// var obj = { name:"jack", age:16 }
// f5(obj.age)
// console.log(obj.age); //16
function forEach(str){
str = str + "///"
}
var arr = [ 'abc','cba','nba'];
forEach(arr[0])
forEach(arr[1])
forEach(arr[2])
console.log(arr);//都是打印不加///的
</script>
字符串不可改 如果更改了 需要重新用变量名接受一下
浅拷贝
newarr=[...arr]
... 和find方法都是浅拷贝
如果arr是普通类型 那么值不会跟着变 如果是对象或数组就等于是引用,赋值 值会跟着变化
深拷贝
let aNewState=JSON.parse(JSON.stringify(state))
这是深拷贝 不会随着值得变化而变
undefined的产生
1.声明一个变量未赋值
2.想要获取一个对象上不存在的属性或方法
3.一个数组中没有被赋值的元素
ES6
let
let使js发生革命性的变化,让js由函数作用域变为了块级作用域,用let后作用域链不复存在,代码的作用域链以块级为单位
for循环里面 一个用var申明 一个用let申明
var data=[];
for(var i=0;i<3;i++){
data[i]=function(){console.log(i);
}
}
data[0]()
data[1]()
data[2]() 结果为 3 3 3
var data=[];
for(let i=0;i<3;i++){
data[i]=function(){console.log(i);
}
}
data[0]()
data[1]()
data[2]() 结果为 0 1 2
//如何快速将一个字符串翻转
let sTr="蓝忘机"
sTr=sTr.split('').reverse().join('')
console.log(sTr);
join() 方法用于把数组中的所有元素放入一个字符串。
元素是通过指定的分隔符进行分隔的。
参数 描述
separator 可选。指定要使用的分隔符。如果省略该参数,则使用逗号作为分隔符。