对于想了解isinstance的读者,本文将是一篇不可错过的文章,我们将详细介绍foo,barvstype,并且为您提供关于Array,ArrayConstructor,forinloop,typeo
对于想了解isinstance的读者,本文将是一篇不可错过的文章,我们将详细介绍foo,barvs type,并且为您提供关于Array, Array Constructor, for in loop, typeof, instanceOf_javascript技巧、c – int foo(type&bar);是一种不好的做法?、c# – 什么时候是obj.GetType().IsInstanceOfType(typeof(MyClass))是真的吗?、Cannot find an initializer for type '[(String)]' that accepts an argument list of type '(LazyForward的有价值信息。
本文目录一览:- isinstance(foo,bar)vs type(foo)是bar
- Array, Array Constructor, for in loop, typeof, instanceOf_javascript技巧
- c – int foo(type&bar);是一种不好的做法?
- c# – 什么时候是obj.GetType().IsInstanceOfType(typeof(MyClass))是真的吗?
- Cannot find an initializer for type '[(String)]' that accepts an argument list of type '(LazyForward
isinstance(foo,bar)vs type(foo)是bar
确实是一个语义问题。
直到最近,如果我必须对结构进行任何类型检查,我都会使用type(obj) is list
et。等 但是,自从加入SO以来,我已经注意到每个人(我是说
EVERYONE )都在使用它isinstance(obj,list)
。看来它们是同义词,并timeit
揭示了它们之间几乎相同的速度。
def a(): return type(list()) is listdef b(): return isinstance(list(),list)from timeit import timeittimeit(a)# 0.5239454597495582timeit(b)# 0.5021292075273176
实际上,甚至dis
同意他们是同义词,除了type is
的COMPARE_OP
from dis import disdis(a)# 2 0 LOAD_GLOBAL 0 (type) # 3 LOAD_GLOBAL 1 (list) # 6 CALL_FUNCTION 0 (0 positional, 0 keyword pair) # 9 CALL_FUNCTION 1 (1 positional, 0 keyword pair) # 12 LOAD_GLOBAL 1 (list) # 15 COMPARE_OP 8 (is) # 18 RETURN_VALUEdis(b)# 2 0 LOAD_GLOBAL 0 (isinstance)# 3 LOAD_GLOBAL 1 (list) # 6 CALL_FUNCTION 0 (0 positional, 0 keyword pair) # 9 LOAD_GLOBAL 1 (list) # 12 CALL_FUNCTION 2 (2 positional, 0 keyword pair) # 15 RETURN_VALUE
坦率地说,我的说法if type(foo) is list:
比起来更具可读性ifisinstance(foo,list):
,第一个基本上只是伪代码,第二个使用某些参数调用某些函数(每次我必须在toisinstance
或or中查找instanceof
)。它看起来不像是类型转换,也没有明确的方法来知道是否isinstance(a,b)
检查的b
是实例,a
反之亦然。
我从这个问题中了解到我们可以使用isinstance
它,因为它比继承更好。type(ClassDerivedFromList) islist
将失败,而isinstance(ClassDerivedFromList,list)
将成功。但是,如果我要检查什么始终是基本目标,那么我真正失去的是什么typeis
?
答案1
小编典典如果我正在检查什么永远是基本对象,那么我从打字中真正地失去的是什么?
好吧,很高兴在您的问题中提供完整的书面答案,因此您的答案是 什么
都不会丢失!isinstance()
正如您已经说过和引用过的,唯一必要的情况是检查给定类与另一个类的继承。type()
只能用于检查实例是否 完全
属于给定的基本类型。
Array, Array Constructor, for in loop, typeof, instanceOf_javascript技巧
注意: JavaScript 中数组不是 关联数组。 JavaScript 中只有对象 来管理键值的对应关系。但是关联数组是保持顺序的,而对象不是。
由于 for in 循环会枚举原型链上的所有属性,唯一过滤这些属性的方式是使用 `hasOwnProperty` 函数,因此会比普通的 for 循环慢上好多倍。
遍历(Iteration)
为了达到遍历数组的最佳性能,推荐使用经典的 for 循环。
var list = [1, 2, 3, 4, 5, ...... 100000000];
for(var i = 0, l = list.length; i console.log(list[i]);
}
上面代码有一个处理,就是通过 l = list.length 来缓存数组的长度。
虽然 length 是数组的一个属性,但是在每次循环中访问它还是有性能开销。 可能最新的 JavaScript 引擎在这点上做了优化,但是我们没法保证自己的代码是否运行在这些最近的引擎之上。
实际上,不使用缓存数组长度的方式比缓存版本要慢很多。
`length` 属性(The `length` property)
length 属性的 getter 方式会简单的返回数组的长度,而 setter 方式会截断数组。
var foo = [1, 2, 3, 4, 5, 6];
foo.length = 3;
foo; // [1, 2, 3]
foo.length = 6;
foo; // [1, 2, 3]