Sayı değişmez çağıran üye işlev
Edebi işlevleri çağırmak için çalışıyorum, ama garip davranış alıyorum.
true
döndüren bu kodu göz önünde bulundurun.
23 === (23)
Ben yazarken şunları deneyin.
(23).toFixed(2)
Çalıştığımda _23.00_
23.toFixed(2)
Bu hata alıyorum beklenen sonuç alıyorum.
SyntaxError: Unexpected token YASADIŞI
Nasıl JavaScript bu anlayamıyorum ifadeleri değerlendiriyor ve neden bu hatayı alıyorum?
CEVAP
Cevapları Greg Hewgill icktoofay doğru tüm yollar, ancak, istiyorum eğil biraz, soyutlama-bilge: Bakalım neler oluyor göre javascript şartname.
Spec Section 7.8.3 sayısal sabitler tanımlar. Aşağıdaki görebiliriz
DecimalLiteral ::
DecimalIntegerLiteral . DecimalDigits(opt) ExponentPart(opt)
. DecimalDigits ExponentPart(opt)
DecimalIntegerLiteral ExponentPart(opt)
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits(opt)
DecimalLiteral
, bir numara, bir demet ondalık basamak, muhtemelen ardından bir nokta, muhtemelen ardından diğer basamak (tüm ihraç edilebilir ve ardından bir üs, e12
örneğin). Diğer bir deyişle, 42.
yasal 42
eşit 3e2
300
eşittir.
Not nasıl eğer bir nokta var, biz de bunu daha fazla rakam/üs izledi olmasını bekliyoruz, ya da hiçbir şey tarafından izlenmesi. Ancak, bu önemli bir parçasıdırnokta sayısının parçasıdır. Nokta operatörü, obj.prop
, ele nasıl bakmak için ilerlerken, bu hatırlıyorum.
Section 11.2.1, Property Accessors üye erişim için nokta ve ayraç açıklar:
MemberExpression . IdentifierName
CallExpression
umurumuzda değil hangi işlevini çağırır. MemberExpression
bir daha bekliyoruz nasıl 27 ** - ama bunun için benim sözüme etmeyin, bak ve doğru olup olmadığımı bir olabilir) dikkat edin.
Küçük noktayı görüyor musunuz? Mantıksal öne atlayıp "Evet, düzeni bir nokta var...4.foo
...neden bir hata var?" bir nokta var demek Kullandığım kimin bu cümleler, unuttun varsayımsal arkadaşım ne yazık ki benim DecimalLiteral
ne kadar benziyor! Hadi iki örnek üzerinden gitmek ve ne olduğunu görün.
42.foo
^
Şapka yapıyoruz karakteri temsil eder. Şimdiye kadar, DecimalLiteral / DecimalIntegerLiteral / NonZeroDigit
(bunu söylemesi zor) içindeyiz. Sonraki karaktere geçelim:
42.foo
^
Hala numarasını parçası, mükemmel geçerli bir DecimalDigit
.
42.foo
^
Tamam, bu yüzden DecimalIntegerLiteral
kısmı bitti. İşte düzeni aynı diyagram:
DecimalIntegerLiteral . DecimalDigits(opt) ExponentPart(opt)
^
Bir sayının son derece geçerli bir parçası olan bir nokta, yani yapıyoruz. Şimdi biz tüketmeknumarasının bir parçası olarakve devam:
42.foo
^
f
sayı azalıyor ExponentPart
DecimalDigits
ne de bölümü şimdi de. Eee, ne olacak şimdi? f
bu ne? Hiçbir şeyin parçası değil. Belki bir erişimci özelliği var mı? Hadi düzeni bir göz atın:
MemberExpression . IdentifierName
^
MemberExpression
, kesinlikle değiliz ama nokta zaten numarasının bir parçası olduğunu takip eden bir nokta yok. Sözdizimsel bir hata ulaştık: biz yürütme kes ve at. Umarım camdan bir evde yaşamıyorsun.
Umarım şimdi 42..foo
neden çalıştığını anlamak. MemberExpression
dışarı çıktığımızda başka bir nokta karşı karşıyayız:
42..foo
^
MemberExpression . IdentifierName
^
IdentifierName
tamamen yasal izledi.
Elbette numarasından nokta ayırmak için birkaç başka yolları da var. Sen gelene kadar bir şekilde, gerçek surround parantez: (42).foo
. Parantez sonuna vardığımızda, nokta MemberExpression
ve geldik. Başka bir yol eklemek için bir alan: 42 .foo
beri bir uzay parçası olamaz ve çözümleyici için nötr bir renk, bir hata yükseltmek istemiyorum.
jQuery belge.hazır vs kendini çağıran ...
Bir tam sayı dört milyar verilmiş olan...
Nasıl Python bir sayı KADAR yuvarlak m...
bir dönüştürme .net İşlev<T&; gt iç...
.NET Çerçeve: Rastgele sayı üreteci ür...