Hacker News new | past | comments | ask | show | jobs | submit login
Valid JavaScript variable names (mathiasbynens.be)
91 points by mathias on Feb 21, 2012 | hide | past | favorite | 39 comments



Whilst this is a good novelty, please please please don't do this - ever!

As my father said "just because you can put your penis in a goat, doesn't mean you should".


It does sometimes make sense to have identifiers in non-English languages. If could be for a DSL, or it could be because the business logic concerns concepts which is not trivially translatable to english.


And this works right until a developer who doesn't speak the language will have to deal with that code, which will happen much sooner than you'd expect. Half of the fun is figuring out the meaning of variable names, the other half is figuring out how to type ß on a non-German keyboard.


Minor side note: I cannot for the life of me figure out why other operating systems won't borrow Apple's fantastic input scheme, in which this something as simple as a ß isn't a big deal. Need an emdash? Easy, option-shift-minus. Need an ñ? Easy, option-n-n. ß, ≠, ¡, ÷ or any number of other relatively common symbols? Easy. Most of them are even fairly mnemonic (e.g. ß is option-S, ¡ is option-1, ≠ is option-= and ÷ is option-/).


Lion made this even easier by stealing iOS's input scheme: Hold down a keyboard key for long enough and you can pick a special character out of a context pop out. îïíīįì šéē


I wish JS was better-suited to embedded DSLs. But without operator overloading, with required parens on function arguments, no (standard) method_missing, no atoms, and a limited set of characters for identifiers, it's pretty limited.


I agree that non ASCII identifiers are to be avoided, but they may be some exceptions, I have written code like this (in Go):

    type Polar struct {
        R, θ float
    }


First thing I think with that is : How the fuck can I make that symbol?

I'll load up google, then find unicode charts and locate this. So writing your variable name will take about 15 to 30 minutes. Thanks a lot


Not disagreeing with the sentiment, but if you’re using Windows, Linux, or OSX, you do have a searchable character map.

That fails when you don’t know the name of the character, in which case you can use something like Shapecatcher (http://shapecatcher.com/), but then how do you know whether it’s a Greek theta or a Coptic thethe or a Cherokee na or Cyrillic fita or Latin barred O?

Clearly our editing powers need to improve if we’re to feasibly use non–English-alphanumeric variable names.


If the variable name is Chinese, use an appropriate input method. Otherwise, maybe set up your keyboard with a compose key (and lowercase parens) http://canonical.org/~kragen/setting-up-keyboard.html and possibly install a bigger XCompose map so you can type Greek letters conveniently https://github.com/kragen/xcompose.


On Linux (and there's some similar utility for windows), there's a key sequence to enter arbitrary Unicode code points.


It's not per se entering the silly thing, it's figuring out which code it is.


Unless you have really, really, really good reasons, prefer radius and theta instead.


I tend to avoid that as inevitably when someone has to use the variable, it's a bugger to work out what to type unless you're a unicode whizz. I'd use "theta" instead.


Iunno, perhaps editors should just get better about supporting “special” characters. Programming language notation kinda sucks without proper symbols. Every time I type “->” or “<=” I have to sigh a little inside. Do we really need to be able to type code on 50-year-old typewriters?

Emacs is alright about it though. There are keybindings for entering Unicode characters by name or number, and for getting information about the character at the cursor. You can also use a TeX-like input mode where “\lambda” is automatically replaced with “λ”. But really, I’d rather we rethink input methods altogether.


Or you use compose or alt?


An Identifier is an IdentifierName that is not a ReservedWord.

In .NET CLR languages, you can use Unicode for identifiers like in JS, but an interesting side-effect of the 'common' aspect of the CLR is that you can use reserved keywords too. This is because reserved words in one language are not necessarily reserved words in another language.

Someone could write the following valid definition in VB.NET:

   Public Property ushort() AS Integer
And because it's a reserved keyword in C# you'd have to reference it using the '@' escape:

   foo.@ushort = 123;
(There are probably far more confusing examples than this)


For any one curious, 'ಠ' is pronounced as 'Ta' (Kannada language) :)


More descriptively, it's a aspirated unvoiced sub-apical palatal plosive.

If you wish to make the sound, position your tongue like you're trying to stick it down your throat. The bottom of the tongue should be touching the top of your mouth. Then, make a "tuh" sound. If you do it right, it should sound hollow and "harder" than a normal Englilsh "t" sound.


Without copying and pasting, how do I type this letter on OS X?


System Preferences > Language & Text > Input Sources > Enable: Kannada

The letter is SHIFT + ' (or just ") to yield ಠ.


Linux users just type <C-shift>uxxx, where xxx is the hex code point. (That actually works for anyone running X11).

Unfortunately, you apparently can't do it on OS X without bringing up a menu and/or changing your keyboard layout: http://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_code_...


Specifically this works only in GTK apps.


Not in my experience...


I’ve created a custom OS X keyboard layout that allows me to just press `⌥` + `O` to get `ಠ_ಠ`. Here it is: https://github.com/mathiasbynens/custom.keylayout/tree/maste...


Better not have any friends named Bjಠ_ಠrn.


The most legitimate use for this is for top-level namespaces, which need to be short or they'll junk up your code like crazy. jQuery already took $, and Underscore took _. Maybe 木, ϗ, _⃗, 个, î, 人, Ǝ (not ∃, that's illegal!), ℵ, 二, ℜ, 龍, ℕ, 八, Δ, 大, ʃ, ː, 卐, or as mentioned below, λ? ˀ is probably too obnoxious though.

For no particularly good reason, ☺ and ☠ are illegal. I think the Plan9 strategy of considering non-ASCII characters as identifier characters by default is probably a better one than changing the language grammar every time the Unicode standard revs.

(As mentioned in another comment, http://canonical.org/~kragen/setting-up-keyboard.html https://github.com/kragen/xcompose. The Chinese I copied and pasted from http://www.mdbg.net/chindict/chindict.php?page=radicals though.)


> Browsers support identifiers that unescape to a reserved word, so long as at least one character is escaped using a Unicode escape sequence.

i smell new xss exploits....


So who creates the λ functional JavaScript library?


I'll start:

    function λ(code) {
      return eval(
    	"function () {"+
    	"   var $=arguments;" +
    	"   return " + code + ";"
    	"}"
      );
    }

    var sum = map([1,2,3,4], λ("$[0] + $[1]"));
    

I'm not really serious, but I'd like eval-less version of this, very, very much.

    function(x,y) { return x*y; }
is so verbose.


It's a valid ruby method name!

  def ಠ_ಠ
    puts 'i like turtles'
  end


It's valid in Python 3 too.


The tutorial about "How to write unmaintanable code" would love this. They already have some hints about putting accents on "int i" and other subtileties like that

http://thc.org/root/phun/unmaintain.html


For those who like SQLite, it allows you to create tables and columns with zero length names (you have to quote) and it does indeed work correctly when you use them. This is valid:

CREATE TABLE ""("" "");

A zero length table name with one column with a zero length name having a type of a zero length name.


Works fine in PHP as well:

  php > $ಠ_ಠ = 1;
  php > echo $ಠ_ಠ;
  1

  php > $π = pi();
  php > echo $π;
  3.1415926535897931159979634685442

  php > function ಠ_ಠ() { echo 1; }
  php > ಠ_ಠ();
  1


Works in C# as well...


Yup, it does indeed work. http://jsfiddle.net/bJAed/


why shouldn't it be?


Because it's awesome!




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: