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,一经查实,立即删除!

相关文章

冲刺第一天

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

苹果内存取证工具volafox

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

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…

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

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

【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?...

简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特…

java object类的常用子类_Java中Object类常用的12个方法,你用过几个?

前言Java 中的 Object 方法在面试中是一个非常高频的点,毕竟 Object 是所有类的“老祖宗”。Java 中所有的类都有一个共同的祖先 Object 类,子类都会继承所有 Object 类中的 public 方法。先看下 Object 的类结构(快捷键:alt7):1.…

javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

一、ServletJSPJavaBean开发模式(MVC)介绍 ServletJSPJavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。 ServletJSPJavaBean模式程序各个模块之间层次清晰&…

Log4j配置详解

来自: http://www.blogjava.net/zJun/archive/2006/06/28/55511.html Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接keyvalue格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。1. 配置文件 …

java swing 串口_ComTest 接收串口数据,并显示在文本框内,通过JavaSwing实现 Develop 265万源代码下载- www.pudn.com...

文件名称: ComTest下载 收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 3157 KB上传时间: 2016-09-21下载次数: 0提 供 者: 韩坤详细说明:接收串口数据,并显示在文本框内,通过JavaSwing实现-Receive serial data, and displayed in the t…

SQL大圣之路笔记——PowerDesigner之新建table、view、proc

1. 新建table、view、proc 转载于:https://www.cnblogs.com/allenzhang/p/6305564.html

P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

对于一个牛,它存在两种状态:1.处于联通分量 2.不处于联通分量。对于处于联通分量的牛,求出联通分量的大小;对于不处于联通分量的牛,求出其距离联通分量的路程联通分量大小。 不同的联通分量,染上不同的颜色…

ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)

开发工具:VS2015(2012以上)SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 日程管理 http://www.cnblogs.com/ymnets/p/7094914.html 任务调度系统界面 http://www.cnblogs.com/ymnets/p/5065154.h…

【FRDM-K64F学习笔记】使用ARM mbed和Keil MDK下载你的第一个程序

FRDM-K64F开发平台采用MK64FN1M0VLL12微控制器。该控制器包含一个带有浮点单元的ARM Cortex-M4内核。其最高工作频率为120MHz,具有256KB的RAM、1MB闪存以及许多其他外设。它非常适合大多数可以采用以太网、SD卡存储以及板载模拟-数字转换器的IoT应用。但是&#xff…

php 实时更新内容_亿级视频内容如何实时更新?优酷视频背后的技术揭秘

简介: 优酷视频内容数据天然呈现巨大的网络结构,各类数据实体连接形成了数十亿顶点和百亿条边的数据量,面对巨大的数据量,传统关系型数据库往往难以处理和管理,图数据结构更加贴合优酷的业务场景,图组织使用…

物联网商机迸发 LPWAN芯片现身 本文转自d1net(转载)

联发科技发表首款NB-IoT系统单芯片MT2625。来源:MediaTeK 物联网(IoT)带动的庞大商机吸引各方业者积极投入,尤其是各种联网技术不断现身,争夺各式各样极富发展潜力的应用领域。 根据IDC的调查报告,物联网市场在2017年声势看涨&…

jquery之stop()的用法

工作中遇到过的实际案例: 1、我在项目里做的一个下拉菜单,当鼠标移上去的时候就菜单显示,当鼠标离开的时候菜单隐藏 如果我快速不断地将鼠标移入移出菜单(即,当菜单下拉动画未完成时,鼠标又移出了菜单&…

学会这二十个正则表达式,能让你少些1000行代码!

正则表达式,是一个强大且高效的文本处理工具。通常情况下,通过一段表达准确的表达式,能够非常简短、快速的实现复杂业务逻辑。因此,正则表达式通常是一个成熟开发人员的标配,可以辅助实现开发效率的极强提升。在需要实…

为啥JAVA虚拟机不开发系统_理解Java虚拟机体系结构

1 概述众所周知,Java支持平台无关性、安全性和网络移动性。而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操作系统是什么。正是得益于Java虚拟机,它号称的“一次编译,到处…