delete (          )

delete (          )

;var  n = new Number( 1 )

console.log( n + 1 )   // 2  #请在括号内填写两行语句使得其结果为 11

-----------------------------------------------------------------------------------------------

var obj = {        }

console.log( obj + obj ) // [[object ...]...]   #请为obj添加一个属性使得结果为 2

------------------------------------------------------------------------------------------------------

上面这是啥?

写到这的时候特别想灌点水烘托出高大上的氛围,至少来两段文字波澜不惊地铺垫一下,可惜没有多余的脑细胞贡献在咬文嚼字上了,还是直奔主题吧。。

为了更好地回答上面两个问题,需要读者对JavaScript原型的本质有一个较为清晰的认识,如果你很久没有脑补过原型链在对象间穿梭的画面了,非常推荐去看下鄙人另一篇拙文:

  ------从原型链探究JavaScript这么火的原因------

首先请忽略文章标题挂羊头卖狗肉的成分,这里我想分享的是在加法操作符下js对象的具体表现:

  对象在做加法操作时首先会默认沿着原型链寻找 valueOf 方法(数字对象的valueOf仍旧返回数字类型),在任何一级原型对象找到此方法都会返回结果,可以通过下面代码得到论证:

  var f = function () {}
  f.prototype.valueOf = () => 1
  var obj = new f()
  console.log( obj + 1 ) // 2
  
  由于我已经在此实例对象的构造函数的原型里写入了 valueOf 这一方法,因此,obj在它的上一级原型就找到结果 1 并返回了。
  
  那假如沿着原型链一直寻找都没有 valueOf 方法可用,怎么办呢?这时候数字对象 Number 就会启用 toString 方法,返回一个字符串类型。看到这里的朋友可能会心一笑,原来窍门在这里,用 delete 解除原型链上所有 valueOf 方法的链接,上面那两道填空题岂不就迎刃而解了。
 
  为了解决上面两道填空题,我们不得不去寻找对象的顶级原型究竟在哪里,看过鄙人拙文的朋友应该很快就能反应过来,并填写:
 
  delete Object.prototype.valueOf
  delete Function.prototype.valueOf
 
  这样填写你会发现结果仍旧是 2 ,首先这里有两个误区,第一个误区是,虽然 Number 这个构造函数对象是由 Function 构造而来,然而它的 valueOf 方法并不是通过继承 Function 原型而来,事实上 Function 的原型里我只发现有 toString 这个方法:
 
   Number.prototype.hasOwnProperty( 'valueOf' ) // true
   Function.prototype.hasOwnProperty( 'valueOf' ) // false
  
  另一个误区是,obj 根本就不会继承 Function 的原型,这一话题我在 从原型链探究JavaScript这么火的原因 这篇文中已经提过,虽然原型链理论上会使所有实例对象也继承 Function 的原型,但 JavaScript 为了能在逻辑上修正这一‘错误’,在原型链的顶级和第二级间修改了继承规则,使得所有函数对象和实例对象采取了新的继承方法。
 
  此时,第一题的答案也就呼之欲出了:
  
  delete Object.prototype.valueOf
  delete Number.prototype.valueOf 
 
  对于第二题而,看过我在原型链中那篇文提到的继承规则,答案也是不言而喻:
  
  obj = {  valueOf : () => 1  }
 
  大家还有什么别的问题,欢迎给我留言一起讨论,转载请注出。。
  
 

JavaScript如何让1+1=11;{ } + { } = 2的更多相关文章

  1. 深入理解javascript原型和闭包(11)——执行上下文栈

    继续上文的内容. 执行全局代码时,会产生一个执行上下文环境,每次调用函数都又会产生执行上下文环境.当函数调用完成时,这个上下文环境以及其中的数据都会被消除,再重新回到全局上下文环境.处于活动状态的执行 ...

  2. 每日分享!JavaScript的鼠标事件(11个事件)

    鼠标的11个事件 具体的事件解释如下: click:按下鼠标(通常是按下主按钮)时触发. dblclick:在同一个元素上双击鼠标时触发. mousedown:按下鼠标键时触发. mouseup:释放 ...

  3. Javascript 笔记与总结(1-1)作用域

    以语言的角度学习 Js 的底层原理(与 DOM 无关):① 作用域链 ② 词法分析 ③ 闭包 ④ 面向对象(原型链) ① 作用域链 例1 <script> var c = 5; funct ...

  4. ArcGIS API for JavaScript 4.2学习笔记[11] 官方第五章Popups(弹窗)概览与解释

    直接跳过第三第四章了,第三章Layer和第四章可视化,怎么说呢,Layer是组织数据的,是Map的属性之一.可视化属于符号化编程,暂时不看. 第五章是对数据.结果的显示,类似于alert()..NET ...

  5. 对于JavaScript的函数.NET开发人员应该知道的11件事

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天小感冒今天重感冒,也不能长篇大论.如果你是.NET开发人员,在进入前端开发领域的时候,对 ...

  6. 翻译连载 | 第 11 章:融会贯通 -《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...

  7. JavaScript中String对象的方法介绍

    1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...

  8. 深入理解javascript原型和闭包 (转)

    该教程绕开了javascript的一些基本的语法知识,直接讲解javascript中最难理解的两个部分,也是和其他主流面向对象语言区别最大的两个部分--原型和闭包,当然,肯定少不了原型链和作用域链.帮 ...

  9. 深入理解javascript原型和闭包系列

    从下面目录中可以看到,本系列有16篇文章,外加两篇后补的,一共18篇文章.写了半个月,从9月17号开始写的.每篇文章更新时,读者的反馈还是可以的,虽然不至于上头条,但是也算是中规中矩,有看的人,也有评 ...

随机推荐

  1. 七、Linux的权限命令

    1. 文件权限 r:对文件是指可读取内容 对目录是可以ls w:对文件是指可修改文件内容,对目录 是指可以在其中创建或删除子节点(目录或文件) x:对文件是指是否可以运行这个文件,对目录是指是否可以c ...

  2. Mysql数据字典导出

    1.phpmyadmin中自带的数据字典导出 2.利用下面的脚本: <?php /** * 生成mysql数据字典 */ header("Content-type: text/html ...

  3. python dict to dataframe

    http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.from_dict.html Examples By de ...

  4. Vmware网络不可达

    1. ifconfig -a   查看当前的网卡 2. cd  /etc/sysconfig/network-scripts/ 3. 打开对应网卡名称文件, 具体修改内容参考(https://www. ...

  5. centos7 下安装mysql教程

    最近要在centos服务器上配置环境,在部署mysql的时候,碰到各种各样的问题,网上博客文章也是有各种坑,目前发现一个比较好的博客: https://blog.csdn.net/xiaomojun/ ...

  6. .NetCore多文件上传进度的示例

    主要讲的内容有: 1-----form方式上传一组图片 2-----ajax上传一组图片 3-----ajax提交+上传进度+一组图片上传 4-----Task并行处理+ajax提交+上传进度+一组图 ...

  7. Linux:Red Hat系统的安装

    今天高兴,所以我写这一期,这一期写的是Red Hat系统的安装,这个开发系统也是红帽企业制作出来的,关于这款系统的相关资料就自行百度吧!话不多说,直接进入这期的内容吧! 安装Red Hat系统 系统下 ...

  8. 《A Knowledge-Grounded Neural Conversation Model》

    abstract 现在的大多数模型都可以被应用在闲聊场景下,但是还没有证据表明他们可以应用在更有用的对话场景下.这篇论文提出了一个知识驱动的,带有背景知识的神经网络对话系统,目的是为了在对话中产生更有 ...

  9. JAVA服务cpu占用高排查

    最近线上机器偶尔有台cpu达到100%,还居高不下.同样负载的其他机器却正常,我想肯定是代码哪里有问题了 首先我们top看下 可定位到对应占用高的PID 然后=>ps -mp PID -o TH ...

  10. ubuntu安装ssh-service出现无法依赖的解决

    (1)首先先确认下ubuntu系统是否已经安装ssh(通常ubuntu中默认是安装的) 通过命令进行查看:$dpkg -l | grep ssh这里我们可以看到,系统显示已经安装了openssh-cl ...