A recent tweet包含这段 JavaScript 代码。
有人可以逐步解释其中发生的事情吗?
> function dis() { return this }
undefined
> five = dis.call(5)
Number {[[PrimitiveValue]]: 5}
> five.wtf = 'potato'
"potato"
> five.wtf
"potato"
> five * 5
25
> five.wtf
"potato"
> five++
5
> five.wtf
undefined
> five.wtf = 'potato?'
"potato?"
> five.wtf
undefined
> five
6
特别是我不清楚:
dis.call(5) 的结果是一个带有某种 [[PrimitiveValue]] 属性的 Number,但是five++ 和 five * 5 的结果似乎只是普通数字 5 和 25(不是 数字s)five.wtf 属性在 five++ 递增后消失five++ 增量之后 five.wtf 属性甚至不再可设置,尽管 five.wtf = 'potato?'赋值显然设置了值。最佳答案
在这里。在 Stack Overflow 上看到这个很有趣 :)
在逐步了解行为之前,澄清一些事情很重要:
Number value和 Number object (a = 3 与 a = new Number(3)) 非常不同。一个是原始的,另一个是对象。您不能将属性分配给基元,但可以分配给对象。
两者之间的强制是隐含的。
例如:
(new Number(3) === 3) // returns false
(new Number(3) == 3) // returns true, as the '==' operator coerces
(+new Number(3) === 3) // returns true, as the '+' operator coerces
每Expression有返回值。当REPL读取并执行一个表达式,这就是它显示的内容。返回值通常并不代表您的想法,而是暗示不正确的事情。
好的,我们开始吧。
> function dis() { return this }
undefined
> five = dis.call(5)
[Number: 5]
定义一个函数dis和call它与 5。这将以 5 作为上下文 (this) 执行函数。在这里,它被从 Number 值强制转换为 Number 对象。值得注意的是,我们在 strict mode 这不会发生。
> five.wtf = 'potato'
'potato'
> five.wtf
'potato'
现在我们将属性five.wtf设置为'potato',以5为对象,果然接受Simple Assignment .
> five * 5
25
> five.wtf
'potato'
以 five 作为对象,我确保它仍然可以执行简单的算术运算。它可以。它的属性是否仍然存在?是的。
> five++
5
> five.wtf
undefined
现在我们检查五++。 postfix increment 的诀窍是整个表达式将根据原始值评估然后增加值。看起来 five 仍然是 5,但实际上表达式计算为 5,然后将 five 设置为 6。
5 不仅被设置为 6,而且还被强制转换为 Number 值,并且所有属性都丢失了。由于原语不能保存属性,five.wtf 是未定义的。
> five.wtf = 'potato?'
'potato?'
> five.wtf
undefined
我再次尝试将属性 wtf 重新分配给 five。返回值暗示它会粘住,但实际上并没有,因为 five 是一个 Number 值,而不是 Number 对象。该表达式的计算结果为 'potato?',但是当我们检查时,我们发现它没有被赋值。
> five
6
自从后缀增加以来,5 一直是6。
关于javascript - 这段代码中发生了什么,Number 对象持有属性并递增数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38637003/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val