【问题标题】:JavaScript instanceof: can't define what instance of function's argument isJavaScript instanceof:无法定义函数参数的实例是什么
【发布时间】:2023-04-06 07:24:01
【问题描述】:

我还在学习 JavaScript,阅读书籍,使用 FireBug,进行实验。

我很惊讶并坚持下面的事情。

有函数声明:

    var t = function (args){
            ...
    }

假设它是可变参数。

我这样称呼它:

<body onload="t({to:100,from:0})">

可以通过调用得到from参数值:

args.from

typeof args.from 的结果是number
这看起来很正常。
注意:number 是小写

我对@9​​87654328@ 是什么实例感兴趣。
实际上,无法获取其实例值。
试过了:

args.from instanceof Number
args.from instanceof String
args.from instanceof Object
args.from instanceof Boolean

不是Number - 很奇怪
这不是Object - 很奇怪
不是String - 没关系
不是Boolean - 没关系
既不是 null 也不是 'undefined' - 看起来不错。

这是什么?

【问题讨论】:

  • 顺便说一句,这不是可变参数;它是一个普通的参数,恰好包含一个对象。
  • 是的,我知道,我写道,它是“假定的”可变参数,与 Java 相反,应该明确声明
  • 原始数字类型的值不是任何东西的“实例”。 instanceof 运算符用于对象值,而不是原始值...
  • ...所以,对于原始值使用typeof,对于对象值使用instanceof...

标签: javascript function arguments instanceof typeof


【解决方案1】:

这是一个原始数值。
它不是任何类的实例。

instanceof 只能在对象上返回 true(typeof 返回 "object""function")。

这与argsobject无关;你可以从4 instanceof Number得到同样的错误。

相比之下,new Number(4) 是包装原语4 的对象,所以typeof new Number(4) === "objectnew Number(4) instanceof Number === true

【讨论】:

  • 哦,是的,我刚刚意识到,number 这也是小写点
  • 从这里的要点是,你不应该在任何地方使用instanceof 进行严格的类型检查,就像 Java 一样。这根本不是 Javascript 适合的编程风格。使用duck typing 并记录预期的参数和接口。
  • @FrancisAvila- +1 指出在 javascript 中严格输入是不可靠的(一般意义上可能是不可能的)。最好只测试所需或预期的功能,然后从那里开始。
【解决方案2】:

通过了,from.to 是一个原始类型,所以你不能在它上面调用instanceof

如果您真的想使用instanceof 而不是typeof,请将其包装在Object 中:

var from = Object(args.from);
alert(from instanceof Number);   // true!

【讨论】:

  • 有趣的事情:typeof 结果 object 换行后小写。SLaks 已经解释过了)
  • @sergionni 是的,这是意料之中的。
  • @Alnitak 您的回答以其当前形式提出了一种反模式 - 将原始值包装在对象中,然后在它们上应用 instanceof。正确的方法是不对原始值使用instanceof 运算符,而是使用typeof。我指出这一点,因为在未来,一些没有经验的程序员可能会看到这个答案并得出错误的结论......
  • @ŠimeVidas 文本略有修改。但是有一个问题——如果你也期待非原始值怎么办?这不是转换为Object 然后使用instanceof 的情况吗?
  • @ŠimeVidas 现在我明白了,它是原始的,我明白,有时我需要一些对象属性来处理,所以需要包装
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 2012-06-25
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 2015-02-22
相关资源
最近更新 更多