BigQuery JS UDF中instanceof Date行为不符合预期问题咨询
问题复现
CREATE TEMPORARY FUNCTION test() RETURNS BOOL LANGUAGE js AS """ const d = new Date(); return d instanceof Date; """; SELECT test();
返回
false(非预期结果)
原因说明
instanceof 运算符的核心判断逻辑是:检查右侧构造函数的prototype属性是否存在于左侧实例对象的原型链上。
上述代码运行在BigQuery的JavaScript UDF环境中,该环境存在上下文隔离机制:通过new Date()创建出的日期实例,其所属的构造函数和当前作用域下可直接访问的Date构造函数不是同一个引用,因此Date.prototype不在日期实例的原型链上,最终返回false。
解决方案
不依赖和上下文绑定的instanceof判断,改用可稳定读取对象内部类型标记的Object.prototype.toString.call()方法做类型校验即可:
CREATE TEMPORARY FUNCTION test() RETURNS BOOL LANGUAGE js AS """ const d = new Date(); return Object.prototype.toString.call(d) === '[object Date]'; """; SELECT test();
返回
true(符合预期结果)
内容的提问来源于stack exchange,提问作者Dave Templin
相关产品推荐
相关产品推荐

