Golang中WASM如何处理JavaScript的`||`逻辑运算符

Golang中WASM如何处理JavaScript的||逻辑运算符 请先回答以下问题再提交问题,谢谢!

你使用的 Go 版本是什么(go version)?

golang/go 主分支构建版本

go version devel +0c9be48a90 Wed Jun 20 04:38:48 2018 +0000 darwin/amd64

你做了什么?

我想知道如何在 Golang WASM 中实现 JavaScript 的逻辑运算符,例如 100 || 0 会返回 100,

我是否需要根据文档自己实现 or 函数来完成上述逻辑运算符操作:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators

func or(i ...js.Value) {
    ... 
}

谢谢!


更多关于Golang中WASM如何处理JavaScript的`||`逻辑运算符的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

Go编程语言已经包含了OR运算符。以下是您可以参考的运算符快速列表:https://www.tutorialspoint.com/go/go_operators.htm

我担心您对这门语言的基础知识完全不熟悉,建议您通过学习Go指南来补充知识:https://tour.golang.org/welcome/1

更多关于Golang中WASM如何处理JavaScript的`||`逻辑运算符的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


很抱歉,我从您最初的帖子中没有理解到这一点,但感谢您的澄清。据我了解,使用 Go 编写 WebAssembly 时,您只需编写有效的 Go 代码,然后将其编译为 WebAssembly。

请查看这篇文章中关于生成 Wasm 的部分:https://blog.gopheracademy.com/advent-2017/go-wasm/

我知道 Go 语言支持逻辑运算符 很抱歉没有详细描述我的问题 我的意思是,在使用 Go 主分支的最新代码编译后,难道当时还不支持 wasm 吗? 那么,我的问题是如何在此时实现 JavaScript 的 || 逻辑运算。这个运算现在是否已支持?我尝试使用 js.Newjs.Get 配合一些代码,但都失败了。 我需要自己实现一个 JavaScript 函数吗?

根据文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators,JavaScript 和 Go 语言的逻辑运算仍然存在差异。

在 Go WebAssembly (WASM) 中处理 JavaScript 的逻辑运算符时,由于 Go 和 JavaScript 的类型系统差异,确实需要自己实现相应的逻辑函数。JavaScript 的 || 运算符会返回第一个真值(truthy value),而 Go 的 || 运算符返回的是布尔值。

以下是一个实现 JavaScript 风格 || 逻辑运算符的示例:

package main

import (
    "syscall/js"
)

// or 函数模拟 JavaScript 的 || 运算符
// 返回第一个真值(truthy value),如果没有真值则返回最后一个值
func or(this js.Value, args []js.Value) interface{} {
    for _, arg := range args {
        if isTruthy(arg) {
            return arg
        }
    }
    
    // 如果没有真值,返回最后一个参数
    if len(args) > 0 {
        return args[len(args)-1]
    }
    
    return js.ValueOf(nil)
}

// isTruthy 判断一个 js.Value 是否为真值
func isTruthy(v js.Value) bool {
    // 处理不同的 JavaScript 类型
    switch v.Type() {
    case js.TypeUndefined, js.TypeNull:
        return false
    case js.TypeBoolean:
        return v.Bool()
    case js.TypeNumber:
        return v.Float() != 0 && !v.IsNaN()
    case js.TypeString:
        return v.String() != ""
    case js.TypeObject, js.TypeFunction, js.TypeSymbol:
        return true
    default:
        return true
    }
}

func main() {
    // 将 or 函数暴露给 JavaScript
    js.Global().Set("goOr", js.FuncOf(or))
    
    // 保持程序运行
    <-make(chan bool)
}

使用示例:

在 JavaScript 中调用这个函数:

// 模拟 JavaScript 的 100 || 0
console.log(goOr(100, 0)); // 输出: 100

// 模拟 JavaScript 的 0 || "hello"
console.log(goOr(0, "hello")); // 输出: "hello"

// 模拟 JavaScript 的 null || "default"
console.log(goOr(null, "default")); // 输出: "default"

// 模拟 JavaScript 的 false || true
console.log(goOr(false, true)); // 输出: true

对于 && 运算符的实现:

// and 函数模拟 JavaScript 的 && 运算符
func and(this js.Value, args []js.Value) interface{} {
    for _, arg := range args {
        if !isTruthy(arg) {
            return arg
        }
    }
    
    // 如果所有值都是真值,返回最后一个参数
    if len(args) > 0 {
        return args[len(args)-1]
    }
    
    return js.ValueOf(true)
}

对应的 JavaScript 调用:

// 模拟 JavaScript 的 100 && 0
console.log(goAnd(100, 0)); // 输出: 0

// 模拟 JavaScript 的 100 && 200
console.log(goAnd(100, 200)); // 输出: 200

这种实现方式确保了在 Go WASM 中能够正确处理 JavaScript 风格的逻辑运算符语义。

回到顶部