商城网站建设需求文档,游戏网站怎么做seo,微信开发小程序教程,百丽鞋业网站建设Javascript是一门很灵活的语言#xff0c;我们可以使用它动态地实现各种各样的功能。但是动态带来便利的同时#xff0c;也存在一些令人费解的行为#xff0c;稍不注意就会进入误区一个接着一个的坑。虽然我使用JavaScript的时间还不算长#xff0c;也是遇到了一些有意思的…Javascript是一门很灵活的语言我们可以使用它动态地实现各种各样的功能。但是动态带来便利的同时也存在一些令人费解的行为稍不注意就会进入误区一个接着一个的坑。虽然我使用JavaScript的时间还不算长也是遇到了一些有意思的场景一开始百思不得其解弄清楚之后又让我哭笑不得。现在就来跟大家一起分享一下。语法糖带来的浅拷贝先来预测一下下面代码的输出内容const user {name: zong,location: {city: Shanghai,state: Shanghai}
};
const copy Object.assign({}, user);
// 或者
// const copy { ...user };
copy.location.city Suzhou;
console.log(original: , user.location);
console.log(copy:, copy.location);
输出结果应该是original: {city: Shanghai,state: Shanghai
}
copy: {city: Shanghai,state: Shanghai
}
咦为什么操作复制的对象会修改原来的对象呢这是因为Object.assign跟spread operator只做了一层浅拷贝这意味着只有对象的第一层属性会被复制如果某个属性是个嵌套的对象那么只有引用会被复制所以我们操作修改的对象的属性影响到了原来的对象。所以在我们这个例子中copy的location属性将仍然指向原来user对象对应的location属性。JavaScript从右向左赋值的行为function display() {var a b 10;
}display();console.log(b, typeof b undefined);
console.log(a, typeof a undefined);
输出是b false
a true
这是因为JavaScript赋值操作符是从右向左的这意味着我们的赋值操作也是从右向左来的手先b会被赋值10然后它被赋给了a。所以function display() {var a b 10;
}
等同于function display() {b 10;var a b;
}
所以b没有用var声明成了一个全局变量所以在外部可以被访问到而a只是个局部变量所以外部会打印出a undefined为true。但是如果上面的代码在严格模式中执行的话情况又不一样了由于严格模式不允许创建全局变量所以这段代码会直接抛出异常。提升var num 8;var display function () {console.log(num);var number 20;
};display();
猜猜这里的输出结果是什么它不是8而是undefined这又是为什么这是因为JavaScript里面有个现象叫提升。提升是JavaScript中把变量声明移到当前作用域最顶部的一种行为。所以上面的代码可以转换成如下var num 8;var display function () {var num;console.log(num);num 20;
};display();
我们可以看到只有声明被移到了函数的最顶端而赋值操作还在原地所以这边num由于还未赋值会打印出undefined。delete的作用对象const num 1;const result (function () {delete num;return num;
})();console.log(result);
这边的代码不会报出任何错因为我们是在number类型上使用的delete它还是会打印出1。The delete操作符被用来删除一个对象的属性在这儿num并不是一个对象所以它会返回这个变量对应的值也就是1。const num 1;const result (function (num) {delete num;return num;
})(10);console.log(result);
上面的代码将输出10。这边我们把10作为参数传给函数同样地delete在这里对原始类型也不起作用所以会照常打印出10。好啦今天的分享就到这里啦主要是在使用JavaScript的过程中可能会经常遇到的一些细节问题希望能给大家带来一丢丢的收获happy coding~