“==” 和 “===” 的区别
“==” :相等运算符,用来检测两个操作数是否相等,这里的“相等”定义非常宽,可以允许两个操作数进行类型转换。
“===”:恒等运算符,用来检测两个操作数是否严格相等,不允许两个操作数进行类型转换。
let a = 0;
let b = false;
console.log(a == b); //=>true, 返回true
console.log(a === b); //=>false, 返回false
另:对象跟数组的相等判断并不在于表面的名/值对,而在于它们指向的内存和地址
let x = { name: xiao, password: 123};
let y = { name: xiao, password: 123};
let z = x;
console.log(x == y); //=>false
console.log(x == z); //=>true
变量 x 跟变量 y 虽然看起来完全一样,但是它们指向的内存和地址并不一样,而把变量 z = x,则使得变量 z 指向跟变量 x 一样的内存和地址。
浅拷贝与深拷贝
上面例子中的 z = x 使得变量 z 指向跟变量 x 一样的内存和地址,于是,当变量 z 改变的时候,变量 x 也随之改变,这就是也叫浅拷贝。
x = { name: xiao, password: 123 };
z = x;
z.password = 456;
console.log( z ); //=> { name: xiao, password: 456};
console.log( x ); //=> { name: xiao, password: 456}
若要使得变量 z 获得跟变量 x 一样的名/值对,且变量 x 不随变量 z 的改动而变化,则需要使用深拷贝。
方法一:
x = { name: xiao, password: 123 };
z.name = x.name;
z.password = x.password;
z.password = 456;
console.log( z ); //=> { name: xiao, password: 456};
console.log( x ); //=> { name: xiao, password: 123};
这样就是做到获取到和变量 x 一样的名/值对之后,可变却不干扰变量 x 。数组同理。
方法二:
//对象的深拷贝
x = { name: xiao, password: 123 };
z = {};
for(var key in x){
z[key] = x[key]
}
console.log( z ); //=> { name: xiao, password: 123 };
//数组的深拷贝
arr = ['one','two','three'];
myArr = arr.slice(0);
console.log( myArr ); //=> ['one','two','three'];
/* array.slice(start,end) 返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素 */
全局变量 和 局部变量
1、局部变量在函数体内优先级高于同名全局变量,
局部变量在声明它们的函数体内任意一个地方均有定义
var scope = "global";
function one(){
console.log(scope); //=> "undefined"
var scope = "lobal"; //局部变量在这里赋初始值,但变量在函数体内任意地方均有定义
console.log(scope); //=> "lobal"
}