JavaScript 中遇到的一些小坑

“==” 和  “===” 的区别

==”  :相等运算符,用来检测两个操作数是否相等,这里的“相等”定义非常宽,可以允许两个操作数进行类型转换。

===”:恒等运算符,用来检测两个操作数是否严格相等,不允许两个操作数进行类型转换。

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"
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值