preserve log什么意思_一些有意思的JavaScript代码片段

db1ce52f8064f96bcced8994631d0399.png

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.assignspread operator只做了一层浅拷贝,这意味着只有对象的第一层属性会被复制,如果某个属性是个嵌套的对象,那么只有引用会被复制,所以我们操作修改的对象的属性影响到了原来的对象。

所以在我们这个例子中copylocation属性将仍然指向原来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 === undefinedtrue

cd0d00fadeeede18d2bb52bb8e666d09.png

但是如果上面的代码在严格模式中执行的话,情况又不一样了,由于严格模式不允许创建全局变量所以这段代码会直接抛出异常。

提升

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~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速排序——Java

快排的思想想必大家都懂,前后两个指针,向中间靠拢。我这个partition函数能保证所有相同的数都被比较一次,靠拢在一起。 代码: public class Main { public static int[] partition1(int[] arr, int begin, int end, int pivotVal…

预处理器sass_Sass — Web的预处理器装饰

预处理器sass美学的重要性,其影响以及实现这一目标的工具。 (Importance of aesthetics, its impact, and tool to achieve it.) I remember as a child, every time I’d walk up to a bakery, I’d choose the pastries with the most beautiful toppings. Only a…

leetcode971. 翻转二叉树以匹配先序遍历(dfs)

给定一个有 N 个节点的二叉树,每个节点都有一个不同于其他节点且处于 {1, …, N} 中的值。 通过交换节点的左子节点和右子节点,可以翻转该二叉树中的节点。 考虑从根节点开始的先序遍历报告的 N 值序列。将这一 N 值序列称为树的行程。 (回…

【BZOJ3932】[CQOI2015]任务查询系统 主席树

【BZOJ3932】[CQOI2015]任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分。超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束&…

冲刺第一天

任务板 未开始 进行中已完成 刘晓杰:找回密码界面 页面风格优化 刘晓杰:滑动欢迎界面/加载界面 预计时间:5.5h 冯晨:找回密码功能 发布动态界面 冯晨&#xff…

杭电1003 java_杭电ACM1003题怎么理解?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼http://acm.hdu.edu.cn/showproblem.php?pid1003Max SumTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 99208 Accepted Submission(s): 22835Problem DescriptionGiven…

ubtunu打开firefox_如何在Firefox(在Lubuntu中)中打开“apt”链接?

问题描述Ask Ubuntu上的许多答案都直接指向在Ubuntu软件中心中在Xubuntu中打开的this之类的链接。在Lubuntu中,我收到此错误消息:在Firefox-Preferences中,应用程序看不到类似于apt的东西来关联程序等。在Chromium或Opera中打开相同的链接&am…

web api json_有关使用JSON Web令牌保护无服务器API的速成班

web api jsonWhat a mouthful of a title. Wouldn’t you agree? In this walkthrough you’ll learn about securing your Serverless endpoints with JSON web tokens.这么大的头衔。 你不同意吗? 在本演练中,您将学习如何使用JSON Web令牌保护无服务…

【python之路14】发送邮件实例

1、发邮件的代码 from email.mime.text import MIMETextfrom email.utils import formataddrimport smtplibmsg MIMEText(邮件内容,plain,utf-8)msg[from] formataddr([sunshuhai,25193qq.com])msg[to] formataddr([走人,252222222qq.com])msg[Subject] 主题server smtpli…

苹果内存取证工具volafox

2019独角兽企业重金招聘Python工程师标准>>> 苹果内存取证工具volafox volafox是一款针对苹果内存取证的专用工具。该工具使用Python语言编写。该工具内置了overlay data数据,用户可以直接分析苹果10.6-10.11的各种内存镜像文件。该工具提供28个子命令&a…

leetcode513. 找树左下角的值(dfs)

给定一个二叉树,在树的最后一行找到最左边的值。 代码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ class Solution {int maxL0,maxN0;pu…

Flutter实战视频-移动电商-45.详细页_说明区域UI编写

45.详细页_说明区域UI编写 pages/details_page/details_expain.dart 详情页面引用组件 效果展示: 最终代码: import package:flutter/material.dart; import package:flutter_screenutil/flutter_screenutil.dart;class DetailsExplain extends Stateles…

win10java怎么运行_win10系统电脑怎样才可以运行Java开发

展开全部安装jdk,jdk下载地址:网页链接 根据电脑系统选择对应版本。32/64安装时候,安装路径可以默认,也可以自己指定。我个人喜欢安装到非系统盘,比如D盘。jdk安装后,会弹出jre安装界面,路径同样…

HTTP服务器的本质:tinyhttpd源码分析及拓展

已经有一个月没有更新博客了,一方面是因为平时太忙了,另一方面是想积攒一些干货进行分享。最近主要是做了一些开源项目的源码分析工作,有c项目也有python项目,想提升一下内功,今天分享一下tinyhttpd源码分析的成果。ti…

monthdiff oracle_Oracle计算时间差函数

1、months_between(date1,date2) 返回两个日期之间的月份的差值(1)、如果两个日期月份内天数相同,或者都是某个月的最后一天,返回一个整数。否则,返回数值带小数select months_between(sysdate,addtime)as diff_month from test62、interval 时间间隔…

洛谷——P1290 欧几里德的游戏

P1290 欧几里德的游戏 题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的。给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然&#xff0c…

passport身份验证_了解如何使用Passport.js处理Node身份验证

passport身份验证by Antonio Erdeljac通过安东尼奥埃尔德雅克 了解如何使用Passport.js处理Node身份验证 (Learn how to handle authentication with Node using Passport.js) Support me by reading it from its original source: ORIGINAL SOURCE通过阅读原始来源为我提供支…

leetcode1448. 统计二叉树中好节点的数目(dfs)

给你一棵根为 root 的二叉树,请你返回二叉树中好节点的数目。 「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。 代码 /*** Definition for a binary tree node.* public class TreeNode {* int val;…

I/O模型系列之四:两种高性能IO设计模式 Reactor 和 Proactor

不同的操作系统实现的io策略可能不一样,即使是同一个操作系统也可能存在多重io策略,常见如linux上的select,poll,epoll,面对这么多不同类型的io接口,这里需要一层抽象api来完成,所以就演变出来两…

python中序列类型和数组之间的区别_「Python」序列构成的数组

一、Python 标准库的序列类型分为:容器序列:能够存放不同类型数据的序列(list、tuple、collections.deque)。扁平序列:只能容纳一种类型的数据(str、bytes、bytearray 和 array.array)。其中,容器序列存放的是它们所包含的任意类型…