JavaScript 中一些小坑

来源:互联网 发布:华为云计算hcie 编辑:程序博客网 时间:2024/06/06 02:47

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

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

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

let a = 0;let b = false;console.log(a == b);     //=>true,  返回trueconsole.log(a === b);    //=>false, 返回false

另:对象跟数组的相等判断并不在于表面的名/值对,而在于它们指向的内存和地址

let x = { name: xiao, password: 123};let y = { name: xiao, password: 123};let z = x;console.log(x == y);      //=>falseconsole.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'];


全局变量 和 局部变量

1、局部变量在函数体内优先级高于同名全局变量,  

     局部变量在声明它们的函数体内任意一个地方均有定义

var scope = "global";function one(){    console.log(scope);    //=> "undefined"    var scope = "lobal";   //局部变量在这里赋初始值,但变量在函数体内任意地方均有定义    console.log(scope);    //=> "lobal"}






原创粉丝点击