项目作者: gopherjs

项目描述 :
GopherJS bindings for built-in JavaScript functions
高级语言: Go
项目地址: git://github.com/gopherjs/jsbuiltin.git
创建时间: 2015-09-04T16:19:59Z
项目社区:https://github.com/gopherjs/jsbuiltin

开源协议:BSD 2-Clause "Simplified" License

下载


Build Status GoDoc

jsbuiltin - Built-in JavaScript functions for GopherJS

JavaScript has a small number of built-in
functions

to handle some common day-to-day tasks. This package providers wrappers around
some of these functions for use in GopherJS.

It is worth noting that in many cases, using Go’s equivalent functionality
(such as that found in the net/url package)
may be preferable to using this package, and will be a necessity any time you
wish to share functionality between front-end and back-end code.

What is supported?

Not all JavaScript built-in functions make sense or are useful in a Go
environment. The table below shows each of the JavaScript built-in functions,
and its current state in this package.

Name Supported Comment
eval()
uneval()
isFinite() yes
isNaN() yes
parseFloat() TODO? See note below
parseInt() TODO? See note below
decodeURI() yes
decodeURIComponent() yes
encodeURI() yes
encodeURIComponent() yes
escape() deprecated circa 2000
Number() See note below
String() Use js.Object.String()
unescape() deprecated circa 2000
typeof operator yes
instanceof operator yes

Notes on unmplemented functions

  • eval(): Is there ever a need to eval JS code from within Go?
  • Number(): This requires handling a bunch of corner cases which don’t
    normally exist in a strictly typed language such as Go. It seems that anyone
    with a legitimate need for this function probably needs to write their own
    wrapper to handle the cases that matter to them.
  • parseInt() and parseFloat(): These could be added, but doing so
    will require answering some questions about the interfce. JavaScript has
    effectively two relevant data types (int and float) where Go has has 12.
    Deciding how to map JS’s parseInt() to Go’s (u?)int(8|16|32|64) types,
    and JS’s parseFloat() Go’s float(32|64) or complex(64|128) needs to
    be considered, as well as how to handle error cases (Go doesn’t have a NaN
    type, so any NaN result probably needs to be converted to a proper Go
    error). If this matters to you, comments and/or PRs are welcome.

Installation and Usage

Get or update this package and dependencies with:

  1. go get -u -d -tags=js github.com/gopherjs/jsbuiltin

Basic usage example

This is a modified version of the Pet example in the main GopherJS documentation,
to accept and return URI-encoded pet names using the jsbuiltin package.

  1. package main
  2. import (
  3. "github.com/gopherjs/gopherjs/js"
  4. "github.com/gopherjs/jsbuiltin"
  5. )
  6. func main() {
  7. js.Global.Set("pet", map[string]interface{}{
  8. "New": New,
  9. })
  10. }
  11. type Pet struct {
  12. name string
  13. }
  14. func New(name string) *js.Object {
  15. return js.MakeWrapper(&Pet{name})
  16. }
  17. func (p *Pet) Name() string {
  18. return jsbuiltin.EncodeURIComponent(p.name)
  19. }
  20. func (p *Pet) SetName(uriComponent string) error {
  21. name, err := jsbuiltin.DecodeURIComponent(uriComponent)
  22. if err != nil {
  23. // Malformed UTF8 in uriComponent
  24. return err
  25. }
  26. p.name = name
  27. return nil
  28. }